ubuntuusers.de

Mdadm: Reshape gescheitert, Raid läuft noch

Status: Gelöst | Ubuntu-Version: Server 9.04 (Jaunty Jackalope)
Antworten |

MrMM

Anmeldungsdatum:
1. Oktober 2008

Beiträge: 24

Hallo Zusammen,

ich habe Gestern versucht mein Raid 5 von 5 auf 7 Festplatten zu erweitern. Nach sehr schlechten Erfahrungen habe ich diesmal die fabrikneuen Festplatten erstmal getestet und mit dd komplett mit 0 beschrieben und anschließend mich anschließen mit diff versichert dass auf beiden das gleiche drauf ist.

Anschließend habe ich die Platten entsprechend partitioniert, ins Raid aufgenommen und mit:

mdadm --grow --raid-devices=7 /dev/md1

Den reshape Prozess gestartet. Das ganze lief auch an aber jetzt habe ich folgende Meldung mit cat /proc/mdstat

md1 : active raid5 sdh1[0] sdc1[7](F) sdd1[8](F) sdi1[4] sde1[3] sdg1[2] sdf1[1]
      5860543744 blocks super 0.91 level 5, 64k chunk, algorithm 2 [7/5] [UUUUU__]

Interessanterweise kann ich trotzdem noch auf den Inhalt der Partition zugreifen.

Das kernel.log dazu ist im Anhang.

So wie ich es deute ist sdc direkt nach dem Start des reshape ausgestiegen und sdd einige Stunden später.

Welche Möglichkeiten habe ich jetzt diese wieder einzubinden? Könnte das hier funktionieren:

mdadm --remove /dev/md1 /dev/sdd
mdadm --re-add /dev/md1 /dev/sdd
kern.log (8.1 KiB)
Kernel log ab Start des Reshape
Download kern.log
detail raid (1.2 KiB)
Ausgabe von mdadm --detail --scan /dev/md1
Download detail raid

MrMM

(Themenstarter)

Anmeldungsdatum:
1. Oktober 2008

Beiträge: 24

Nachdem ich jetzt zumindest einen wahrscheinlichen Grund für den Ausstieg der Festplatten habe überlege ich wie ich das ganze vielleicht doch wieder zusammen setzten könnte.

Ich stelle hier einfach mal die Befehlsfolge die ich mir vorstelle zu Diskussion:

Zunächst müsste ich auf alle Fälle das Raid stoppen

mdadm --stop

Anschließend könnte ich md1 mit den Platten die bis zuletzt zusammen liefen wieder neu starten. sdc ist direkt nach dem start des reshape ausgefallen, sdd lief bis zur letzten Änderungen mit (das Dateisystem in ro gemountet):

mdadm --assemble /dev/md1 /dev/sd[d,e,f,g,h,i] --force

Alternativ:

mdadm --assemble /dev/md1 /dev/sd[e,f,g,h,i] --force
mdadm --add /dev/md1 /dev/sdd

Was ich nicht weiß ist ob jetzt der reshape automatisch wieder anspringt. Gibt es eine Möglichkeit so etwas zu simulieren? Ich habe leider im Moment keinen Rechner mit unpartitionierten Festplattenbereichen zur Verfügung.

MrMM

(Themenstarter)

Anmeldungsdatum:
1. Oktober 2008

Beiträge: 24

Ich hab das jetzt mal mittels einem aus USB Sticks aufgesetzten Raid Systems simuliert. Die Dev Größe ist so nur 128MB, aber da sollte dem Zweck genügen.

Zunächst habe ich ein Raid 5 aus 5 Partitionen erstellt, darin wie beim Original einen Luks Container installiert, in diesen ein ext4. Dieses habe ich mit einigen Daten bestückt. Teils Nullen und aus Neugierde ein Video.

Im Anschluss habe ich zwei weitere Partitionen hinzugefügt und das Raid auf diese ausgedeht.

Die erste der beiden neuen Partitionen habe ich direkt nach dem start auf faulty gesetzt.

mdadm /dev/md0 --fail /dev/sdc3

