Wie kann man ein abgestürztes Linux md RAID5-Array wiederherstellen?

17

Vor einiger Zeit hatte ich ein RAID5-System zu Hause. Eine der 4 Festplatten ist ausgefallen, aber nachdem sie entfernt und wieder eingesetzt wurde, schien es in Ordnung zu sein, und ich habe eine erneute Synchronisierung gestartet. Als es fertig war, stellte ich zu meinem Entsetzen fest, dass 3 von 4 Festplatten ausfielen. Ich glaube jedoch nicht, dass das möglich ist. Auf den Festplatten befinden sich mehrere Partitionen, die jeweils Teil eines anderen RAID-Arrays sind.

  • md0 ist ein RAID1-Array, das aus sda1, sdb1, sdc1 und sdd1 besteht.
  • md1 ist ein RAID5-Array, das aus sda2, sdb2, sdc2 und sdd2 besteht.
  • md2 ist ein RAID0-Array, das aus sda3, sdb3, sdc3 und sdd3 besteht.

md0 und md2 melden alle Festplatten, während md1 meldet, dass 3 fehlgeschlagen ist (sdb2, sdc2, sdd2). Ich verstehe, dass nicht nur die mittleren Partitionen verloren gehen sollten, wenn Festplatten ausfallen.

Zu diesem Zeitpunkt schaltete ich den Computer aus und steckte die Laufwerke aus. Seitdem habe ich diesen Computer mit einer kleineren neuen Festplatte verwendet.

Gibt es Hoffnung, die Daten wiederherzustellen? Kann ich mdadm irgendwie davon überzeugen, dass meine Festplatten tatsächlich funktionieren? Die einzige Festplatte, die wirklich ein Problem hat, ist sdc, aber auch diese wird von den anderen Arrays gemeldet.

Aktualisieren

Endlich hatte ich die Möglichkeit, die alten Festplatten anzuschließen und diese Maschine von SystemRescueCd zu booten. Alles oben wurde aus dem Gedächtnis geschrieben. Jetzt habe ich einige harte Daten. Hier ist die Ausgabe vonmdadm --examine /dev/sd*2

/dev/sda2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:40:48 2010
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b48835 - correct
         Events : 53204

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     0       8        2        0      active sync   /dev/sda2

   0     0       8        2        0      active sync   /dev/sda2
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdb2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b4894a - correct
         Events : 53205

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     1       8       18        1      active sync   /dev/sdb2

   0     0       0        0        0      removed
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdc2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48975 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     2       8       34        2      active sync   /dev/sdc2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdd2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48983 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     4       8       50        4      spare   /dev/sdd2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2

Es scheint, dass sich die Dinge seit dem letzten Start geändert haben. Wenn ich das richtig lese, funktionieren sda2, sdb2 und sdc2 und enthalten synchronisierte Daten und sdd2 ist frei. Ich erinnere mich noch genau, wie ich 3 ausgefallene Festplatten gesehen habe, aber das sind gute Neuigkeiten. Das Array funktioniert jedoch immer noch nicht:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S)
      1875194880 blocks

md126 : inactive sdd2[4](S)
      625064960 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

md0 scheint in md127 umbenannt worden zu sein. md125 und md126 sind sehr seltsam. Sie sollten ein Array sein, nicht zwei. Früher hieß das md1. md2 ist komplett weg, aber das war mein Swap, das ist mir egal.

Ich kann die verschiedenen Namen verstehen und es ist nicht wirklich wichtig. Aber warum ist ein Array mit 3 "Active Sync" -Datenträgern nicht lesbar? Und was ist los mit sdd2 in einem separaten Array?

Aktualisieren

Nach dem Sichern der Superblöcke habe ich Folgendes versucht:

root@sysresccd /root % mdadm --stop /dev/md125
mdadm: stopped /dev/md125
root@sysresccd /root % mdadm --stop /dev/md126
mdadm: stopped /dev/md126

So weit, ist es gut. Da sdd2 frei ist, möchte ich es noch nicht hinzufügen.

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing 
mdadm: cannot open device missing: No such file or directory
mdadm: missing has no superblock - assembly aborted

