validação de estratégia de recuperação e recuperação de dados RAID0

0

Eu tenho uma expansão Synology (DX213) conectada ao meu NAS. Abriga 2 discos de 2TB e eles estão em uma configuração RAID0 (idéia horrível, eu sei e eu não preciso de um lembrete;)). No último final de semana, a matriz falhou e não consigo mais iniciar a matriz RAID.

Estou começando a acreditar que o problema se originou no backplane (o DX213) e não nos discos, porque eles parecem bem. Eles definitivamente não estão mortos (ainda). Eu tenho eles conectados a uma máquina linux e eu posso vê-los bem:

$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 1.8 TiB, 2000396746752 bytes, 3907024896 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000a85dd

Device     Boot   Start        End    Sectors  Size Id Type
/dev/sdb1           256    4980735    4980480  2.4G 83 Linux
/dev/sdb2       4980736    9175039    4194304    2G 82 Linux swap / Solaris
/dev/sdb3       9437184 3907024064 3897586881  1.8T 83 Linux

$ sudo fdisk -l /dev/sdc
Disk /dev/sdc: 1.8 TiB, 2000396746752 bytes, 3907024896 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0004dd4e

Device     Boot   Start        End    Sectors  Size Id Type
/dev/sdc1           256    4980735    4980480  2.4G 83 Linux
/dev/sdc2       4980736    9175039    4194304    2G 82 Linux swap / Solaris
/dev/sdc3       9437184 3907024064 3897586881  1.8T 83 Linux

Ao examinar os discos, mdadm ainda pode reconhecer o RAID Array e ambos os discos parecem estar em um estado limpo, mas os superblocos em ambos os discos estão claramente fora de sincronia.

$ sudo mdadm --examine /dev/sd[bc]3 
/dev/sdb3:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 1d7dd58f:dd7dd3d2:b646173b:afd51417
           Name : mist-nas:2
  Creation Time : Tue Nov 26 19:47:24 2013
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 3897584833 (1858.51 GiB 1995.56 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
   Unused Space : before=1968 sectors, after=0 sectors
          State : clean
    Device UUID : 46933df7:36901a5b:7a1239fe:e999c419

    Update Time : Sat Aug 27 20:14:12 2016
       Checksum : 42117b5b - correct
         Events : 8

     Chunk Size : 64K

   Device Role : Active device 0
   Array State : A. ('A' == active, '.' == missing, 'R' == replacing)

/dev/sdc3:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 1d7dd58f:dd7dd3d2:b646173b:afd51417
           Name : mist-nas:2
  Creation Time : Tue Nov 26 19:47:24 2013
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 3897584833 (1858.51 GiB 1995.56 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
   Unused Space : before=1968 sectors, after=0 sectors
          State : clean
    Device UUID : e4b60f4c:604b2e27:359cb71b:24453937

    Update Time : Tue Nov 26 19:47:24 2013
       Checksum : 997fa41a - correct
         Events : 4

     Chunk Size : 64K

   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

A única diferença é a data e hora da última atualização e a contagem de eventos. Eu sei que nenhuma operação de gravação estava em andamento quando a matriz foi desativada e os dois discos estão em um estado limpo, por isso estou bastante confiante de que ainda posso acessar meus dados. Para recuperar, eu terei que recriar o array ou mexer com o superbloco defeituoso e isso me dá arrepios, para dizer o mínimo ...

Eu clonei ambas as unidades com dd para novas unidades para ter um backup caso eu faça algo estúpido. No entanto, os novos drives têm um tamanho de setor de 4096 (eles são discos de 3 e 4 TB), enquanto os antigos têm um tamanho de setor de 512. O tamanho da partição sd [bc] 3 não é um múltiplo de 4096 setores. teve que arredondar o tamanho da partição para o próximo setor. Espero que isso não seja um problema?

O comando que estou pensando em executar é:

$ sudo mdadm --create --readonly --assume-clean --level=0 -n2 /dev/md2 /dev/sdb3 /dev/sdc3

Este comando provavelmente irá sobrescrever os superblocos atuais, por isso quero ter absoluta certeza de que isso não destruirá minhas chances de recuperar meus dados. Qual será o resultado desse comando?

Eu também gostaria de validar minha estratégia antes de realmente agir. Eu criei 2 partições de 4GB em uma chave USB, criei uma matriz RAID0 com elas, criei um sistema de arquivos EXT4 na matriz, montei e copiei alguns arquivos nela. A questão é como eu posso manipular o superbloco de uma das partições para recriar a situação que tenho com o array de 4 TB.

Eu estava pensando em usar um editor hexadecimal para manipular o superbloco manualmente, mas provavelmente também precisaria recalcular a soma de verificação. Como devo fazer isso?

    
por mstaessen 30.08.2016 / 10:30

2 respostas

0

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:

  1. 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

  2. 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

  3. Leia no superbloco em um editor hexadecimal. Eu achei que o link baseado na web era muito bom.

  4. 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.

  5. Escreva o superbloco no disco.

    dd if = sdXY.superblock de = / dev / sdXY bs = 1 contagem = 4K busca = 4K

  6. 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.

  7. 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.

  8. Escreva o novo superbloco no disco com o mesmo comando do passo 5.

  9. 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.

    
por 03.09.2016 / 16:00
0

Você deve remover a unidade da matriz, removê-la do sistema, testar novamente os discos e adicioná-la novamente à matriz.

Remova a unidade com falha da matriz com

mdadm --manage --set-faulty

Remova e insira novamente a unidade de / no sistema fisicamente (ou usando device delete e scsi host rescan).

Agora verifique se a unidade foi encontrada novamente e verifique se ela está funcionando corretamente. Você pode ver a saída do dmesg ou ver / proc / partitions. Execute um pv < no dispositivo.

Em seguida, adicione novamente a unidade à matriz com mdadm .

Em seguida, faça uma verificação final com cat /proc/mdstat para ver se você conseguiu.

    
por 30.08.2016 / 13:43