Recupere dados RAID 5 após criar nova matriz em vez de reutilizar


35

Gente por favor me ajude - eu sou um novato com uma grande dor de cabeça na mão (situação perfeita de tempestade).

Eu tenho um disco rígido de 3 TB no meu ubuntu 11.04 configurado como invasão de software 5. Os dados foram copiados semanalmente em outro disco separado do disco rígido do computador até que isso falhou completamente e foi jogado fora. Alguns dias atrás, tivemos uma queda de energia e, após a reinicialização, minha caixa não montou o ataque. Na minha infinita sabedoria entrei

mdadm --create -f...

comando em vez de

mdadm --assemble

e não percebeu a farsa que eu havia feito até depois. Iniciou a matriz degradada e prosseguiu com a construção e sincronização, o que levou cerca de 10 horas. Depois que voltei, vi que o array estava funcionando com êxito, mas o ataque não é

Quero dizer, as unidades individuais estão particionadas (tipo de partição f8), mas o md0dispositivo não está. Percebendo horrorizado o que fiz, estou tentando encontrar algumas soluções. Apenas rezo para que --createnão sobrescreva todo o conteúdo do driver rígido.

Alguém poderia me ajudar com isso - os dados que estão no disco são muito importantes e únicos ~ 10 anos de fotos, documentos, etc.

É possível que especificar os discos rígidos participantes na ordem errada possa mdadmsubstituí-los? quando eu faço

mdadm --examine --scan 

Eu recebo algo como ARRAY /dev/md/0 metadata=1.2 UUID=f1b4084a:720b5712:6d03b9e9:43afe51b name=<hostname>:0

Curiosamente, o nome costumava ser 'raid' e não o host hame com: 0 anexado.

Aqui estão as entradas de configuração 'higienizadas':

DEVICE /dev/sdf1 /dev/sde1 /dev/sdd1

CREATE owner=root group=disk mode=0660 auto=yes

HOMEHOST <system>

MAILADDR root


ARRAY /dev/md0 metadata=1.2 name=tanserv:0 UUID=f1b4084a:720b5712:6d03b9e9:43afe51b


Here is the output from mdstat

cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid5 sdd1[0] sdf1[3] sde1[1]
1953517568 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>


fdisk shows the following:

fdisk -l

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000bf62e

Device Boot Start End Blocks Id System
/dev/sda1 * 1 9443 75846656 83 Linux
/dev/sda2 9443 9730 2301953 5 Extended
/dev/sda5 9443 9730 2301952 82 Linux swap / Solaris

Disk /dev/sdb: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de8dd

Device Boot Start End Blocks Id System
/dev/sdb1 1 91201 732572001 8e Linux LVM

Disk /dev/sdc: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00056a17

Device Boot Start End Blocks Id System
/dev/sdc1 1 60801 488384001 8e Linux LVM

Disk /dev/sdd: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ca948

Device Boot Start End Blocks Id System
/dev/sdd1 1 121601 976760001 fd Linux raid autodetect

Disk /dev/dm-0: 1250.3 GB, 1250254913536 bytes
255 heads, 63 sectors/track, 152001 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/dm-0 doesn't contain a valid partition table

Disk /dev/sde: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x93a66687

Device Boot Start End Blocks Id System
/dev/sde1 1 121601 976760001 fd Linux raid autodetect

Disk /dev/sdf: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe6edc059

Device Boot Start End Blocks Id System
/dev/sdf1 1 121601 976760001 fd Linux raid autodetect

Disk /dev/md0: 2000.4 GB, 2000401989632 bytes
2 heads, 4 sectors/track, 488379392 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk identifier: 0x00000000

Disk /dev/md0 doesn't contain a valid partition table

Por sugestões, eu limpei os superblocos e recriei a matriz com a --assume-cleanopção, mas sem sorte alguma.

Existe alguma ferramenta que me ajude a reviver pelo menos alguns dos dados? Alguém pode me dizer o que e como o mdadm --create faz quando sincronizado para destruir os dados, para que eu possa escrever uma ferramenta para desfazer o que foi feito?

Após a recriação do ataque, corro fsck.ext4 / dev / md0 e aqui está a saída

root @ tanserv: / etc / mdadm # fsck.ext4 / dev / md0 e2fsck 1.41.14 (22-Dez-2010) fsck.ext4: superbloco inválido, tentando blocos de backup ... fsck.ext4: número mágico ruim em super- bloquear ao tentar abrir / dev / md0

O superbloco não pôde ser lido ou não descreve um sistema de arquivos ext2 correto. Se o dispositivo é válido e realmente contém um sistema de arquivos ext2 (e não swap ou ufs ou algo mais), o superbloco está corrompido e você pode tentar executar o e2fsck com um superbloco alternativo: e2fsck -b 8193


Por sugestão de Shanes, tentei

root@tanserv:/home/mushegh# mkfs.ext4 -n /dev/md0
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
122101760 inodes, 488379392 blocks
24418969 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
14905 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

e execute fsck.ext4 com todos os blocos de backup, mas todos retornaram o seguinte:

root@tanserv:/home/mushegh# fsck.ext4 -b 214990848 /dev/md0
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Invalid argument while trying to open /dev/md0

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>

Alguma sugestão?

Saudações!


1
Talvez um dia as pessoas possam perceber por que o RAID5 é uma péssima idéia. Até lá, 1) as pessoas perderão dados. 2) Obteremos perguntas como estas.
Tom O'Connor

11
@ Tom O'Connor ... porque, claramente, o RAID5 é o culpado pelo erro do usuário. : rolleyes:
Reality Extractor

2
Felizmente, a resposta de Shane pode salvar os dados, mas, novamente, prova por que o RAID sozinho não é o melhor para armazenamento. Precisa de backups também. (mas +1 para a pergunta e resposta épica que resultou)
tombull89

4
Eu sei que isso se repete com frequência, mas o ataque não é uma solução de backup . A mensagem realmente precisa ir para casa.
Sirex

Respostas:


89

Ok - algo estava me incomodando sobre o seu problema, então eu iniciei uma VM para mergulhar no comportamento que deveria ser esperado. Vou entender o que estava me incomodando em um minuto; primeiro deixe-me dizer o seguinte:

Faça backup dessas unidades antes de tentar qualquer coisa !!

Você já pode ter causado danos além do que a ressincronização fez; você pode esclarecer o que quis dizer quando disse:

Por sugestões, eu limpei os superblocos e recriei o array com a opção --assume-clean, mas sem sorte alguma.

Se você executou um mdadm --misc --zero-superblock, deve ficar bem.

De qualquer forma, vasculhe alguns discos novos e pegue as imagens atuais exatas deles antes de fazer qualquer coisa que possa fazer mais gravação nesses discos.

dd if=/dev/sdd of=/path/to/store/sdd.img

Dito isto, parece que os dados armazenados nessas coisas são surpreendentemente resistentes a ressincronizações rebeldes. Continue lendo, há esperança, e este pode ser o dia em que atingi o limite de respostas.


O melhor cenário

Criei uma VM para recriar seu cenário. As unidades têm apenas 100 MB, então eu não esperaria uma eternidade em cada ressincronização, mas, caso contrário, essa seria uma representação bastante precisa.

Construiu o array da maneira mais genérica e padrão possível - blocos de 512k, layout simétrico à esquerda, discos em ordem alfabética. Nada de especial.

root@test:~# mdadm --create /dev/md0 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

Por enquanto, tudo bem; vamos criar um sistema de arquivos e colocar alguns dados nele.

root@test:~# mkfs.ext4 /dev/md0
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=512 blocks, Stripe width=1024 blocks
51000 inodes, 203776 blocks
10188 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2040 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
root@test:~# mkdir /mnt/raid5
root@test:~# mount /dev/md0 /mnt/raid5
root@test:~# echo "data" > /mnt/raid5/datafile
root@test:~# dd if=/dev/urandom of=/mnt/raid5/randomdata count=10000
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.706526 s, 7.2 MB/s
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Está bem. Temos um sistema de arquivos e alguns dados ("dados" datafilee 5 MB de dados aleatórios com esse hash SHA1 randomdata) nele; vamos ver o que acontece quando fazemos uma recriação.

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: <none>
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 21:07:06 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 21:07:06 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 21:07:06 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[2] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

A ressincronização terminou muito rapidamente com esses pequenos discos, mas ocorreu. Então aqui está o que estava me incomodando antes; sua fdisk -lsaída. Não ter um quadro de partição no mddispositivo não é um problema, é esperado. Seu sistema de arquivos reside diretamente no dispositivo de bloco falso, sem tabela de partição.

root@test:~# fdisk -l
...
Disk /dev/md1: 208 MB, 208666624 bytes
2 heads, 4 sectors/track, 50944 cylinders, total 407552 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk identifier: 0x00000000

Disk /dev/md1 doesn't contain a valid partition table

Sim, sem mesa de partição. Mas...

root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks

Sistema de arquivos perfeitamente válido, após uma ressincronização. Então isso é bom; vamos verificar nossos arquivos de dados:

root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Sólido - sem corrupção de dados! Mas isso é exatamente com as mesmas configurações, então nada foi mapeado de maneira diferente entre os dois grupos RAID. Vamos deixar isso de lado antes que tentemos quebrá-lo.

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1

Dando um passo atrás

Antes de tentarmos resolver isso, vamos falar sobre por que é difícil quebrar. O RAID 5 funciona usando um bloco de paridade que protege uma área do mesmo tamanho que o bloco em todos os outros discos da matriz. A paridade não está apenas em um disco específico, é girada em torno dos discos uniformemente para distribuir melhor a carga de leitura nos discos em operação normal.

A operação XOR para calcular a paridade é assim:

DISK1  DISK2  DISK3  DISK4  PARITY
1      0      1      1    = 1
0      0      1      1    = 0
1      1      1      1    = 0

Portanto, a paridade é espalhada entre os discos.

DISK1  DISK2  DISK3  DISK4  DISK5
DATA   DATA   DATA   DATA   PARITY
PARITY DATA   DATA   DATA   DATA
DATA   PARITY DATA   DATA   DATA

Uma ressincronização geralmente é feita ao substituir um disco morto ou ausente; isso também é feito mdadm createpara garantir que os dados nos discos estejam alinhados com a aparência da geometria do RAID. Nesse caso, o último disco na especificação da matriz é aquele que é 'sincronizado' - todos os dados existentes nos outros discos são usados ​​para a sincronização.

Portanto, todos os dados no disco 'novo' são apagados e reconstruídos; construindo novos blocos de dados a partir de blocos de paridade para o que deveria estar lá ou construindo novos blocos de paridade.

O legal é que o procedimento para essas duas coisas é exatamente o mesmo: uma operação XOR nos dados do restante dos discos. O processo de ressincronização nesse caso pode ter em seu layout que um determinado bloco deve ser um bloco de paridade e pensar que está construindo um novo bloco de paridade, quando na verdade está recriando um bloco de dados antigo. Portanto, mesmo que pense que está construindo isso:

DISK1  DISK2  DISK3  DISK4  DISK5
PARITY DATA   DATA   DATA   DATA
DATA   PARITY DATA   DATA   DATA
DATA   DATA   PARITY DATA   DATA

... pode ser apenas reconstruindo a DISK5partir do layout acima.

Portanto, é possível que os dados permaneçam consistentes, mesmo que a matriz tenha sido construída incorretamente.


Jogando um macaco nas obras

(não uma chave inglesa; o macaco inteiro)

Teste 1:

Vamos fazer a matriz na ordem errada! sdcentão sddentão sdb..

root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:06:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:06:34 2012
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:06:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

Ok, está tudo bem. Nós temos um sistema de arquivos?

root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>

Não! Por que é que? Porque enquanto os dados estão todos lá, estão na ordem errada; o que antes era 512KB de A, depois 512KB de B, A, B e assim por diante, agora foi embaralhado para B, A, B, A. O disco agora parece uma bobagem no verificador do sistema de arquivos, não será executado. A saída de mdadm --misc -D /dev/md1nos dá mais detalhes; Se parece com isso:

Number   Major   Minor   RaidDevice State
   0       8       33        0      active sync   /dev/sdc1
   1       8       49        1      active sync   /dev/sdd1
   3       8       17        2      active sync   /dev/sdb1

Quando deve ficar assim:

Number   Major   Minor   RaidDevice State
   0       8       17        0      active sync   /dev/sdb1
   1       8       33        1      active sync   /dev/sdc1
   3       8       49        2      active sync   /dev/sdd1

Então, está tudo muito bem. Substituímos um monte de blocos de dados por novos blocos de paridade neste período. Recrie, com a ordem correta agora:

root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:11:08 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:11:08 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:11:08 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks

Legal, ainda existe um sistema de arquivos lá! Ainda tem dados?

root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Sucesso!

Teste 2

Ok, vamos mudar o tamanho do pedaço e ver se isso nos deixa quebrados.

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:19 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:19 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:19 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>

Sim, sim, é mangueira quando configurada assim. Mas podemos nos recuperar?

root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:51 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:51 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:51 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Sucesso de novo!

Teste 3

Este é o que eu pensei que mataria dados com certeza - vamos fazer um algoritmo de layout diferente!

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --layout=right-asymmetric --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:32:34 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:32:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:32:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 1 [3/3] [UUU]

unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
Superblock has an invalid journal (inode 8).

Assustador e ruim - ele acha que encontrou algo e quer fazer alguma correção! Ctrl+ C!

Clear<y>? cancelled!

fsck.ext4: Illegal inode number while checking ext3 journal for /dev/md1

Ok, crise evitada. Vamos ver se os dados ainda estão intactos após ressincronizar com o layout errado:

root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:33:02 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:33:02 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:33:02 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Sucesso!

Teste 4

Vamos também provar que o zeramento do superbloco não é prejudicial rapidamente:

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Sim, não é grande coisa.

Teste 5

Vamos jogar tudo o que temos nele. Todos os 4 testes anteriores, combinados.

  • Ordem incorreta do dispositivo
  • Tamanho errado do pedaço
  • Algoritmo de layout errado
  • Superblocos zerados (faremos isso entre as duas criações)

Avante!

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 --layout=right-symmetric /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
      204672 blocks super 1.2 level 5, 64k chunk, algorithm 3 [3/3] [UUU]

unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1

O veredito?

root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 13/51000 files, 17085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

Uau.

Portanto, parece que nenhuma dessas ações corrompeu os dados de forma alguma. Fiquei bastante surpreso com esse resultado, francamente; Eu esperava chances moderadas de perda de dados na alteração do tamanho do bloco e alguma perda definitiva na alteração do layout. Eu aprendi algo hoje.


Então .. Como obtenho meus dados?

O máximo de informações que você tiver sobre o sistema antigo seria extremamente útil para você. Se você conhece o tipo de sistema de arquivos, se possui alguma cópia antiga /proc/mdstatcom informações sobre a ordem da unidade, algoritmo, tamanho do pedaço e versão dos metadados. Você tem os alertas de email do mdadm configurados? Se sim, encontre um antigo; caso contrário, verifique /var/spool/mail/root. Verifique ~/.bash_historyse a sua compilação original está lá.

