Linux BTRFS - converte para single com falha na unidade

12

Uma pequena quantidade de história de fundo:

Eu tenho um pequeno sistema de arquivos de mídia, no qual armazeno vários filmes e programas de TV usados ​​na minha configuração HTPC. Ele foi originalmente configurado, usando btrfs, em uma unidade externa de 1 TB WD.

Mais tarde, decidi comprar outra unidade, para fornecer a esse sistema de arquivos recursos de espelhamento RAID1. Esta unidade é um Seagate Barracuda (2 TB, BARRACUDA 7200.14 FAMILY). Infelizmente, essa não foi uma boa escolha de unidade. A unidade começou a desenvolver grandes quantidades de erros de leitura em breve, embora o BTRFS tenha sido capaz de corrigi-los.

Recentemente, a quantidade de erros de leitura nesta unidade aumentou, com sua condição piorando constantemente. O BTRFS está começando a falhar:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

Gostaria de remover a unidade defeituosa da matriz RAID1, voltando a não haver redundância em uma única unidade. Infelizmente, parece haver uma falta de documentação sobre como fazer isso.

Estou ciente de que é possível executar o seguinte:

sudo btrfs balance start -dconvert=single /media

para converter o perfil de dados para o singlemodo, mas não tenho certeza de onde os dados serão colocados. Como uma das unidades está falhando, eu gostaria de garantir que o BTRFS não apague devidamente todos os dados da boa unidade e coloque uma única cópia na unidade defeituosa - em vez disso, gostaria de simplesmente agir como se a outra unidade nunca tivesse existido (como em, converter novamente para minha configuração antiga)

Isso não funciona:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

O que eu devo fazer? A ajuda seria muito apreciada.

TL; DR: iniciado com 1 unidade no BTRFS single, adicionado outra unidade, feita RAID1, outra unidade agora está com erro, como eu retorno a apenas uma unidade (ESPECIFICAMENTE a boa e conhecida) com single?

eeeeeta
fonte
Atualização: tentar que dconvert=singleapenas um pedaço faça o que eu temia e exclua a cópia válida. :(
eeeeeta

Respostas:

11

Tudo bem, eu descobri com a ajuda deste link do Trello . Caso alguém mais queira fazer isso, aqui está o procedimento.

Procedimento

A partir de uma matriz RAID1 de dois discos, um /dev/sdacom defeito e outro /dev/sdcem bom estado:

  1. Desative a montagem automática dessa matriz em /etc/fstab, reinicie . Basicamente, queremos que o btrfs esqueça que essa matriz existe, pois há um erro em que ele ainda tentará usar uma das unidades se estiver desconectada.
  2. Agora que sua matriz está desmontada, execute:

    echo 1 | sudo tee /sys/block/sda/device/delete

    substituindo sdapelo nome do dispositivo com defeito. Isso faz com que o disco gire para baixo (você deve verificar isso no dmesg) e se torna inacessível ao kernel.

    Como alternativa : basta retirar a unidade do computador antes de inicializar! Eu escolhi não optar por esse método, pois o acima funciona bem para mim.

  3. Monte sua matriz, com o -o degradedmodo.
  4. Comece uma operação de reequilíbrio com sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Isso reorganizará as extensões na unidade em bom estado, convertendo-as em single(não RAID). Isso levará quase um dia para ser concluído, dependendo da velocidade da sua unidade e do tamanho da sua matriz. (a mina tinha ~ 700 GiB e reequilibrou a uma taxa de 1 bloco de 1 GiB por minuto) Felizmente, essa operação pode ser pausada e manterá a matriz on-line enquanto ocorrer.
  5. Feito isso, você pode sudo btrfs device remove missing /mountpointremover o dispositivo defeituoso 'ausente'.
  6. Inicie um segundo reequilíbrio com sudo btrfs balance start -mconvert=dup /mountpointpara restaurar a redundância de metadados. Isso leva alguns minutos no meu sistema.
  7. Você Terminou! Sua matriz agora está no singlemodo, com toda redundância removida.
  8. Leve o seu carro com defeito para fora e bata com um martelo.

Solução de problemas

  • Ajuda, o btrfs tentou gravar no meu disco defeituoso, errou e o forçou a ler!
    • Você seguiu a etapa 1 e reinicializou antes de continuar? É provável que o btrfs ainda pense que a unidade que você gerou está presente. A reinicialização fará com que o btrfs esqueça os erros e permitirá que você continue.
eeeeeta
fonte
2
Isso não funciona. Estou no Ubuntu 16.04 (Kernel 4.4). O dmesg diz que "os dispositivos ausentes (1) excedem o limite (0), a montagem gravável não é permitida". Portanto, estou preso na etapa "mount -o degraded"
HelloSam 03/10/16
@ HelloSam: Talvez isso seja um bug. Veja bbs.archlinux.org/viewtopic.php?id=210541
jaltek
Considere adicionar ,softdepois de cada um convert=para ignorar trechos que já tenham o perfil de destino (que devem ser todos eles).
Tom Hale
9

Obrigado pela sua postagem. Tive a ideia de testar o ataque, retirar a unidade do meu compartimento de hotswap, usar outra unidade e depois voltar a entrar no raid. Em retrospecto, essa era uma má idéia e agora preciso do meu compartimento de hotswap.

Aqui está o que eu encontrei. Como raiz:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

Observe o devid listado para cada unidade. O homem para o equilíbrio brtrfs me levou à opção devid, fiz algumas tentativas para descobrir como os filtros funcionavam (inicialmente tentando devid = / dev / sdb1). Portanto, sua primeira tentativa será algo parecido com isto.

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

O que me deu um erro.

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

Aqui está o erro do dmesg:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

Portanto, esta é a final que funcionou:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Espero que isso ajude alguém.

PG
fonte
Se você quiser substituir apenas uma unidade por outra, poderá fazê-lo usando btrfs replace.
Dma_k 26/05
Isso funcionou para mim há um ano, mais ou menos, mas hoje não funciona. Não importa o que eu escreva depois devid=, a única de dados resultante é colocado no aparelho 1.
YtvwlD
Verifique também -sconvertpara converter pedaços do sistema.
Tom Hale
Considere o uso |, em vez de ,como a página do manual para o equilíbrio diz:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale