
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,ro
até tentei btrfs restore
e 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 replace
o 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 replace
comando eventualmente chama btrfs_scratch_superblocks
a 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.