Então, a lista de coisas que você deve fazer:

  1. Faça backup dos discos ddantes de fazer qualquer coisa !!
  2. Tente fscko md ativo e atual - você pode ter acabado de construir na mesma ordem de antes. Se você conhece o tipo de sistema de arquivos, isso é útil; use essa fsckferramenta específica . Se alguma das ferramentas oferecer alguma correção, não deixe, a menos que tenha certeza de que eles realmente encontraram o sistema de arquivos válido! Se uma fsckoferta for consertar algo para você, não hesite em deixar um comentário para perguntar se isso realmente está ajudando ou está prestes a destruir dados.
  3. Tente criar a matriz com parâmetros diferentes. Se você tem um antigo /proc/mdstat, pode apenas imitar o que ele mostra; caso contrário, você estará no escuro - tentar todas as diferentes ordens de unidade é razoável, mas verificar todos os tamanhos de bloco possíveis com todas as ordens possíveis é inútil. Para cada um, fscké preciso ver se você tem algo promissor.

Então é isso. Desculpe o romance, fique à vontade para deixar um comentário, se tiver alguma dúvida, e boa sorte!

nota de rodapé: menos de 22 mil caracteres; 8k + tímido do limite de comprimento


8
Essa é uma resposta incrível.
Antoine Benkemoun

3
Eu nem sei o que dizer ... BRAVO !!! Parabéns a Shane Madden. Vou fazer backup dos discos e começar com suas sugestões. Obrigado, não realmente um grande obrigado !!!
Brigadieren

3
Eu só ... uau. Resposta brilhante. Eu acho que a única resposta para quebrar o limite de 30.000 caracteres é o ensaio de Evan Andersons "How Does Subnetting Work".
precisa saber é o seguinte

3
Melhor resposta sobre SF sempre que eu estou preocupado.
usar o seguinte comando

14
Você, senhor, ganha na internet.
Mark Henderson

5

Se você tiver sorte, poderá ter algum sucesso ao recuperar seus arquivos com um software de recuperação que pode ler uma matriz RAID-5 quebrada. Recuperação de Assunção Zero é uma que eu tive sucesso antes.

No entanto, não tenho certeza se o processo de criação de uma nova matriz foi destruído e todos os dados, portanto esse pode ser um esforço de última chance.


Muito obrigado Mark. Vou tentar. Você sabe se ele modifica as unidades? Nesse caso, farei uma cópia do disco e também tentarei com outras ferramentas.
Brigadieren

@ Brigadieren - não, desculpe, eu não estou familiarizado o suficiente com os meandros de como o RAID5 funciona.
Mark Henderson

@ Brigadieren De acordo com a documentação do mdadm , o processo de criação não destruirá os dados, apenas ressincronizará - mas se escolher uma geometria que não corresponda ao seu original, poderá ter destruído os dados com a gravação de uma nova paridade. Se tiver algum tempo livre mais tarde, poderei ver como recriar sua situação em uma VM, para ver se consigo adicionar alguma ideia. Eu recomendo pegar cópias completas das unidades antes de tentar executar as etapas de recuperação que gravam nos discos; você pode querer obter unidades extras para fazer cópias.
Shane Madden

Só não tenho certeza do que causou a sincronização - o fato de a matriz ter sido degradada em primeiro lugar (devido a falta de energia) ou algo mais? Gostaria de saber se mdadm --create faz alguma distinção se eu especificar a ordem da unidade diferente do que foi originalmente fornecido?
Brigadieren

O @Brigadieren Sync sempre ocorre na criação.
Shane Madden

5

Eu tive um problema semelhante:
após uma falha de uma matriz RAID5 de software, dispensei mdadm --createsem dar --assume-cleane não consegui mais montar a matriz. Após duas semanas de escavação, finalmente restaurei todos os dados. Espero que o procedimento abaixo economize o tempo de alguém.

Longa história curta

O problema foi causado pelo fato de mdadm --createcriar uma nova matriz diferente da original em dois aspectos:

  • ordem diferente de partições
  • deslocamento de dados RAID diferente

Como foi mostrado na brilhante resposta de Shane Madden , mdadm --createnão destrói os dados na maioria dos casos! Depois de encontrar a ordem da partição e o deslocamento dos dados, eu poderia restaurar a matriz e extrair todos os dados dela.

Pré-requisitos

Eu não tinha backups dos superblocos RAID, então tudo que eu sabia era que era um array RAID5 em 8 partições criadas durante a instalação do Xubuntu 12.04.0. Possui um sistema de arquivos ext4. Outro conhecimento importante foi uma cópia de um arquivo que também foi armazenado na matriz RAID.

Ferramentas

O CD ao vivo do Xubuntu 12.04.1 foi usado para fazer todo o trabalho. Dependendo da sua situação, você pode precisar de algumas das seguintes ferramentas:

versão do mdadm que permite especificar o deslocamento de dados

sudo apt-get install binutils-dev git
git clone -b data_offset git://neil.brown.name/mdadm
cd mdadm
make

bgrep - pesquisando dados binários

curl -L 'https://github.com/tmbinc/bgrep/raw/master/bgrep.c' | gcc -O2 -x c -o bgrep -

hexdump, e2fsck, mount e uma calculadora hexadecimal - ferramentas padrão do repos

Comece com o backup completo

A nomeação de arquivos de dispositivos, por exemplo, /dev/sda2 /dev/sdb2etc., não é persistente; portanto, é melhor anotar os números de série de suas unidades fornecidos por

sudo hdparm -I /dev/sda

Em seguida, conecte um disco rígido externo e faça backup de todas as partições do seu array RAID desta maneira:

