Ripristina i dati RAID 5 dopo aver creato un nuovo array anziché riutilizzarli


35

Gente, per favore, aiutatemi: sono un principiante con un forte mal di testa a portata di mano (situazione di tempesta perfetta).

Ho un hdd da 3 1 TB sul mio Ubuntu 11.04 configurato come raid software 5. I dati sono stati copiati settimanalmente su un altro disco rigido separato dal computer fino a quando non si sono completamente guastati e sono stati eliminati. Qualche giorno fa abbiamo avuto un'interruzione di corrente e dopo aver riavviato la mia scatola non avrebbe montato il raid. Nella mia infinita saggezza sono entrato

mdadm --create -f...

comando invece di

mdadm --assemble

e non ho notato la parodia che avevo fatto fino a dopo. Ha iniziato l'array degradato e ha proceduto con la costruzione e la sincronizzazione che ha richiesto ~ 10 ore. Dopo che sono tornato, ho visto che l'array è correttamente attivo e funzionante, ma il raid no

Voglio dire che le singole unità sono partizionate (tipo di partizione f8) ma il md0dispositivo non lo è. Realizzando con orrore ciò che ho fatto, sto cercando di trovare alcune soluzioni. Prego solo che --createnon abbia sovrascritto l'intero contenuto del disco rigido.

Qualcuno potrebbe PER FAVORE aiutarmi con questo - i dati che sono sul disco sono molto importanti e unici ~ 10 anni di foto, documenti, ecc.

È possibile che specificando i dischi rigidi partecipanti nell'ordine sbagliato sia possibile mdadmsovrascriverli? quando io faccio

mdadm --examine --scan 

Ho qualcosa del tipo ARRAY /dev/md/0 metadata=1.2 UUID=f1b4084a:720b5712:6d03b9e9:43afe51b name=<hostname>:0

Un nome abbastanza interessante era "raid" e non l'host hame con: 0 aggiunto.

Ecco le voci di configurazione 'sanitized':

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

Per suggerimenti ho ripulito i superblocchi e ho ricreato l'array con l' --assume-cleanopzione ma senza fortuna.

Esiste uno strumento che mi aiuterà a recuperare almeno alcuni dei dati? Qualcuno può dirmi cosa e come fa mdadm --create quando si sincronizza per distruggere i dati in modo da poter scrivere uno strumento per annullare qualsiasi cosa sia stata fatta?

Dopo la ricostruzione del raid, corro fsck.ext4 / dev / md0 ed ecco l'output

root @ tanserv: / etc / mdadm # fsck.ext4 / dev / md0 e2fsck 1.41.14 (22-dic-2010) fsck.ext4: Superblock non valido, tentando blocchi di backup ... fsck.ext4: numero magico errato in super- blocco durante il tentativo di aprire / dev / md0

