Causa

Causa

Eu tinha um disco de 500 GB com BTRFS no meu NAS. Recentemente adquiri um disco de 4 TB e queria usar apenas o novo disco, sem nenhum tempo de inatividade. Então corri btrfs replace start 1 /dev/sdb ., esperei terminar e desconectei o drive de 500GB.

Agora que perdi o acesso ao disco de 4 TB, quero recuperar todos os dados do disco substituído de 500 GB, mas a partição BTRFS nele não é mais reconhecida como tal. Tentei montá-lo normalmente, com -o degraded,, -o recovery,roaté tentei btrfs restoree btrfs check, e tudo falhou. Quais são minhas opções aqui?

Responder1

Esta é uma pergunta do passado, mas encontrei a mesma situação e responderei.
Executei btrfs replaceo sistema de arquivos RAID1 no debian bullseye (5.10.0-13-amd64) e recuperei no Manjaro (5.13.19-2) usando o procedimento a seguir.

Causa

Pelo menos para a versão 5.10 do kernel, o btrfs replacecomando eventualmente chama btrfs_scratch_superblocksa função neste local:GitHub
Esta função remove a "string mágica" dos superblocos do disco original.

Na verdade, obtive os seguintes resultados em meu ambiente:

# btrfs inspect-internal dump-super -F /dev/sdb1
superblock: bytenr=65536, device=/dev/sdb1
---------------------------------------------------------
csum_type       0 (crc32c)
csum_size       4
csum            0x7d4435b9 [DON'T MATCH]
bytenr          65536
flags           0x1
            ( WRITTEN )
magic           ........ [DON'T MATCH]

De acordo comWiki btrfs, "mágica" (= "string mágica") deve ser _BHRfS_M.

Procedimento de recuperação

Referindo-se What if I don't have wipefs at hand?noWiki btrfs, execute o seguinte em um shell.
Provavelmente é mais seguro executá-lo em um PC diferente daquele ao qual o disco substituído está conectado.

Reescreva o dispositivo e a localização do ponto de montagem para o seu ambiente.
(No meu ambiente, foi bem-sucedido como /dev/sdb1 !)

# # backup magic strings just in case
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024+64)) of=~/magic1
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024*1024+64)) of=~/magic2
# dd bs=1 count=8 if=/dev/sdb skip=$((256*1024*1024*1024+64)) of=~/magic3

# # write magic string
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((256*1024*1024*1024+64))

# btrfs device scan
# mkdir -p /mnt/before_replace
# mount -o degraded,ro /dev/sdb /mnt/before_replace

Não sou bom em inglês, desculpe se for difícil de ler. Mas espero que isso ajude outras pessoas na mesma situação.

informação relacionada