sudo dd if=/dev/sda2 bs=4M | gzip > serial-number.gz

Determinar o layout RAID5 original

Vários layouts são descritos aqui: http://www.accs.com/p_and_p/RAID/LinuxRAID.html
Para descobrir como as faixas de dados foram organizadas na matriz original, você precisa de uma cópia de um arquivo de aparência aleatória que você sabe que foi armazenado na matriz. O tamanho padrão do bloco atualmente usado por mdadmé de 512 KB. Para uma matriz de N partições, você precisa de um arquivo de tamanho pelo menos (N + 1) * 512 KB. Um jpeg ou vídeo é bom, pois fornece substrings relativamente únicos de dados binários. Suponha que nosso arquivo seja chamado picture.jpg. Lemos 32 bytes de dados nas posições N + 1, começando de 100k e incrementando em 512k:

hexdump -n32 -s100k -v -e '/1 "%02X"' picture.jpg ; echo
DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2
hexdump -n32 -s612k -v -e '/1 "%02X"' picture.jpg ; echo
AB9DDDBBB05CA915EE2289E59A116B02A26C82C8A8033DD8FA6D06A84B6501B7
hexdump -n32 -s1124k -v -e '/1 "%02X"' picture.jpg ; echo
BC31A8DC791ACDA4FA3E9D3406D5639619576AEE2E08C03C9EF5E23F0A7C5CBA
...

Em seguida, pesquisamos ocorrências de todas essas cadeias de caracteres em todas as nossas partições brutas, portanto, no total (N + 1) * N comandos, desta forma:

sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/sda2
sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/sdb2
...
sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/sdh2
/dev/sdh2: 52a7ff000
sudo ./bgrep AB9DDDBBB05CA915EE2289E59A116B02A26C82C8A8033DD8FA6D06A84B6501B7 /dev/sda2
/dev/sdb2: 52a87f000
...

Esses comandos podem ser executados em paralelo para diferentes discos. A digitalização de uma partição de 38 GB levou cerca de 12 minutos. No meu caso, todas as cadeias de 32 bytes foram encontradas apenas uma vez entre todas as oito unidades. Ao comparar as compensações retornadas pelo bgrep, você obtém uma imagem como esta:

| offset \ partition | b | d | c | e | f | g | a | h |
|--------------------+---+---+---+---+---+---+---+---|
| 52a7ff000          | P |   |   |   |   |   |   | 1 |
| 52a87f000          | 2 | 3 | 4 | 5 | 6 | 7 | 8 | P |
| 52a8ff000          |   |   |   |   |   |   | P | 9 |

Vemos um layout simétrico esquerdo normal , que é o padrão para mdadm. Mais importante, agora sabemos a ordem das partições. No entanto, não sabemos qual partição é a primeira na matriz, pois elas podem ser deslocadas ciclicamente.

Observe também a distância entre as compensações encontradas. No meu caso, era 512KB. O tamanho do pedaço pode realmente ser menor que essa distância; nesse caso, o layout real será diferente.

Localizar tamanho original do pedaço

Usamos o mesmo arquivo picture.jpgpara ler 32 bytes de dados em intervalos diferentes um do outro. Sabemos de cima que os dados no deslocamento 100k estão /dev/sdh2, no deslocamento 612k está em /dev/sdb2e em 1124k está em /dev/sdd2. Isso mostra que o tamanho do pedaço não é maior que 512 KB. Verificamos que não é menor que 512 KB. Para isso, despejamos a bytestring no deslocamento 356k e observamos em qual partição está:

hexdump -n32 -s356k -v -e '/1 "%02X"' P1080801.JPG ; echo
7EC528AD0A8D3E485AE450F88E56D6AEB948FED7E679B04091B031705B6AFA7A
sudo ./bgrep 7EC528AD0A8D3E485AE450F88E56D6AEB948FED7E679B04091B031705B6AFA7A /dev/sdb2
/dev/sdb2: 52a83f000

Está na mesma partição que o deslocamento 612k, o que indica que o tamanho do pedaço não é 256KB. Eliminamos tamanhos menores de pedaços da mesma maneira. Acabei com pedaços de 512 KB sendo a única possibilidade.

Encontre a primeira partição no layout

Agora sabemos a ordem das partições, mas não sabemos qual partição deve ser a primeira e qual deslocamento de dados RAID foi usado. Para encontrar essas duas incógnitas, criaremos uma matriz RAID5 com layout de bloco correto e um pequeno deslocamento de dados e procuraremos o início do nosso sistema de arquivos nessa nova matriz.

Para começar, criamos uma matriz com a ordem correta de partições, que encontramos anteriormente:

sudo mdadm --stop /dev/md126
sudo mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sdb2 /dev/sdd2 /dev/sdc2 /dev/sde2 /dev/sdf2 /dev/sdg2 /dev/sda2 /dev/sdh2

Verificamos que o pedido é obedecido emitindo

sudo mdadm --misc -D /dev/md126
...
Number   Major   Minor   RaidDevice State
   0       8       18        0      active sync   /dev/sdb2
   1       8       50        1      active sync   /dev/sdd2
   2       8       34        2      active sync   /dev/sdc2
   3       8       66        3      active sync   /dev/sde2
   4       8       82        4      active sync   /dev/sdf2
   5       8       98        5      active sync   /dev/sdg2
   6       8        2        6      active sync   /dev/sda2
   7       8      114        7      active sync   /dev/sdh2