Die zweite nachdem rund 10% kopiert waren, wiederum analog zum eigentlich System.

Das Ergebnis ist das selbe wie im großen System, die ersten paar Prozent sind Schrott, der hintere Teil der Partition ist auslesbar. Mittels dd_rescue kann ich auch sehr genau eingrenzen ab wann keine Fehler mehr auf der Platte sind. Diesen Wert muss man sich jetzt merken da er später nicht mehr ermittelt werden kann.

Im folgenden Schritt habe ich getestet ob es möglich ist das Raid zu stoppen und im Anschluss wieder neu zusammen zu setzen. Mittels Assemble war das wie erwartet nicht möglich. Create mit assume-clean erfüllt hingegen seinen Zweck.

mdadm --create /dev/md1 --auto=yes --level=5 --raid-devices=7 /dev/sdd1 /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2 /dev/sdb3 missing --assume-clean

Hier muss unbedingt die richtige Reihenfolge eingehalten werden. Falls z.B. sdc3 länger durchgehalten hätte müsste hier stehen

mdadm --create /dev/md1 --auto=yes --level=5 --raid-devices=7 /dev/sdd1 /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2 missing /dev/sdc3 --assume-clean

Nach dem Neustart mit 7 Raid Devices ist nun plötzlich nicht mehr der hintere Teil sondern der vordere Teil der Festplatte auslesbar. Ist ja auch logisch, nur dieser ist auf 7 Platten verteilt. Diesen habe ich per dd in eine temporäre Datei auf der Systemplatte kopiert. Dank dem vorherigen dd_rescue weiß ich ab bis wann diese Daten in etwa in Ordung sind:

dd if=/dev/mapper/luks of=/pfad/tempfile bs=1M count=[geschaffe Datenmenge bis zum Abbruch]

Ich Anschluss habe ich das Raid wieder in der Konfigration vor dem Reshape zusammen gesetzt:

mdadm --create /dev/md1 --auto=yes --level=5 --raid-devices=5 /dev/sdd1 /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2 --assume-clean

Hier sind wieder die hinteren 90% korrekt, aber nicht lesbar, da im ersten Teil der ja diverse wichtige Infos stecken.

Diese Teil kopiere ich nun wieder in den Luks Container:

dd if=/pfad/tempfile of=/dev/mapper/luks

und siehe da das ganze lässt sich mounten und die Testdatei am Ende ist laut diff noch mit dem Original identisch.

Zugegeben, das ganze ist ein ganz übler Hack, aber so könnte ich zumindest weit über 90% der Daten und insbesondere die neuen Daten retten von denen es kein Backup gibt.

Hat jemand eine bessere Alternative? Ist es vielleicht sogar möglich irgendwie den reshape neu anzustoßen? Ansonsten werde ich das am kommenden Wochenende so versuchen und dann darüber berichten.

Bevor ich die Platten neuen Platten eingebunden habe habe ich sie um sie zu testen komplett mit Nullen eingebunden. Für eine Idee wie ich das ausnutzten kann um die möglichst genaue Datenmenge die ich vom Raid mit 7 auf das Raid mit 5 Platten kopieren muss wäre ich auch sehr dankbar.

MrMM

(Themenstarter)

Anmeldungsdatum:
1. Oktober 2008

Beiträge: 24

So, statt der sehr unbefriedigenden Lösung es mit Verlust zusammenzustückeln habe ich jetzt doch noch eine besser Lösung gefunden.

Die Lösung ist ein Downgrade von: mdadm - v2.6.7.1 - 15th October 2008

Auf Version: mdadm - v2.6.4 - 19th October 2007

In dieser Version ist es möglich das Raid zu stoppen und anschließend das Raid mit den Platten die zuletzt gemeinsam funktionierten zusammen zu setzten, in meinem Fall:

mdadm /dev/md1 --assemble /dev/sdh1 /dev/sdf1 /dev/sdg1 /dev/sde1 /dev/sdi1 /dev/sdd1 --force

Wer mehr wissen will, die Idee stammt aus diesem Beitrag: http://ubuntuforums.org/showpost.php?p=7014399&postcount=22

Antworten |