Consegui recuperar meus dados, embora não de forma trivial (alerta de spoiler: inclui editores hexadecimais e alguma engenharia reversa). Estou postando minha abordagem para referência futura.
Portanto, minha matriz RAID0 está quebrada devido a superblocos não correspondentes. Como não há redundância no RAID0, mdadm
não pode iniciar um array RAID0, a menos que todos os superblocos correspondam. Meus discos pareciam bem, mas os superblocos estavam fora de sincronia.
Solução: torne os superblocos iguais novamente.
Primeira ideia: A execução do comando acima recriará o array RAID exatamente como era antes, mas substituirá os superblocos atuais.
Avaliação da primeira ideia: arriscada. Não há garantia de que mdadm
recriará o array exatamente da mesma maneira que antes. Talvez eu esqueça alguns parâmetros, talvez mdadm
escreva em outros lugares além daqueles que eu quero, destruindo meu sistema de arquivos e dados subjacentes, ou até mesmo qualquer outra coisa.
Conclusão: má ideia.
Segunda ideia. Manipular superblocks usando um editor hexadecimal.
Prós:
- Estou no controle, a menos que eu cometa um erro estúpido, nenhuma alteração será feita nos bytes que não importam.
- Apenas os valores não correspondentes do superbloco serão modificados, portanto, o layout da matriz não será afetado.
Desafios:
- Onde está o superbloco escrito no disco?
- Como se parece?
- Posso identificar os bytes corretos e reconstruir a saída de
mdadm --examine
da leitura dos valores hexadecimais? - A alteração de atributos invalidará a soma de verificação do superbloco, como obtenho uma soma de verificação válida?
Acontece que esses desafios são fáceis de superar. Há uma ótima página no wiki linux-raid: link . Documenta o superbloco v1 e onde encontrá-lo em um disco. Para um superbloco v1.2, ele está localizado em 4K a partir do início do disco e é gravado no próximo 4K (porque é setorizado e novos discos usam setores 4K, embora o disco usado tenha setores de 512 bytes) .
Você também pode consultar o código-fonte do superbloco v1, que não é muito difícil de ler: link
Após uma análise cuidadosa, decidi sobre este plano:
-
Primeiro, faça o backup dos primeiros 8K de cada disco. Desta forma, posso sempre voltar ao estado original.
dd if = / dev / sdXY de = sdXY.backup bs = 1 contagem = 8K
-
Extraia os superblocos de todos os discos. Isso pode ser feito facilmente
dd if = / dev / sdXY de = sdXY.superblock bs = 1 contagem = 4K skip = 4K
-
Leia no superbloco em um editor hexadecimal. Eu achei que o link baseado na web era muito bom.
-
Modifique os atributos necessários, deixe a soma de verificação como está. Tenha cuidado ao modificar os timestamps. Um timestamp do linux leva 32 bits ou 4 bytes, em
mdadm
um registro de data e hora ocupa 64 bits ou 8 bytes. Não se esqueça de copiar os outros 4. O superbloco é de 256 bytes + 2 bytes para cada membro da matriz. Esses últimos bytes são uma sequência de ids ou funções de membros. -
Escreva o superbloco no disco.
dd if = sdXY.superblock de = / dev / sdXY bs = 1 contagem = 4K busca = 4K
-
Examine o superbloco com
mdadm --examine /dev/sdXY
. Ele mostrará que a soma de verificação é inválida, mas também mostrará a soma de verificação esperada. -
Modifique a soma de verificação para a correta. No editor hexadecimal, os bytes são invertidos, então '' 99 7F A4 1A
becomes
1A A4 7F 99 'no editor hexadecimal. -
Escreva o novo superbloco no disco com o mesmo comando do passo 5.
-
Repita para cada disco.
Quando os dois superblocos foram correspondidos, pude novamente iniciar o array. Eu verifiquei o sistema de arquivos e parecia estar limpo. Montei o sistema de arquivos e copiei tudo para um array RAID5, que também protegerei com um no-break em breve.
Eu tenho muita sorte e não vou esquecer esses momentos assustadores. Eu sempre mantive minha calma e continuei pensando em como poderia remontar a matriz.
Aconselho vivamente contra brincar com o seu array danificado antes de analisar cuidadosamente o problema. Além disso, escrevi meu plano antes de começar, para não pular um passo, resultando em risco de perda de dados.