Linux BTRFS - converte para único com falha na unidade

10

Uma pequena quantidade de história de fundo:

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

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

Recentemente, a quantidade de erros de leitura desta unidade aumentou, com sua condição piorando constantemente. O BTRFS está agora a começar 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 nenhuma redundância em uma única unidade. Infelizmente, parece não haver 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 single mode, mas não tenho certeza de onde os dados serão colocados. Como uma das unidades está falhando, eu gostaria de poder garantir que o BTRFS não apague todos os dados da boa unidade e coloque uma única cópia na unidade defeituosa - em vez disso, eu gostaria de simplesmente agir como se a outra unidade nunca existisse (como em converter de volta para a 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 devo fazer? Ajuda seria muito apreciada.

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

    
por eeeeeta 10.06.2016 / 21:01

2 respostas

9

Tudo bem, resolvi isso com a ajuda de este link do Trello . Caso alguém mais queira fazer isso, aqui está o procedimento.

Procedimento

De um array RAID1 de dois discos, um /dev/sda com defeito e outro /dev/sdc known-good:

  1. Desative a montagem automática desta matriz em /etc/fstab , reboot . Basicamente, queremos que o btrfs esqueça que esse array existe, já que há um bug em que ele ainda tentará usar uma das unidades se ela estiver desconectada.
  2. Agora que sua matriz está desmontada, execute:

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

    substituindo sda pelo nome do dispositivo com defeito. Isso faz com que o disco desacelere (você deve verificar isso no dmesg) e ficar inacessível ao kernel.

    Alternativamente : apenas retire a unidade do computador antes de inicializar! Eu escolhi não optar por este método, pois o acima funciona bem para mim.

  3. Monte sua matriz, com o modo -o degraded .
  4. Inicie uma operação de rebalanceamento com sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint . Isso reorganizará as extensões na unidade válida, 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 minha tinha ~ 700 GiB e rebalanceada a uma taxa de 1 1GiB por minuto). essa operação pode ser pausada e manterá a matriz on-line enquanto ocorre.
  5. Quando isso estiver concluído, você poderá emitir sudo btrfs device remove missing /mountpoint para remover o dispositivo com falha "ausente".
  6. Inicie um segundo rebalanceamento com sudo btrfs balance start -mconvert=dup /mountpoint para restaurar a redundância de metadados. Isso leva alguns minutos no meu sistema.
  7. Você está feito! Seu array agora está no modo single , com toda a redundância removida.
  8. Pegue o seu carro defeituoso do lado de fora e bata-o com um martelo.

Solução de problemas

  • Ajuda, o btrfs tentou gravar no meu disco defeituoso, errou e forçou-o a ler somente!
    • Você seguiu a etapa 1 e reinicializou antes de continuar? É provável que o btrfs ainda ache que a unidade que você girou está presente. A reinicialização fará com que o btrfs esqueça os erros e permitirá que você continue.
por 11.06.2016 / 12:05
5

Obrigado pela sua postagem. Eu tive a idéia de que eu poderia testar raid, colocar o drive fora do meu hotswap bay, usar outro drive e então colocar o drive raid de volta. Em retrospectiva, isso foi uma má idéia e agora eu preciso do meu hotswap bay. / p>

Aqui está o que eu encontrei. Como root:

# 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 do brtrfs levou-me à opção devid, levou um par tenta descobrir como os filtros funcionavam (inicialmente tentando devid = / dev / sdb1). Então, sua primeira tentativa será parecida com isso.

# 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

Então esta é a final que funcionou:

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

Espero que isso ajude alguém a sair.

    
por 05.01.2017 / 04:51