Agora, determinamos as compensações das seqüências de caracteres N + 1 conhecidas na matriz RAID. Eu corro um script por uma noite (o Live CD não pede senha no sudo :):

#!/bin/bash
echo "1st:"
sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/md126
echo "2nd:"
sudo ./bgrep AB9DDDBBB05CA915EE2289E59A116B02A26C82C8A8033DD8FA6D06A84B6501B7 /dev/md126
echo "3rd:"
sudo ./bgrep BC31A8DC791ACDA4FA3E9D3406D5639619576AEE2E08C03C9EF5E23F0A7C5CBA /dev/md126
...
echo "9th:"
sudo ./bgrep 99B5A96F21BB74D4A630C519B463954EC096E062B0F5E325FE8D731C6D1B4D37 /dev/md126

Saída com comentários:

1st:
/dev/md126: 2428fff000 # 1st
2nd:
/dev/md126: 242947f000 # 480000 after 1st
3rd:                   # 3rd not found
4th:
/dev/md126: 242917f000 # 180000 after 1st
5th:
/dev/md126: 24291ff000 # 200000 after 1st
6th:
/dev/md126: 242927f000 # 280000 after 1st
7th:
/dev/md126: 24292ff000 # 300000 after 1st
8th:
/dev/md126: 242937f000 # 380000 after 1st
9th:
/dev/md126: 24297ff000 # 800000 after 1st

Com base nesses dados, vemos que a terceira string não foi encontrada. Isso significa que o pedaço em /dev/sdd2é usado para paridade. Aqui está uma ilustração das posições de paridade na nova matriz:

| offset \ partition | b | d | c | e | f | g | a | h |
|--------------------+---+---+---+---+---+---+---+---|
| 52a7ff000          |   |   | P |   |   |   |   | 1 |
| 52a87f000          | 2 | P | 4 | 5 | 6 | 7 | 8 |   |
| 52a8ff000          | P |   |   |   |   |   |   | 9 |

Nosso objetivo é deduzir de qual partição iniciar a matriz, a fim de mudar os blocos de paridade para o lugar certo. Como a paridade deve ser deslocada duas partes para a esquerda, a sequência da partição deve ser deslocada duas etapas para a direita. Portanto, o layout correto para esse deslocamento de dados é ahbdcefg:

sudo mdadm --stop /dev/md126
sudo mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sda2 /dev/sdh2 /dev/sdb2 /dev/sdd2 /dev/sdc2 /dev/sde2 /dev/sdf2 /dev/sdg2 

Neste ponto, nossa matriz RAID contém dados na forma correta. Você pode ter sorte, pois o deslocamento de dados RAID é o mesmo da matriz original e provavelmente será capaz de montar a partição. Infelizmente esse não foi o meu caso.

Verificar consistência dos dados

Verificamos que os dados são consistentes em uma faixa de pedaços extraindo uma cópia do picture.jpgarray. Para isso, localizamos o deslocamento da string de 32 bytes em 100k:

sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/md126

Subtraímos 100 * 1024 do resultado e usamos o valor decimal obtido no skip=parâmetro for dd. O count=é o tamanho picture.jpgem bytes:

sudo dd if=/dev/md126 of=./extract.jpg bs=1 skip=155311300608 count=4536208

Verifique se extract.jpgé o mesmo que picture.jpg.

Encontrar deslocamento de dados RAID

Uma nota lateral: o deslocamento de dados padrão para a mdadmversão 3.2.3 é 2048 setores. Mas esse valor foi alterado ao longo do tempo. Se a matriz original usou um deslocamento de dados menor do que o atual mdadm, então mdadm --createsem --assume-cleanpoderá sobrescrever o início do sistema de arquivos.

Na seção anterior, criamos uma matriz RAID. Verifique quais dados RAID compensaram, emitindo para algumas das partições individuais:

sudo mdadm --examine /dev/sdb2
...
    Data Offset : 2048 sectors
...

2048 setores de 512 bytes é 1 MB. Como o tamanho do pedaço é de 512 KB, o deslocamento atual dos dados é de dois pedaços.

Se, nesse ponto, você tiver um deslocamento de duas partes, provavelmente ele é pequeno o suficiente e você poderá pular este parágrafo.
Criamos uma matriz RAID5 com o deslocamento de dados de um bloco de 512 KB. Iniciar um pedaço anterior desloca a paridade um passo para a esquerda, assim compensamos deslocando a sequência da partição um passo para a esquerda. Portanto, para deslocamento de dados de 512 KB, o layout correto é hbdcefga. Usamos uma versão mdadmque suporta deslocamento de dados (consulte a seção Ferramentas). É compensado em kilobytes:

sudo mdadm --stop /dev/md126
sudo ./mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sdh2:512 /dev/sdb2:512 /dev/sdd2:512 /dev/sdc2:512 /dev/sde2:512 /dev/sdf2:512 /dev/sdg2:512 /dev/sda2:512

