Puffy

OpenBSD Systembackup

Dieser Text versucht zu erklären, wie man ein OpenBSD vollständig als Systemimage so sichern kann, das man das gesamte System im Zweifelsfall sogar auf andere Hardware schnell umziehen kann. Ebenso soll dann auch das Recovery (auf gleicher oder anderer Hardware) erklärt werden.

Backup

Zum erstellen des Backups benötigt man ein ausreichend großes Backupmedium. Das Backupmedium sollte mindestens so groß sein, wie der gesamte belegte Festplattenplatz des OpenBSD-Systems. Ideal eignen sich hier externe Festplatten. Ich gehe hier davon aus das eine externe über USB angeschlossene Festplatte verwendet wird (Hinweis: Firewire-Festplatten können nicht genutzt werden, da OpenBSD bislang keine Firewire-Unterstützung besitzt).

Die externe Festplatte sollte entweder mit dem OpenBSD-eigenen FFS-Dateisystem formatiert sein oder alternativ mit dem ext2 Dateisystem. Zwar kann OpenBSD auch FAT-Formatierte Platten beschreiben, aber diese haben den Nachteil eine maximal mögliche Dateigröße von 2 GB zu besitzen, was unter Umständen zu wenig ist.

Nehmen wir einfach an das das FFS-Dateisystem verwendet wird und die FFS-Partition der Platte als /dev/sd0a angesprochen werden kann. Zum leichteren mounten kann man diesen Datenträger auch in die /etc/fstab eintragen:

/dev/sd0a /mnt/usb0 ffs rw,noauto,nodev,nosuid 0 0

Der Mountpoint /mnt/usb0 muß dazu natürlich existieren. Falls noch nicht geschehen legen wir diesen also an:

# mkdir -m 755 /mnt/usb0

An diesen Punkt sollte allerdings noch eine wichtige Entscheidung getroffen werden: Es gibt 2 Möglichkeiten das gesamte System zu sichern: Aus dem laufenden System heraus oder im Single-User Modus, bzw. mit einem bsd.rd Kernel. Geschieht die Sicherung aus dem laufenden System heraus, sollte man daran denken, das man zwar dadurch keine Betriebsunterbrechung hat, allerdings Dateninkonsistenzen riskiert. Da ein Komplettbackup einen gewissen zeitlichen Umfang hat, können sich bei der Sicherung im laufenden Betrieb Daten ändern, während gesichert wird. Oft stellt dies kein allzu großes Problem dar, aber beispielsweise bei einem Datenbankserver kann dadurch im Extremfall auch die Datenbank im Backup unbenutzbar sein, wenn z. B. Daten genau in dem Moment in die Datenbank geschrieben wurden, als genau in diesem Moment die entsprechende Datei der Datenbank gesichert wurde. Dies als Warnung vorab. Eine Sicherung aus dem Single-User Modus heraus hat dieses Risiko nicht, bedeutend aber in jedem Fall eine Betriebsunterbrechung.

Ich werde in diesem Dokument die Sicherung aus dem laufenden System heraus erläutern.

Wenn ich mich also nun für die (riskantere) Sicherung aus dem laufenden System heraus entschieden habe, geht es einfach weiter in dem ich die externe Festplatte mounte:

mount /mnt/usb0

Dann wechsele ich in das Wurzelverzeichnis:

cd /

Die eigentliche Sicherung wird nun ganz einfach mit tar vorgenommen. Ich persönlich ziehe es vor einen Tarball pro Partition zu erstellen. Das /tmp-Verzeichnis wird dabei nicht benötigt. Man kann auch einfach alles in einen Tarball packen, aber dann enthält dieser z. B. auch das /tmp-Verzeichnis, welches eigentlich unnötig ist. Meine persönliche Vorgehensweise sieht etwa so aus:

tar cXf mnt/usb0/sicherung/root.tar .
tar cXf mnt/usb0/sicherung/home.tar home/
tar cXf mnt/usb0/sicherung/var.tar var/
tar cXf mnt/usb0/sicherung/usr.tar usr/

