Fallback mit MD-RAID

28.12.2010

Nachdem ich meinen Heimserver einmal wieder upgraden musste und es vielen evtl. ähnlich geht, möchte ich hier eine Methode beschreiben, wie ein RAID 1 Softwareraid (MD-Device) als schnelle Fallbackmethode verwendet werden kann.

WICHTIG: Diese Methode ersetzt kein Backup. Immer zuerst Daten sichern, dann am System herumschrauben. Hier geht es nur um eine Methode das System schnell wieder auf den Ausgangszustand zurückzusetzen, ohne erst mühsam das Backup einspielen zu müssen.

Vorbereitungen

Die MD-Devices, welche gesichert werden sollen (also bei einem Upgrade / und /boot) sollten ausgehängt (unmount [Mountpoint]) oder (im Falle von boot) wenigstens ReadOnly remounted (mount -o remount,ro [Mountpoint]) werden. Bei root-Verzeichnis wird das nicht klappen. Hier kann man also nur einen Hot-Snapshot ziehen. Daher sollten so wenig Services wie möglich laufen. Gerade Datenbanken müssen heruntergefahren werden, damit sich diese in einem konsistenten Zustand befinden. Auch ein abschließendes sync schadet nicht.

Nehmen wir für unser Beispiel also an, dass wir /dev/md1 auf / und /dev/md2 auf /boot verbunden haben. Dann sollten zuerst folgende Befehle ausgeführt werden:

# Datenbanken und so viele andere Dienste wie möglich stoppen.
mount -o remount,ro /boot
sync

#RAID aufteilen Als nächstes muss das RAID-Array aufgeteilt werden. Hierfür nehmen wir einmal an, das RAID1 besteht aus je zwei Festplatten (sda und sdb). sdb soll unsere Backupplatte werden, also muss diese jetzt deaktiviert werden:

# Die beiden Partitionen ( / und /boot ) der Backupfestplatte als "fehlerhaft" markieren.
mdadm --manage -f /dev/md1 /dev/sdb1
mdadm --manage -f /dev/md2 /dev/sdb2

Jetzt haben wir unser Backup ausgehängt. Auch der Installer sollte die fehlerhaften Platten also in Ruhe lassen.

Installieren

Bei der Installation ruhig in der Konsole über cat /proc/mdstat kontrollieren, ob der Installer die “fehlerhaften” Platten auch also solche erkannt hat und sie in Frieden lässt.

Alles Ok?

Wenn alles wie erwartet geklappt hat und das System brav neu bootet, dann ist jetzt die Zeit das alte Backup zu verwerfen. Einfach die “fehlerhaften” Platten wieder zum Array hinzufügen klappt nicht, da MD dann erkennt, dass diese schon einmal zum Array gehört haben. Dann wird keine Synchronisation ausgeführt und wir haben ein inkonsistentes Array zusammengebaut (= nicht gut). Aus diesem Grund müssen die “defekten” Backuppartitionen erst einmal aus dem Array entfernt werden. Hierfür kann auch wieder das --manage Kommando des mdadm-Tools verwendet werden:

mdadm --manage -r /dev/md1 /dev/sdb1
mdadm --manage -r /dev/md2 /dev/sdb2

Nun sind die Partitionen aus dem RAID entfernt. Um Sie wieder hinzuzufügen, muss vorher der RAID-Superblock gelöscht werden. Das sorgt dafür, dass die Partition als neu erkannt und passend synchronisiert werden:

mdadm --misc --zero-superblock /dev/sdb1
mdadm --misc --zero-superblock /dev/sdb2

Jetzt ist der RAID-Superblock weg und die Backuppartitionen können gefahrlos wieder zum Array hinzugefügt werden:

mdadm --manage -a /dev/md1 /dev/sdb1
mdadm --manage -a /dev/md2 /dev/sdb2

Mit cat /proc/mdstat kann man nun überprüfen, ob die Synchronisation des Arrays korrekt gestartet wurde. Nach deren Abschluss ist das Array wieder synchron und kann seine Funktion wieder erfüllen.

Zurück auf Anfang

Sollte das Upgrade - wie in meinem Fall - nicht geklappt haben, so braucht man jetzt erst einmal ein Rescue-System. Am besten sollte man dieses von einer CD der gleichen Distribution booten.

Jetzt muss das Array erst einmal komplett auseinandergenommen werden. Dann werden die vorher auf “fehlerhaft” gesetzten Partitionen wieder hinzugefügt und damit ein Array gebaut, welches den alten Stand wieder spiegelt:

# Die beiden Arrays stoppen (falls sie die Rescue-CD zusammengesetzt hat)
mdadm --manage -S /dev/md1
mdadm --manage -S /dev/md2

# Jetzt das Array mit den Sicherungspartitionen zusammenbauen
mdadm --assemble /dev/md1 /dev/sdb1
mdadm --assemble /dev/md2 /dev/sdb2

Jetzt muss noch die verpfuschte Installation überschrieben werden. Damit das auch wirklich passiert, wird der RAID-Superblock gelöscht und anschließend die Partition zum Array hinzugefügt:

mdadm --misc --zero-superblock /dev/sda1
mdadm --misc --zero-superblock /dev/sda2

# Die Partitionen jetzt wieder zum Array hinzufügen
mdadm --manage -a /dev/md1 /dev/sda1
mdadm --manage -a /dev/md2 /dev/sda2

Nun ist das Array wieder vollständig und der alte Stand wiederhergestellt. Mit cat /proc/mdstat kann man sich nun den Verlauf der Synchronisation ansehen. Eigentlich könnte man schon jetzt neu booten und die Synchronisation im Hintergrund weiterlaufen lassen. Sicherheitshalber sollte man jedoch besser abwarten, bis die Partition synchronisiert sind, bevor man einen Neustart versucht.

Jetzt sollte das alte System wieder booten. Evtl. gibt es noch einen Fehler wegen der Zeitstempel der MD-Devices. Dieser verschwindet jedoch nach dem ersten Start des Arrays.

Wichtiger Hinweis

Ich kann es gar nicht oft genug sagen: Diese Methode ersetzt kein Backup. Bei dieser Arrayherumschubserei muss man nur einmal einen Parameter falsch angeben und schon sind die Daten weg. Diese Methode ist nur eine Abkürzung um die Downzeit bei einem Fehlschlag zu minimieren. Ein ordentliches Backup ersetzt sie auf keinen Fall!