Anscheinend kann ich das nicht.

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2        
mdadm: /dev/md1 assembled from 1 drive - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S)
      1875194880 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

Das hat auch nicht funktioniert. Versuchen wir es mit allen Festplatten.

mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2
mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat                           
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
      2500259840 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

Kein Glück. Aufgrund dieser Antwort plane ich, Folgendes zu versuchen:

mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing
mdadm --add /dev/md1 /dev/sdd2

Ist es sicher?

Aktualisieren

Ich veröffentliche das Superblock-Parser-Skript, mit dem ich diese Tabelle in meinem Kommentar erstellt habe. Vielleicht findet es jemand nützlich. Danke für deine Hilfe.

stribika
quelle
Ich denke mdadm --re-addnicht, wonach du suchst. Haben Sie kürzlich einen Gedächtnistest durchgeführt? Haben Sie eine Protokollmeldung zum Array-Fehler?
Gilles 'SO- hör auf böse zu sein'
@ Gilles: Ich habe keine Protokolle vor dem Absturz, da sie auf dem fehlerhaften Array gespeichert wurden. Und ich glaube nicht, dass ich es mit der Standard-mdadm-Schnittstelle beheben kann. Jede Art von Operation, die eine erneute Synchronisierung beinhaltet, ist mit 1 von 4 Festplatten nicht möglich. Ich denke, die 3 "ausgefallenen" Datenträger enthalten genug Informationen, um alles wiederherzustellen. Zum Beispiel kann ich sie mit dd lesen. Das "gute" könnte nicht synchron sein. Ich werde einen Mem-Test durchführen, aber dieser Computer funktioniert jetzt einwandfrei mit einer neuen Festplatte.
Stribika
2
Haben Sie versucht, das Array anzuhalten und ein neues mit mdadm -A /dev/md1 /dev/sd{b,c,d}2(vielleicht --force) wieder zusammenzusetzen? (Wenn nicht, sichern Sie zuerst die Superblöcke.)
Gilles 'SO - hören Sie auf, böse zu sein'
@ Gilles: Ich habe meine Frage mit aktuellen Informationen aktualisiert. Was muss ich genau sichern? Die ersten paar Plattenblöcke oder gibt es ein spezielles Tool dafür?
Stribika
@stribika: Der Superblock ist der letzte vollständige 64-KB-Block, der an einer 64-KB-Grenze auf der Partition ausgerichtet ist. Ich habe keine Ahnung, wie /dev/sdd2in einem separaten Array trotz der gleichen UUID wie sein kann sd{a,b,c}2.
Gilles 'SO - hör auf böse zu sein'

Antworten:

12

Überprüfen Sie zuerst die Festplatten und führen Sie den Smart-Selbsttest durch

for i in a b c d; do
    smartctl -s on -t long /dev/sd$i
done

Es kann einige Stunden dauern, bis der Vorgang abgeschlossen ist. Überprüfen Sie jedoch den Teststatus jedes Laufwerks alle paar Minuten, z

smartctl -l selftest /dev/sda

Wenn der Status eines Datenträgers aufgrund von Lesefehlern als nicht abgeschlossen gemeldet wird, sollte dieser Datenträger beim erneuten Zusammenbau von md1 als unsicher eingestuft werden. Nach dem Selbsttest können Sie versuchen, Ihr Array wieder zusammenzusetzen. Wenn Sie besonders vorsichtig sein möchten, können Sie die Festplatten auch auf einen anderen Computer verschieben, bevor Sie fortfahren (nur im Fall eines fehlerhaften RAM / Controllers / usw.).

Kürzlich hatte ich genau diesen Fall. Ein Laufwerk ist ausgefallen, ich habe es erneut in das Array eingefügt, aber während der Wiederherstellung sind 3 von 4 Laufwerken insgesamt ausgefallen. Der Inhalt von / proc / mdadm war derselbe wie der von Ihnen (möglicherweise nicht in derselben Reihenfolge)

md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)