Agora, procuramos um superbloco ext4 válido. A estrutura do superbloco pode ser encontrada aqui: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block
Verificamos o início da matriz em busca de ocorrências do número mágico s_magicseguidas por s_statee s_errors. As sequências de caracteres a serem procuradas são:

53EF01000100
53EF00000100
53EF02000100
53EF01000200
53EF02000200

Comando de exemplo:

sudo ./bgrep 53EF01000100 /dev/md126
/dev/md126: 0dc80438

O número mágico inicia 0x38 bytes no superbloco, portanto, subtraímos 0x38 para calcular o deslocamento e examinar todo o superbloco:

sudo hexdump -n84 -s0xDC80400 -v /dev/md126
dc80400 2000 00fe 1480 03f8 cdd3 0032 d2b2 0119
dc80410 ab16 00f7 0000 0000 0002 0000 0002 0000
dc80420 8000 0000 8000 0000 2000 0000 b363 51bd
dc80430 e406 5170 010d ffff ef53 0001 0001 0000
dc80440 3d3a 50af 0000 0000 0000 0000 0001 0000
dc80450 0000 0000                              

Este parece ser um superbloco válido. s_log_block_sizeo campo em 0x18 é 0002, o que significa que o tamanho do bloco é 2 ^ (10 + 2) = 4096 bytes. s_blocks_count_loem 0x4 são 03f81480 blocos que são 254GB. Parece bom.

Agora, examinamos as ocorrências dos primeiros bytes do superbloco para encontrar suas cópias. Observe o byte invertido em comparação com a saída hexdump:

sudo ./bgrep 0020fe008014f803d3cd3200 /dev/md126
/dev/md126: 0dc80400    # offset by 1024 bytes from the start of the FS        
/dev/md126: 15c80000    # 32768 blocks from FS start
/dev/md126: 25c80000    # 98304
/dev/md126: 35c80000    # 163840
/dev/md126: 45c80000    # 229376
/dev/md126: 55c80000    # 294912
/dev/md126: d5c80000    # 819200
/dev/md126: e5c80000    # 884736
/dev/md126: 195c80000
/dev/md126: 295c80000

Isso se alinha perfeitamente às posições esperadas dos superblocos de backup:

sudo mke2fs -n /dev/md126
...
Block size=4096 (log=2)
...
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872

Portanto, o sistema de arquivos inicia no deslocamento 0xdc80000, ou seja, 225792KB desde o início da partição. Como temos 8 partições, sendo uma por paridade, dividimos o deslocamento por 7. Isso gera um deslocamento de 33030144 bytes em todas as partições, o que corresponde exatamente a 63 blocos RAID. E como o deslocamento de dados RAID atual é de um pedaço, concluímos que o deslocamento de dados original era de 64 blocos, ou 32768KB. Mudar hbdcefga63 vezes para a direita fornece o layout bdcefgah.

Finalmente construímos a matriz RAID correta:

sudo mdadm --stop /dev/md126
sudo ./mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sdb2:32768 /dev/sdd2:32768 /dev/sdc2:32768 /dev/sde2:32768 /dev/sdf2:32768 /dev/sdg2:32768 /dev/sda2:32768 /dev/sdh2:32768
sudo fsck.ext4 -n /dev/md126
e2fsck 1.42 (29-Nov-2011)
Warning: skipping journal recovery because doing a read-only filesystem check.
/dev/md126: clean, 423146/16654336 files, 48120270/66589824 blocks
sudo mount -t ext4 -r /dev/md126 /home/xubuntu/mp

Voilà!


Excelente explicação. Uma observação - 53EF00000100 não parece ser uma âncora válida para o cabeçalho EXT4. De acordo com ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block os dois bytes após 53EF poderia ser apenas 0100, 0200 ou 0400.
mate

0

Eu tive uma questão semelhante. Formatei e reinstalei minha unidade OS / boot com uma instalação limpa do Ubuntu 12.04, depois executei o comando mdadm --create ... e não consegui montá-lo.

Ele disse que não tinha um superbloco ou partição válido.

Além disso, quando parei o ataque mdadm, não consegui mais montar o dispositivo comum.

Consegui reparar o superbloco com mke2fs e e2fsck:

root@blackbox:~# mke2fs -n /dev/sdc1
mke2fs 1.42 (29-Nov-2011)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
91578368 inodes, 366284000 blocks
18314200 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
11179 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
  32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
  4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
  102400000, 214990848

Então correu:

e2fsck -b 32768 -y /dev/sdc1

Isso restaurou o superbloco para que eu pudesse montar e ler a unidade.

Para fazer o array funcionar sem destruir o superbloco ou partições que usei build:

mdadm --build /dev/md0 --level=mirror --assume-clean --raid-devices=2  /dev/sdc1 missing 

Depois de verificar os dados, adicionarei a outra unidade:

mdadm --add /dev/md0 /sdd1

0

Estou apenas atualizando algumas das informações fornecidas anteriormente. Eu tinha uma matriz RAID5 de 3 discos funcionando bem quando minha placa-mãe morreu. A matriz mantinha / dev / md2 como partição / home 1.2TB e / dev / md3 como partição / var 300GB.

Eu tinha dois backups de coisas "importantes" e um monte de coisas aleatórias que peguei de várias partes da internet pelas quais eu realmente deveria ter passado e despejado seletivamente. A maioria dos backups foi dividida em arquivos .tar.gz de 25 GB ou menos, e também foi copiada uma cópia separada do / etc.