Dies setzt natürlich vorraus, das das Verzeichnis sicherung auf der USB-Festplatte bereits existiert. Wer möchte kann durch die Verwendung der Gzip-Komprimierung auf der USB-Platte Platz sparen. Durch die Komprimierung dauert dann allerdings der Sicherungsvorgang länger. Außerdem ist gzip auch nicht im bsd.rd Kernel enthalten, so das für das Restore ein vollständiges System (z. B. von einer Live-CD) verwendet werden müßte. Das große X als tar-Option bringt tar übrigens dazu nicht über Partitionsgrenzen hinweg zu sichern. Sonst würde die root.tar Datei den Inhalt der gesamten Festplatte und nicht bloß des /-Dateisystems enthalten.

Alternative:

Anstatt tar läßt sich auch dump verwenden. dump arbeitet auf der Dateisystemebene (wodurch es mit Veränderungen während des Backups besser umgehen kann als tar).

dump -0au -f mnt/usb0/sicherung/root.dump /
dump -0au -f mnt/usb0/sicherung/home.dump /home
dump -0au -f mnt/usb0/sicherung/var.dump /var
dump -0au -f mnt/usb0/sicherung/usr.dump /usr

Der Parameter -0 sagt dump, das es sich um einen Level 0 dump handelt, also alles gesichert werden muß. Mit dump lassen sich auch einfach inkrementelle Sicherungen erstellen in dem man einen Level größer als 0 wählt. Der Parameter -a sagt dump, das es nicht versuchen soll, die Mediengröße selber festzustellen und den dump aufzuteilen, sondern bis zu einem signalisierten Medienende schreiben soll (dump wurde primär für die Verwendung mit Bandlaufwerken konzipiert). Mit -u wird die Datei /etc/dumpdates upgedatet, in der Datum und Uhrzeit, sowie der dumplevel jedes Dateisystems das vollständig gedumpt wurde festgehalten wird. Diese Datei ist insbesondere auch für inkrementelle Updates wichtig.

Danach kann die Festplatte wieder ungemountet und entfernt werden.

Recovery

Möchte man nun das System wieder herstellen (z. B. wegen Hardwareschaden) so sind 2 Fälle zu unterscheiden: Zurückspielen des Backups auf die gleiche Hardware oder auf eine ganz andere Hardware. Unterschiede in der Hardware machen sich vor allem dort bemerkbar, wo diese eine unterschiedliche Konfiguration erfordern. Dies kann vor allem bei Netzwerkkarten durch eine unterschiedliche Bezeichnung der hostname.if Dateien sein, aber auch z. B. durch unterschiedliche Partitionierung der Festplatte.

Benutzt man eine neue Festplatte, muß diese erst Partitioniert und Formatiert werden, bevor man die Daten zurückspielen kann. Dazu startet man den Rechner am besten mit einem bsd.rd Kernel. Dies kann z. B. durch die OpenBSD-Installations-CD sein, oder wenn man einen DHCP-/TFTP-Server im Netz hat und die Netzwerkkarte des Rechners bootfähig ist, kann dies auch per PXEboot sein.

Wenn nun der Prompt erscheint:

(I)nstall, (U)pgrade or (S)hell:

Wählen wir s für Shell. Danach am besten als erstes (falls man mit einer deutschen Tastatur arbeitet) das deutsche Tastaturlayout auswählen:

kbd de

Dann kann mit der DOS-Partitionierung begonnen werden. Möchte man einfach den gesamten Plattenplatz für OpenBSD verwenden, kann man folgendes Kommando eingeben:

fdisk -i /dev/rwd0c

Für den Fall, das wd0 nicht Ihre Installationsfestplatte ist, nehmen Sie natürlich die passende Gerätebezeichnung.

Danach kann die DOS-Partition mit disklabel in Slices aufgeteilt werden. Folgendes Kommando startet den interaktiven disklabel Editor, wie sie Ihn bereits von der Installation kennen:

disklabel -E wd0c

