Eu tenho uma configuração com o btrfs rodando em cima do mdadm raid6, pois o código RAID5/6 do btrfs ainda não está estável. Achei que dessa forma obteria os benefícios da captura instantânea e da soma de verificação com alguns obstáculos extras para percorrer, agora que realmente tenho que passar por esses obstáculos, estou tendo alguns problemas.
Esta manhã meu dmesg produziu este problema:
BTRFS error (device md2): bad tree block start, want 28789209759744 have 7611175298055105740
BTRFS info (device md2): read error corrected: ino 0 off 28789209759744 (dev /dev/md2 sector 55198191488)
BTRFS info (device md2): read error corrected: ino 0 off 28789209763840 (dev /dev/md2 sector 55198191496)
BTRFS info (device md2): read error corrected: ino 0 off 28789209767936 (dev /dev/md2 sector 55198191504)
BTRFS info (device md2): read error corrected: ino 0 off 28789209772032 (dev /dev/md2 sector 55198191512)
Esse é o tipo de coisa que poderia ter escapado silenciosamente se eu não tivesse usado o btrfs, então pelo menos me fez bem... então agora, devo ser capaz de descobrir qual disco está com problema e substituí-lo, certo?
Bem, o mdadm parece suportar apenas a determinação do disco com falha usando a ferramenta raid6check, tive que construí-lo a partir do código-fonte para fazê-lo funcionar no Debian, mas depois que fiz isso, parece que estou no negócio.
O único problema aqui é que esta ferramenta parece ser extremamente lenta, para digitalizar 1000 listras leva uns bons 3 minutos. Isso significa que a varredura das 15261512 faixas que compõem meu array levará mais de 31 dias. Eu gostaria de evitar isso, se possível. A verificação/reparo do mdadm é muito mais rápida, apenas cerca de 3 dias, mas não produz nenhuma informação útil sobre qual disco pode ser responsável por isso, então não quero exatamente usá-lo.
A ferramenta raid6check parece suportar a aceitação de um número de faixa - estou me perguntando se é possível calcular qual número de faixa passar para que eu possa verificar diretamente a parte relevante do disco.
Aqui estão as informações do raid6check para fins de referência, se ajudar:
layout: 2
disks: 8
component size: 8001427603456
total stripes: 15261512
chunk size: 524288
Obrigado, qualquer ideia será apreciada.
Responder1
Tudo bem, descobri uma maneira prática de fazer isso depois de conversar com JyZyXEL no #linux-raid no Freenode.
raid6check relata listras totais, então execute-o assim para ver as informações básicas sem executar um teste completo:
./raid6check /dev/md0 0 1
Você obterá algo assim:
layout: 2
disks: 8
component size: 8001427603456
total stripes: 15261512
chunk size: 524288
Verifique o total de setores em seu RAID usando fdisk -l /dev/md0:
Disk /dev/md2: 43.7 TiB, 48008565620736 bytes, 93766729728 sectors
Agora calcule setores por faixa:
total sectors / total stripes = 93766729728 / 15261512 = 6144
Agora é só dividir o setor com erro pelos setores por faixa:
error sector = 55198191488/6144 = 8984080
Agora execute um raid6check, tente incluir a área ao redor dele, pois isso não parece ser exato:
raid6check /dev/md0 8984000 1000
Para mim, isso produziu rapidamente muitos erros relevantes, todos apontando para o mesmo disco que poderia estar falhando:
Error detected at stripe 8984078, page 100: possible failed disk slot 1: 4 --> /dev/sdj1
Error detected at stripe 8984081, page 76: possible failed disk slot 4: 4 --> /dev/sdj1
A partir deste ponto, você pode agir de acordo, substituir o disco, executar testes SMART, usar o reparo automático do raid6check, etc.
Este pode não ser o método mais preciso, mas estou postando-o para o caso de ninguém mais ter uma ideia melhor e alguém estar procurando uma maneira que funcione no futuro.