O restante do sistema de arquivos foi mantido em dois pequenos discos RAID0 de 38 GB.

Minha nova máquina era semelhante ao hardware antigo, e eu a coloquei em funcionamento simplesmente conectando todos os cinco discos e selecionando um kernel genérico antigo. Portanto, eu tinha cinco discos com sistemas de arquivos limpos, embora não pudesse ter certeza de que os discos estavam na ordem certa e precisava instalar uma nova versão do Debian Jessie para ter certeza de que eu poderia atualizar a máquina quando necessário e resolver outros problemas. problemas

Com o novo sistema genérico instalado em dois discos Raid0, comecei a reunir as matrizes. Eu queria ter certeza de que tinha os discos na ordem certa. O que eu deveria ter feito era emitir:

mdadm --assemble /dev/md3 -o --no-degraded --uuid=82164ae7:9af3c5f1:f75f70a5:ba2a159a

Mas eu não fiz. Parece que o mdadm é bastante inteligente e, devido a um uuid, pode descobrir quais unidades vão aonde. Mesmo que o BIOS designe / dev / sdc como / sda, o mdadm o reunirá corretamente (embora YMMV).

Em vez disso, emiti: mdadm --create /dev/md2 without the --assume-cleane permiti que a ressincronização em / dev / sde1 fosse concluída. O próximo erro que cometi foi trabalhar em / dev / sdc1 em vez da última unidade no / dev / md2, / sde1. Sempre que o mdadm acha que há um problema, é a última unidade que é expulsa ou ressincronizada.

Depois disso, o mdadm não conseguiu encontrar nenhum superbloco e o e2fsck -n também não.

Depois de encontrar esta página, realizei o procedimento de tentar encontrar a sequência para as unidades (concluída), verificar dados válidos (verificados 6 MB de um arquivo de 9 MB), colocar os discos na sequência correta, cde, agarrar o uuid's do / md2 e / md3 do antigo /etc/mdadm.conf e tentou montar.

Bem, /dev/md3comecei e mdadm --misc -D /dev/md3mostrou três partições íntegras e os discos na ordem certa. /dev/md2também parecia bom, até que tentei montar o sistema de arquivos.

# mdadm --create /dev/md2 --raid-devices=3 --level=5 --uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/sdc1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sdd1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sde1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sde1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

O sistema de arquivos se recusou a ser montado e o e2fsck não conseguiu encontrar nenhum superbloco. Além disso, ao procurar por superblocos, conforme descrito acima, a contagem total de blocos encontrada como a880 0076 ou a880 0076 ou 5500 1176 não correspondia ao tamanho da capacidade do disco de 1199.79 relatou meu mdadm. Também nenhum dos locais dos "superblocos" está alinhado com os dados nas postagens acima.

Eu fiz backup de todo o / var e me preparei para limpar os discos. Para ver se era possível limpar apenas / md2, (eu não tinha mais nada a perder neste momento), discordo o seguinte:

root@ced2:/home/richard# mdadm --create /dev/md2 --raid-devices=3 --level=5 --uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/sdc1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sdd1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sde1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sde1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.
# mkfs.ext3 /dev/md2
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 292902912 4k blocks and 73228288 inodes
Filesystem UUID: a54e252f-78db-4ebb-b7ca-7dcd2edf57a4
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 


# hexdump -n84 -s0x00000400 -v /dev/md2
0000400 6000 045d 5800 1175 7799 00df 6ff0 112e
0000410 5ff5 045d 0000 0000 0002 0000 0002 0000
0000420 8000 0000 8000 0000 2000 0000 10d3 56b2
0000430 10d3 56b2 0002 ffff ef53 0001 0001 0000
0000440 0c42 56b2 0000 0000 0000 0000 0001 0000
0000450 0000 0000                              
0000454

#  ./bgrep 00605D0400587511 /dev/md2
/dev/md2: 00000400
/dev/md2: 08000000
/dev/md2: 18000000
/dev/md2: 28000000
/dev/md2: 38000000
/dev/md2: 48000000
/dev/md2: c8000000
/dev/md2: d8000000
/dev/md2: 188000000
/dev/md2: 288000000
/dev/md2: 3e8000000
/dev/md2: 798000000
/dev/md2: ab8000000
etc

Tudo parecia ok, exceto pela mudança para o uuid. Então, depois de mais algumas verificações, escrevi 600 GB de dados de backup em / dev / md2. Em seguida, desmontou e tentou montar novamente a unidade:

# mdadm --assemble /dev/md2 uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7
mdadm: cannot open device uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7: No such file or directory
mdadm: uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7 has no superblock - assembly aborted

Você está brincando comigo? e os meus 600 GB no arquivo?

# mdadm --assemble /dev/md2 
mdadm: /dev/md2 not identified in config file.

Ah - facilmente consertado. uma linha não comentada em /etc/mdadm.conf

# mdadm --assemble /dev/md2 
mdadm: /dev/md2 has been started with 3 drives.

# e2fsck -n /dev/md2
e2fsck 1.42.12 (29-Aug-2014)
/dev/md2: clean, 731552/73228288 files, 182979586/292902912 blocks

Yippie!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.