Die neuen Partitionen dürfen auch größer sein, als die alten, sollten jedoch keinesfalls kleiner als die Menge Speicherplatz sein, welche das Backup benötigt. Erstellen Sie in jedem Fall die gleiche Anzahl und Reihenfolge von Slices wie Sie vorher hatten (ansonsten müssen sie die Datei /etc/fstab aus der Datensicherung anpassen).

Nun müssen die soeben erzeugten Partitionen auch noch formatiert werden:

newfs /dev/rwd0a
newfs /dev/rwd0d
newfs /dev/rwd0e
newfs /dev/rwd0f
...

Als nächstes mounten wir zunächst nur die /-Partition unterhalb von /mnt:

mount -t ffs /dev/wd0a /mnt

Als nächstes wird nun die externe USB-Festplatte, nachdem man sie angeschlossen und eingeschaltet hat, auf /mnt2 gemountet:

mount -t ffs /dev/sd0a /mnt2

Nun kann man (sofern man seine Tarbälle nach Partitionen unterteilt hat) als erstes die /-Partition entpacken:

cd /mnt
tar xpf /mnt2/sicherung/root.tar

Die Option p von tar stellt dabei sicher, das die Dateieigenschaften (z. B. Rechte) erhalten bleiben.

Als nächstes werden alle weiteren Partitionen an die entsprechenden Stellen unterhalb von /mnt gemountet:

mount -t ffs /dev/wd0d /mnt/tmp
mount -t ffs /dev/wd0e /mnt/var
mount -t ffs /dev/wd0f /mnt/home
...

Dann können ebenso die anderen Partition aus dem Backup wiederhergestellt werden:

tar xpf /mnt2/sicherung/var.tar
tar xpf /mnt2/sicherung/home.tar
...

Alternative:

Wurde dump statt tar verwendet, dann wird für das Restore der Befehl restore benutzt. Wichtig: restore -r muß in einem frisch mit newfs formatierten Dateisystem angewendet werden, in welches man vorher mit cd hineingewechselt hat.

restore -r -v -f /mnt2/sicherung/root.dump
mount -t ffs /dev/wd0e /mnt/var
cd /mnt/var
restore -r -v -f /mnt2/sicherung/var.dump
...

Der Parameter -r von restore stellt alles wieder her und darf nur auf einem frisch formatierten Datenträger verwendet werden. -v macht restore, das normalerweise still arbeitet, etwas geschwätziger. Zusätzlich wird restore in jedem Dateisystem die Datei restoresymtable ablegen. Diese Datei enthält Informationen für das zurückspielen von inkrementellen Backups. Die Datei kann nach dem Restore aller Backups einfach gelöscht werden.

Nun ist zwar eine exakte Kopie des alten Systems erzeugt worden, jedoch kann dieses System noch nicht booten, da ihm der First-Stage Bootloader fehlt. Um diesen zu installieren muß man als erstes ein Chroot in das neue System durchführen. Da das Chroot-Binary nicht im bsd.rd-Kernel enthalten ist, benutzen wir das nun wieder auf der neuen Festplatte liegende Chroot:

/mnt/usr/sbin/chroot /mnt /bin/ksh

Nun befinden wir uns in der neu erzeugten Umgebung. Falls man hier noch Konfigurationsänderungen in /etc-Dateien (z. B. Umbenennung einer hostname.if-Datei) durchführen will, so kann man diese jetzt vornehmen. Der Bootloader wird installiert mit dem Kommando:

/usr/mdec/installboot /boot /usr/mdec/biosboot wd0

Falls wd0 nicht Ihr Installationsmedium ist, ersetzen Sie bitte die Gerätedatei durch die für Sie korrekte.

Nun kann der Chroot wieder verlassen werden und das System neu gestartet werden:

exit
reboot

Danach sollte Ihnen ihr System wieder in exakt der gleichen Konfiguration mit den gleichen installierten Programmen zur Verfügung stehen.


Creative Commons Attribution 2.0 Germany License
Copyright (c) René Maroufi, 2007