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.