Il superblocco non può essere letto o non descrive un file system ext2 corretto. Se il dispositivo è valido e contiene davvero un filesystem ext2 (e non swap o ufs o qualcos'altro), allora il superblocco è corrotto e potresti provare a eseguire e2fsck con un superblocco alternativo: e2fsck -b 8193


Ho suggerito il suggerimento di Shanes

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

ed esegui fsck.ext4 con ogni blocco di backup ma tutti hanno restituito quanto segue:

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>

Eventuali suggerimenti?

Saluti!


1
Forse un giorno le persone potrebbero capire perché RAID5 è un'idea terribile. Fino ad allora, 1) le persone perderanno i dati. 2) Avremo domande come queste.
Tom O'Connor,

11
@Tom O'Connor ... perché chiaramente RAID5 è responsabile per l'errore dell'utente. : rolleyes:
Estrattore di realtà

2
Speriamo che la risposta di Shane possa salvare i dati, ma, ancora una volta, provare perché RAID da solo non è il migliore per l'archiviazione. Hai bisogno anche di backup. (ma +1 per la domanda e la risposta epica risultante)
tombull89

4
So che si ripete spesso, ma il raid non è una soluzione di backup . Il messaggio ha davvero bisogno di tornare a casa.
Sirex,

Risposte:


89

Ok - qualcosa mi infastidiva per il tuo problema, quindi ho avviato una VM per immergermi nel comportamento che ci si aspettava. Arriverò a quello che mi stava infastidendo in un minuto; prima lasciami dire questo:

Eseguire il backup di queste unità prima di provare qualsiasi cosa !!

Potresti aver già fatto un danno oltre a quello che ha fatto la risincronizzazione; puoi chiarire cosa intendevi quando hai detto:

Per suggerimenti ho ripulito i superblocchi e ho ricreato l'array con l'opzione --assume-clean ma senza fortuna.

Se hai eseguito un mdadm --misc --zero-superblock, allora dovresti stare bene.

Ad ogni modo, cerca alcuni nuovi dischi e acquisisci esattamente le loro attuali immagini prima di fare qualsiasi cosa che possa fare di più scrivendo su questi dischi.

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

Detto questo, sembra che i dati archiviati su queste cose siano incredibilmente resistenti alle risincronizzazioni ribelli. Continua a leggere, c'è speranza, e questo potrebbe essere il giorno in cui ho raggiunto il limite di lunghezza della risposta.


Lo scenario migliore

Ho creato una VM per ricreare il tuo scenario. Le unità sono solo 100 MB, quindi non aspetterei per sempre ad ogni risincronizzazione, ma altrimenti dovrebbe essere una rappresentazione abbastanza accurata.

Costruito l'array nel modo più generico e predefinito possibile: 512k blocchi, layout simmetrico sinistro, dischi in ordine di lettera .. niente di speciale.

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>

Fin qui tutto bene; creiamo un filesystem e mettiamo alcuni dati su di esso.

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

Ok. Abbiamo un filesystem e alcuni dati ("dati" dentro datafile, e 5 MB di dati casuali con quell'hash SHA1 dentro randomdata) su di esso; vediamo cosa succede quando facciamo una ricostruzione.

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>

La risincronizzazione si è conclusa molto rapidamente con questi piccoli dischi, ma si è verificato. Quindi, ecco cosa mi infastidiva da prima; la tua fdisk -luscita. Non avere alcuna tabella delle partizioni sul mddispositivo non è affatto un problema, è previsto. Il tuo filesystem risiede direttamente sul dispositivo a blocchi falsi senza tabella delle partizioni.

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

Sì, nessuna tabella delle partizioni. Ma...

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

File system perfettamente valido, dopo una risincronizzazione. Quindi va bene; controlliamo sui nostri file di dati:

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

Solido - nessuna corruzione dei dati! Ma questo ha le stesse identiche impostazioni, quindi nulla è stato mappato in modo diverso tra i due gruppi RAID. Lasciamo cadere questa cosa prima di provare a romperla.

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

Fare un passo indietro

Prima di provare a rompere questo, parliamo del perché è difficile da rompere. RAID 5 funziona utilizzando un blocco di parità che protegge un'area della stessa dimensione del blocco su ogni altro disco dell'array. La parità non è solo su un disco specifico, ma viene ruotata uniformemente attorno ai dischi per distribuire meglio il carico di lettura sui dischi durante il normale funzionamento.

L'operazione XOR per calcolare la parità è simile alla seguente:

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

Quindi, la parità viene distribuita tra i dischi.

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

Una risincronizzazione viene in genere eseguita quando si sostituisce un disco guasto o mancante; viene anche fatto mdadm createper assicurare che i dati sui dischi siano allineati con l'aspetto della geometria del RAID. In tal caso, l'ultimo disco nelle specifiche dell'array è quello "sincronizzato": tutti i dati esistenti sugli altri dischi vengono utilizzati per la sincronizzazione.

Quindi, tutti i dati sul "nuovo" disco vengono cancellati e ricostruiti; o costruendo nuovi blocchi di dati dai blocchi di parità per quello che avrebbe dovuto essere lì, oppure costruendo nuovi blocchi di parità.

La cosa interessante è che la procedura per entrambe queste cose è esattamente la stessa: un'operazione XOR attraverso i dati dal resto dei dischi. Il processo di risincronizzazione in questo caso potrebbe avere nel suo layout che un determinato blocco dovrebbe essere un blocco di parità e pensare che stia costruendo un nuovo blocco di parità, quando in realtà sta ricreando un vecchio blocco di dati. Quindi, anche se pensa che sta costruendo questo:

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

... potrebbe essere solo la ricostruzione DISK5dal layout sopra.

Pertanto, è possibile che i dati rimangano coerenti anche se l'array è stato creato in modo errato.


Lanciare una scimmia nelle opere

(non una chiave inglese; l'intera scimmia)

Test 1:

Facciamo l'array nell'ordine sbagliato! sdc, quindi sdd, quindi 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, va tutto bene. Abbiamo un filesystem?

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>

No! Perché? Perché mentre i dati sono tutti lì, è nell'ordine sbagliato; quello che una volta era 512 KB di A, quindi 512 KB di B, A, B e così via, ora è stato mischiato in B, A, B, A. Il disco ora sembra incoerente per il controllo del filesystem, non funzionerà. L'output di mdadm --misc -D /dev/md1ci fornisce maggiori dettagli; Sembra così:

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 dovrebbe apparire così:

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

Quindi, va tutto bene. Questa volta abbiamo sovrascritto un sacco di blocchi di dati con nuovi blocchi di parità. Ricrea, con il giusto ordine ora:

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

Bene, c'è ancora un filesystem lì! Hai ancora dati?

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

Successo!

Test 2

Ok, cambiamo le dimensioni del pezzo e vediamo se questo ci dà un po 'di rottura.

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>

Sì, sì, viene installato quando impostato in questo modo. Ma possiamo recuperare?

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

Di nuovo successo!

Test 3

Questo è quello che pensavo avrebbe ucciso sicuramente i dati: facciamo un algoritmo di layout diverso!

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

Spaventoso e cattivo - pensa di aver trovato qualcosa e vuole fare qualche aggiustamento! Ctrl+ C!

Clear<y>? cancelled!

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

Ok, crisi evitata. Vediamo se i dati sono ancora intatti dopo la risincronizzazione con il layout errato:

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

Successo!

Test 4

Dimostriamo anche che l'azzeramento del superblocco non è dannoso molto velocemente:

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

Sì, non è un grosso problema.

Test 5

Lanciamo tutto quello che abbiamo. Tutti e 4 i test precedenti, combinati.

  • Ordine del dispositivo errato
  • Dimensione del pezzo sbagliata
  • Algoritmo di layout errato
  • Superblocchi azzerati (lo faremo tra le due creazioni)

Onward!

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

Il verdetto?

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

Wow.

Quindi, sembra che nessuna di queste azioni abbia danneggiato i dati in alcun modo. Sono stato abbastanza sorpreso da questo risultato, francamente; Mi aspettavo una moderata probabilità di perdita di dati sulla modifica della dimensione del blocco e una certa perdita sulla modifica del layout. Ho imparato qualcosa oggi.


Quindi .. Come posso ottenere i miei dati ??

Tutte le informazioni che hai sul vecchio sistema ti sarebbero estremamente utili. Se conosci il tipo di filesystem, se hai delle tue vecchie copie /proc/mdstatcon informazioni su ordine dell'unità, algoritmo, dimensione del blocco e versione dei metadati. Hai impostato gli avvisi e-mail di mdadm? In tal caso, trovane uno vecchio; in caso contrario, controllare /var/spool/mail/root. Controlla ~/.bash_historyper vedere se la tua build originale è lì.

Quindi, l'elenco delle cose che dovresti fare:

  1. Eseguire il backup dei dischi con ddprima di fare qualsiasi cosa !!
  2. Prova fsckl'attuale md attivo: potresti esserti appena imbattuto nello stesso ordine di prima. Se conosci il tipo di filesystem, è utile; usa quello fsckstrumento specifico . Se uno qualsiasi degli strumenti offre di riparare qualcosa, non lasciarlo a meno che tu non sia sicuro di aver effettivamente trovato il filesystem valido! Se si fsckoffre di risolvere qualcosa per te, non esitare a lasciare un commento per chiedere se sta effettivamente aiutando o sta semplicemente per eseguire il nuke dei dati.
  3. Prova a costruire l'array con parametri diversi. Se hai un vecchio /proc/mdstat, allora puoi semplicemente imitare ciò che mostra; in caso contrario, allora sei un po 'al buio: provare tutti i diversi ordini di unità è ragionevole, ma controllare ogni possibile dimensione del blocco con ogni possibile ordine è inutile. Per ognuno, fsckper vedere se ottieni qualcosa di promettente.

Quindi è quello. Scusate il romanzo, sentitevi liberi di lasciare un commento se avete domande e buona fortuna!

nota a piè di pagina: meno di 22 mila caratteri; 8k + timido del limite di lunghezza


8
Questa è una risposta straordinaria.
Antoine Benkemoun l'

3
Non so nemmeno cosa dire ... BRAVO !!! Complimenti a Shane Madden. Ho intenzione di eseguire il backup dei dischi e iniziare con i tuoi suggerimenti. Grazie, no davvero un grande grazie !!!
Brigadieren,

3
Io ... wow. Risposta brillante. Penso che l'unica risposta per superare il limite di 30.000 caratteri sia il saggio "Come funziona la sottorete" di Evan Andersons.
tombull89,

3
La migliore risposta su SF mai per quanto mi riguarda.
Chopper3

14
Signore, vinci Internet.
Mark Henderson

5

Se sei fortunato potresti avere successo nel recuperare i tuoi file con un software di recupero in grado di leggere un array RAID-5 rotto. Zero Assumption Recovery è uno con cui ho avuto successo prima.

Tuttavia, non sono sicuro che il processo di creazione di un nuovo array sia andato e abbia distrutto tutti i dati, quindi questo potrebbe essere uno sforzo dell'ultima possibilità.


Grazie mille Marco. Ci proverò. Sai se modifica le unità? In tal caso, farò una copia del disco e proverò anche con altri strumenti.
Brigadieren,

@Brigadieren - no, scusa, non ho abbastanza familiarità con la complessità di come funziona RAID5.
Mark Henderson

@Brigadieren Secondo la documentazione di mdadm , il processo di creazione non distruggerà i dati, ma solo la risincronizzazione, ma se viene scelta una geometria che non corrisponde al tuo originale, potrebbe aver distrutto i dati con la scrittura di una nuova parità. Se avessi del tempo libero in seguito, potrei vedere come ricreare la tua situazione in una macchina virtuale, per vedere se posso aggiungere qualche informazione. Consiglio di prendere copie complete delle unità prima di tentare qualsiasi procedura di ripristino che scriva sui dischi - potresti voler cercare ulteriori unità per fare copie.
Shane Madden

Non sono sicuro di cosa abbia causato la sincronizzazione - il fatto che l'array sia stato degradato in primo luogo (a causa di un'interruzione dell'alimentazione) o qualcos'altro? Mi chiedo se mdadm --create fa qualche distinzione se specifico l'ordine di guida in modo diverso rispetto a quello originariamente indicato?
Brigadieren,

@Brigadieren La sincronizzazione si verifica sempre durante la creazione.
Shane Madden

5

Ho avuto un problema simile:
dopo un guasto di un array RAID5 software ho sparato mdadm --createsenza darlo --assume-cleane non ho più potuto montare l'array. Dopo due settimane di ricerche ho finalmente ripristinato tutti i dati. Spero che la procedura seguente salverà il tempo di qualcuno.

Per farla breve

Il problema era causato dal fatto che creava mdadm --createun nuovo array diverso dall'originale per due aspetti:

  • diverso ordine delle partizioni
  • diverso offset dei dati RAID

Come è stato mostrato nella brillante risposta di Shane Madden , mdadm --createnella maggior parte dei casi non distrugge i dati! Dopo aver trovato l'ordine delle partizioni e l'offset dei dati ho potuto ripristinare l'array ed estrarre tutti i dati da esso.

Prerequisiti

Non avevo backup dei superblocchi RAID, quindi sapevo solo che era un array RAID5 su 8 partizioni create durante l'installazione di Xubuntu 12.04.0. Aveva un filesystem ext4. Un'altra importante conoscenza era una copia di un file che era anche memorizzata nell'array RAID.

Utensili

Xubuntu 12.04.1 live CD è stato usato per fare tutto il lavoro. A seconda della situazione, potresti aver bisogno di alcuni dei seguenti strumenti:

versione di mdadm che consente di specificare l'offset dei dati

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

bgrep - ricerca di dati binari

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

hexdump, e2fsck, mount e una calcolatrice esadecimale - strumenti standard di repository

Inizia con il backup completo

La denominazione dei file del dispositivo, ad esempio /dev/sda2 /dev/sdb2ecc., Non è persistente, quindi è meglio annotare i numeri di serie delle unità forniti da

sudo hdparm -I /dev/sda

Quindi collegare un HDD esterno ed eseguire il backup di ogni partizione dell'array RAID in questo modo:

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

Determinare il layout RAID5 originale

Qui sono descritti vari layout: http://www.accs.com/p_and_p/RAID/LinuxRAID.html
Per scoprire come sono state organizzate strisce di dati sull'array originale, è necessaria una copia di un file dall'aspetto casuale che si sa che era memorizzato sull'array. La dimensione predefinita del blocco attualmente utilizzata da mdadmè 512 KB. Per una matrice di N partizioni, è necessario un file di dimensioni almeno (N + 1) * 512 KB. Un jpeg o un video sono buoni in quanto forniscono sottostringhe relativamente uniche di dati binari. Supponiamo che il nostro file sia chiamato picture.jpg. Leggiamo 32 byte di dati in posizioni N + 1 a partire da 100k e incrementando di 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
...

Quindi cerchiamo le occorrenze di tutte queste distruzioni su tutte le nostre partizioni grezze, quindi in totale (N + 1) * N comandi, in questo modo:

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

Questi comandi possono essere eseguiti in parallelo per diversi dischi. La scansione di una partizione da 38 GB ha richiesto circa 12 minuti. Nel mio caso, ogni stringa da 32 byte è stata trovata una sola volta tra tutte e otto le unità. Confrontando gli offset restituiti da bgrep si ottiene un'immagine come questa:

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

Vediamo un normale layout simmetrico a sinistra , che è predefinito per mdadm. Ancora più importante, ora conosciamo l'ordine delle partizioni. Tuttavia, non sappiamo quale partizione sia la prima nell'array, poiché possono essere spostate ciclicamente.

Nota anche la distanza tra gli offset trovati. Nel mio caso era 512 KB. La dimensione del blocco può effettivamente essere inferiore a questa distanza, nel qual caso il layout effettivo sarà diverso.

Trova le dimensioni del pezzo originale

Usiamo lo stesso file picture.jpgper leggere 32 byte di dati a intervalli diversi l'uno dall'altro. Sappiamo dall'alto che i dati all'offset 100k si trovano su /dev/sdh2, all'offset 612k è /dev/sdb2ae a 1124k a /dev/sdd2. Ciò dimostra che la dimensione del blocco non è maggiore di 512 KB. Verifichiamo che non è inferiore a 512 KB. Per questo dump del bytestring all'offset 356k e guardiamo su quale partizione si trova:

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

Si trova sulla stessa partizione dell'offset 612k, il che indica che la dimensione del blocco non è 256 KB. Eliminiamo dimensioni di pezzi più piccoli in modo simile. Ho finito con pezzi da 512 KB come unica possibilità.

Trova la prima partizione nel layout

Ora conosciamo l'ordine delle partizioni, ma non sappiamo quale partizione debba essere la prima e quale offset dei dati RAID sia stato utilizzato. Per trovare queste due incognite, creeremo un array RAID5 con il layout corretto del blocco e un piccolo offset dei dati, e cercheremo l'inizio del nostro file system in questo nuovo array.

Per cominciare, creiamo un array con l'ordine corretto delle partizioni, che abbiamo trovato in precedenza:

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

Verifichiamo che l'ordine venga rispettato mediante emissione

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

Ora determiniamo gli offset degli N + 1 noti bytestring nell'array RAID. Eseguo uno script per una notte (Live CD non richiede la password su 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

Uscita con commenti:

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

Sulla base di questi dati vediamo che la terza stringa non è stata trovata. Ciò significa che il blocco in /dev/sdd2viene utilizzato per parità. Ecco un'illustrazione delle posizioni di parità nel nuovo array:

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

Il nostro obiettivo è quello di dedurre da quale partizione avviare l'array, al fine di spostare i blocchi di parità nel posto giusto. Poiché la parità deve essere spostata di due blocchi verso sinistra, la sequenza di partizione dovrebbe essere spostata di due passi verso destra. Pertanto, il layout corretto per questo offset di dati è 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 

A questo punto il nostro array RAID contiene i dati nella forma giusta. Potresti essere fortunato in modo che l'offset dei dati RAID sia lo stesso dell'array originale e quindi molto probabilmente sarai in grado di montare la partizione. Purtroppo questo non era il mio caso.

Verificare la coerenza dei dati

Verifichiamo che i dati siano coerenti su una striscia di blocchi estraendo una copia picture.jpgdell'array. Per questo individuiamo l'offset per la stringa di 32 byte a 100k:

sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/md126

Quindi sottraggiamo 100 * 1024 dal risultato e utilizziamo il valore decimale ottenuto nel skip=parametro per dd. La count=dimensione è picture.jpgin byte:

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

Verifica che extract.jpgsia uguale a picture.jpg.

Trova Offset dati RAID

Un esempio: l'offset di dati predefinito per la mdadmversione 3.2.3 è di 2048 settori. Ma questo valore è stato modificato nel tempo. Se l'array originale utilizzava un offset di dati più piccolo di quello attuale mdadm, allora mdadm --createsenza è --assume-cleanpossibile sovrascrivere l'inizio del file system.

Nella sezione precedente abbiamo creato un array RAID. Verificare quali dati RAID sono stati compensati emettendo per alcune delle singole partizioni:

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

2048 settori a 512 byte è 1 MB. Poiché la dimensione del blocco è di 512 KB, l'offset di dati corrente è di due blocchi.

Se a questo punto hai un offset a due pezzi, probabilmente è abbastanza piccolo e puoi saltare questo paragrafo.
Creiamo un array RAID5 con l'offset dei dati di un blocco da 512 KB. L'avvio di un blocco precedente sposta la parità di un passo verso sinistra, quindi compensiamo spostando la sequenza di partizioni di un passo verso sinistra. Quindi per l'offset dei dati da 512 KB, il layout corretto è hbdcefga. Usiamo una versione mdadmche supporta l'offset dei dati (vedere la sezione Strumenti). Prende l'offset in kilobyte:

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

Ora cerchiamo un superblocco ext4 valido. La struttura del superblocco può essere trovata qui: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block
Analizziamo l'inizio dell'array alla ricerca di occorrenze del numero magico s_magicseguito da s_statee s_errors. Le indicazioni secondarie da cercare sono:

53EF01000100
53EF00000100
53EF02000100
53EF01000200
53EF02000200

Esempio di comando:

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

Il numero magico inizia 0x38 byte nel superblocco, quindi sottraiamo 0x38 per calcolare l'offset ed esaminare l'intero superblocco:

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                              

Questo sembra essere un superblocco valido. s_log_block_sizeil campo su 0x18 è 0002, il che significa che la dimensione del blocco è 2 ^ (10 + 2) = 4096 byte. s_blocks_count_loa 0x4 è 03f81480 blocchi che è 254 GB. Sembra buono.

Ora cerchiamo le occorrenze dei primi byte del superblocco per trovare le sue copie. Notare il lancio di byte rispetto all'output 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

Ciò si allinea perfettamente con le posizioni previste dei superblocchi di 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

Quindi il file system si avvia all'offset 0xdc80000, ovvero 225792 KB dall'inizio della partizione. Dato che abbiamo 8 partizioni di cui una per parità, dividiamo l'offset per 7. Ciò fornisce un offset di 33030144 byte su ogni partizione, che è esattamente 63 blocchi RAID. E poiché l'attuale offset dei dati RAID è un blocco, concludiamo che l'offset dei dati originale era di 64 blocchi, ovvero 32768 KB. Spostando hbdcefga63 volte a destra si ottiene il layout bdcefgah.

Finalmente costruiamo l'array RAID corretto:

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

Ecco!


Soluzione dettagliata. Una nota: 53EF00000100 non sembra essere un ancoraggio valido per l'intestazione EXT4. Secondo ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block i due byte dopo 53EF potrebbero essere solo 0100, 0200 o 0400.
matt

0

Ho avuto un problema simile. Ho formattato e reinstallato il mio sistema operativo / unità di avvio con un'installazione pulita di Ubuntu 12.04, quindi ho eseguito il comando mdadm --create ... e non sono riuscito a montarlo.

Diceva che non aveva un superblocco o una partizione validi.

Inoltre, quando ho fermato il raid di mdadm, non sono più riuscito a montare il dispositivo normale.

Sono stato in grado di riparare il superblocco con mke2fs ed 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

Quindi corse:

e2fsck -b 32768 -y /dev/sdc1

Ciò ha ripristinato il superblocco in modo da poter montare e leggere l'unità.

Per far funzionare l'array senza distruggere il superblocco o le partizioni che ho usato build:

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

Dopo aver verificato i dati, aggiungerò l'altra unità:

mdadm --add /dev/md0 /sdd1

0

Sto solo aggiornando alcune delle informazioni fornite in precedenza. Avevo un array raid5 a 3 dischi che funzionava bene quando la mia scheda madre è morta. L'array conteneva / dev / md2 come partizione / home 1.2 TB e / dev / md3 come partizione / var 300GB.

Avevo due backup di cose "importanti" e un mucchio di cose casuali che avevo preso da varie parti di Internet che avrei dovuto attraversare e scaricare selettivamente. La maggior parte dei backup è stata suddivisa in file .tar.gz di 25 GB o meno ed è stato eseguito il backup anche di una copia separata di / etc.

Il resto del filesystem era tenuto su due piccoli dischi raid0 da 38 GB.

La mia nuova macchina era simile al vecchio hardware e ho messo in funzione la macchina semplicemente collegando tutti e cinque i dischi e selezionando un vecchio kernel generico. Quindi avevo cinque dischi con filesystem puliti, anche se non potevo essere certo che i dischi fossero nell'ordine giusto e dovevo installare una nuova versione di Debian Jessie per essere sicuro di poter aggiornare la macchina quando necessario, e ordinare altri i problemi.

Con il nuovo sistema generico installato su due dischi Raid0, ho iniziato a rimettere insieme gli array. Volevo essere sicuro di avere i dischi nell'ordine giusto. Quello che avrei dovuto fare era emettere:

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

Ma non l'ho fatto. Sembra che mdadm sia piuttosto intelligente e dato un uuido, può capire quali unità vanno dove. Anche se il bios indica / dev / sdc come / sda, mdadm lo metterà insieme correttamente (YMMV però).

Invece ho emesso mdadm --create /dev/md2 without the --assume-clean:, e ho permesso il completamento della risincronizzazione su / dev / sde1. L'errore successivo che ho fatto è stato lavorare su / dev / sdc1 invece dell'ultima unità in / dev / md2, / sde1. Ogni volta che mdadm pensa che ci sia un problema, è l'ultimo disco che viene espulso o risincronizzato.

Dopodiché, mdadm non è riuscito a trovare alcun superblocco, e neanche e2fsck -n.

Dopo aver trovato questa pagina, ho seguito la procedura per cercare di trovare la sequenza per le unità (fatto), verificare la presenza di dati validi (verificati 6 MB di un file da 9 MB), ottenere i dischi nella giusta sequenza, cde, afferrare l'UUID di / md2 e / md3 dal vecchio /etc/mdadm.conf e ho provato a assemblare.

Bene, ha /dev/md3iniziato e ha mdadm --misc -D /dev/md3mostrato tre partizioni sane e i dischi nell'ordine giusto. /dev/md2sembrava anche buono, fino a quando ho provato a montare il filesystem.

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

Il filesystem ha rifiutato di essere montato e e2fsck non è riuscito a trovare alcun superblocco. Inoltre, quando si controllavano i superblocchi come descritto sopra, il conteggio totale dei blocchi trovato come a880 0076 o a880 0076 o 5500 1176 non corrispondeva alla dimensione della capacità del disco di 1199,79 riportata dal mio mdadm. Inoltre, nessuna delle posizioni dei "superblocchi" è stata allineata con i dati nei post precedenti.

Ho eseguito il backup di tutto / var e mi sono preparato per cancellare i dischi. Per vedere se era possibile cancellare solo / md2, (non avevo nient'altro da perdere a questo punto) non posso quanto segue:

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

Sembrava tutto ok, tranne il passaggio all'UUID. Quindi dopo un altro paio di controlli, ho scritto 600 GB di dati di backup su / dev / md2. Quindi, smontato e provato a reinstallare l'unità:

# 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

Ma stai scherzando? che dire dei miei 600 GB sul file?

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

Ah - facilmente risolvibile. una riga senza commento in /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!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.