Como recuperar um sistema de arquivos btrfs com dois dispositivos idênticos

1

TL; DR: devido a uma longa história, recebi um sistema de arquivos RAID1 do Btrfs composto de dispositivos /dev/sde1 e /dev/sde1 (IDs 1 e 2). Btrfs não irá montar rw, dizendo que um dispositivo está faltando. Como faço para descobrir qual desses dispositivos é o trabalho para que eu possa remover o outro, e como eu adiciono a segunda unidade correta ( /dev/sdb1 )? Atualmente, a adição de uma unidade falha porque só posso montar somente leitura.

Eu tenho dois discos rígidos externos com Btrfs em RAID1 (espelho). A unidade A está bem, mas a unidade B recebeu milhões de erros durante uma limpeza regular. Durante o teste, o dispositivo B parece bem, então eu acho que eles ficaram fora de sincronia (o host é um laptop e pode sobreviver a uma queda de energia devido a sua bateria, mas as unidades não podem, então eu acho que um veio online antes do outro ou algo ). Eu queria reconstruir o espelho do dispositivo A no dispositivo B.

Após algumas pesquisas, percebi que o subcomando replace era a coisa a ser usada. Eu quero substituir o dispositivo B com, yup, dispositivo B. Naturalmente, eu tentei se o btrfs entende este comando:

btrfs replace start /dev/deviceB /dev/deviceB /mountpoint

Infelizmente isso não funcionou. A página man diz: "Em um sistema de arquivos ao vivo, [start] duplica [s] os dados para o dispositivo de destino que está atualmente armazenado no dispositivo de origem." Então passei o outro dispositivo disponível, porque ele pode duplicar a partir daí:

btrfs replace start /dev/deviceA /dev/deviceB /mountpoint

Eu deveria ter lido melhor a página man, porque mais tarde ela diz "Após a conclusão da operação, o dispositivo de origem é removido do sistema de arquivos." Então agora eu tenho um sistema de arquivos com apenas /dev/deviceB .

Mas nunca removeu o dispositivo original (corrompido) B.

Agora eu tenho essa situação:

$ btrfs device usage /mountpoint
/dev/sde1, ID: 1
   Device size:             3.64TiB
   Device slack:              0.00B
   Data,single:             1.00GiB
   Data,RAID1:              2.00TiB
   Data,DUP:               40.91GiB
   Metadata,single:         1.00GiB
   Metadata,RAID1:          5.00GiB
   Metadata,DUP:            3.00GiB
   System,single:          32.00MiB
   System,RAID1:           32.00MiB
   System,DUP:            128.00MiB
   Unallocated:             1.59TiB

/dev/sde1, ID: 2
   Device size:             3.64TiB
   Device slack:              0.00B
   Data,RAID1:              2.00TiB
   Metadata,RAID1:          5.00GiB
   System,RAID1:           32.00MiB
   Unallocated:             1.63TiB

(Onde /dev/sde1 é o dispositivo B. Eu sou capaz de montá-lo com -o degraded,ro .)

Como devo resolver essa situação?

Eu tentei adicionar o dispositivo A ( sdb1 ), mas isso falha, dizendo "ERRO: Erro ao adicionar dispositivo '/ dev / sdb1': Sistema de arquivos somente leitura". Não sei como proceder, pois não sei dizer qual ID de dispositivo é qual, portanto, remover (para permitir a montagem de rw) pode ser catastrófico. E eu não tenho certeza se remover um dispositivo é o melhor curso de ação neste momento. Talvez devesse (depois de descobrir qual ID de dispositivo é) usar replace com um ID de dispositivo como argumento?

O sistema de arquivos no dispositivo A não é mais reconhecido como Btrfs e, ao inspecioná-lo com um hexdumper, parece inválido: ele costumava conter a cadeia literal BTRFS em algum lugar perto do início (iirc logo após 0x10 000), mas não mais faz. Os dados ainda parecem estar lá, mas não o cabeçalho correto (os primeiros dados não-zero estão agora em 0x400 000).

    
por Luc 10.04.2018 / 18:54

1 resposta

1

Vou começar dando a ressalva habitual que é ignorada (também sou culpado) ... Faça o backup dos seus dados AGORA . É claro que se você tivesse espaço livre suficiente para fazer backup de seus dados, você apenas recriaria o sistema de arquivos, certo? E lembre-se que isso é uma arte e difícil de acertar, e é por isso que eu sugiro conversar com os caras do canal IRC btrfs no irc.freenode.net.

A primeira coisa que tentarei é recuperar o dispositivo A. Isso pode ser feito com btrfs rescue super-recover /dev/deviceA ou btrfsck --repair /dev/deviceA . Se um dos dois for bem-sucedido, você poderá limpar deviceB e adicioná-lo como um novo dispositivo (ou talvez substituir se deviceA ainda considerar sua invasão).

Caso contrário, em uma situação como essa, gosto de usar primeiro dm-snapshot para criar um instantâneo do dispositivo e trabalhar no instantâneo, para não piorar as coisas ruins. Às vezes, eu levo algumas tentativas para acertar a sequência do comando btrfs. Você precisará de muito espaço livre para o arquivo de instantâneo (baseado no que estou pensando 10-100G).

Olhando para a saída acima, devid 1 parece ser o que você deseja manter porque tem mais espaço usado do que devid 2 . Executar btrfs filesystem show também pode fornecer mais informações sobre qual unidade está faltando (procure o devid que não está listado ou que não tenha nenhum caminho de dispositivo próximo a ele). Certifique-se de que você não montou o btrfs como somente leitura, porque senão você não poderá fazer nenhuma gravação para corrigi-lo. Você pode tentar primeiro remover o dispositivo usando btrfs device delete missing /mountpoint e, se isso não funcionar, btrfs device remove 2 /mountpoint . Se isso falhar, tente converter blocos de RAID1 para single com btrfs balance -mconvert=single -sconvert=single -dconvert=single /mountpoint e tente a remoção do dispositivo novamente. Se alguma coisa for bem-sucedida, você poderá adicionar deviceA como um dispositivo e reconverter tudo de volta para RAID1 . E esses comandos de conversão podem levar muito tempo, então é necessária paciência.

    
por 23.06.2018 / 11:28