Aber ich hatte Glück und habe das Array damit wieder zusammengesetzt

mdadm --assemble /dev/md1 --scan --force

Anhand der von Ihnen angegebenen --examine-Ausgabe kann ich feststellen, dass folgendes Szenario eingetreten ist: sdd2 ist fehlgeschlagen, Sie haben es entfernt und neu hinzugefügt. Es wurde also ein Ersatzlaufwerk, das versucht, neu zu erstellen. Aber während der Wiederherstellung schlug sda2 fehl und dann schlug sdb2 fehl. Daher ist der Ereigniszähler in sdc2 und sdd2, die die letzten aktiven Laufwerke im Array sind, größer (obwohl sdd nicht die Möglichkeit hatte, neu zu erstellen, ist dies das veralteteste von allen). Aufgrund der Unterschiede in den Ereigniszählern ist --force erforderlich. Sie könnten das also auch versuchen

mdadm --assemble /dev/md1 /dev/sd[abc]2 --force

Abschließend denke ich, dass Sie versuchen sollten, das Array wie folgt neu zu erstellen, wenn der obige Befehl fehlschlägt:

mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing

Wenn Sie dies tun --create, ist das missingTeil wichtig. Versuchen Sie nicht, dem Array ein viertes Laufwerk hinzuzufügen, da dann der Aufbau beginnt und Sie Ihre Daten verlieren . Wenn Sie ein Array mit einem fehlenden Laufwerk erstellen, ändert sich der Inhalt nicht und Sie haben die Möglichkeit, eine Kopie an einer anderen Stelle abzurufen (raid5 funktioniert nicht wie raid1).

Wenn das Array dadurch nicht angezeigt wird, probieren Sie diese Lösung (Perl-Skript) hier aus. Erstellen Sie ein Array neu

Wenn Sie es endlich schaffen, das Array aufzurufen, wird das Dateisystem unsauber und möglicherweise beschädigt. Wenn eine Festplatte während der Neuerstellung ausfällt, wird erwartet, dass das Array stoppt und einfriert und keine Schreibvorgänge auf die anderen Festplatten ausführt. In diesem Fall sind zwei Festplatten ausgefallen. Vielleicht hat das System Schreibanfragen ausgeführt, die nicht abgeschlossen werden konnten. Es besteht also eine geringe Wahrscheinlichkeit, dass Sie Daten verloren haben, aber auch die Möglichkeit, dass Sie es nie bemerken :-)

bearbeiten: einige Klarstellungen hinzugefügt.

forcefsck
quelle
mdadm --assemble /dev/md1 /dev/sd[abc]2 --forcehat funktioniert. Vielen Dank. Du hast meine Daten gespeichert! :) Ich werde nicht versuchen, die vierte Festplatte hinzuzufügen, da die erste 3 nicht so gut ist, wie ich es vorher gedacht habe. Der Selbsttest ergab jeweils 10-20 unlesbare Blöcke. Ich fühle mich dumm, das nicht zuerst zu überprüfen.
Stribika
Vielen Dank für eine umfassende Antwort. Belohnt mit 50 Wiederholungen von mir.
0xC0000022L
Permute_array.pl hat großartig für mich funktioniert. Hinweis für andere Benutzer: Das Gerätearray, das voraussichtlich angezeigt wird, enthält alle Laufwerke, einschließlich aller leeren Laufwerke, die Sie möglicherweise entfernt haben.
"Wenn Sie --create ausführen, ist der fehlende Teil wichtig. Versuchen Sie nicht, ein viertes Laufwerk in das Array aufzunehmen, da dann der Aufbau beginnt und Sie Ihre Daten verlieren." - BS. Wenn du angegeben hast --assume-clean(hast du), wird es nicht.
Poige
1

Ich habe während der Benutzung viele Probleme gehabt mdadm, aber nie Daten verloren. Sie sollten diese --forceOption meiden oder sehr vorsichtig verwenden, da Sie sonst alle Ihre Daten verlieren können. Bitte posten Sie Ihre/etc/mdadm/mdadm.conf

Glendyr
quelle