Mal eben schnell ... ein Backup in die Ferne sichern (1)

Backups sind wichtig. So viel sollte jedem mittlerweile klar sein. Doch wie sichert man richtig?

GNU/Linux & Unix

Unter GNU/Linux und Unix stellt sich diese Frage kaum. Man kopiert eben das nicht gebootete System mit dem Kopiertool der eigenen Wahl. Ob man dazu nun cp, scp oder rsync einsetzt, man die Dateien einzeln sichert oder vorher mittels tar archiviert und an sie anschließend zur besseren Aufbewahrung komprimiert spielt dabei erstmal eine Rolle. Wichtig ist nur, dass das System dabei nicht gebootet ist.

Das hat zwei Gründe; Zum Einen natürlich die Konsistenz des Systems. Ist es sauber heruntergefahren, braucht man sich hier nicht sorgen. Zum Anderen erspart man sich dadurch das explizite Ausschließen der virtuellen Dateisysteme (/proc,/sys,/dev). Die Lösung ist hier ebenso einfach wie die Sicherung selbst: Man bootet von einem USB Stick mit einem Live Linux Image oder, etwas langsamer, von einer Live CD. Die Wiederherstellung ist ebenso einfach erledigt. Die Dateien werden einfach zurück kopiert, natürlich auch wieder durch ein Live Linux. Fertig ist das Backup unter Linux und anderen Unix-artigen Systemen.

Natürlich ist ein Voll-Backup, bzw. ein Image, wie es weiter unten für Windows beschrieben wird, auch für Linux/Unix Maschienen problemlos möglich, nur oft eben einfach nicht nötig.

Windows

Doch manchmal muss man eben auch den Laptop der Schwester/Mutter/Vater/Tante/Onkel sichern. Leider trifft man dort oft noch Microsoft Windows an. Und da fangen auch schon die Probleme an. Eine Sicherung wie oben beschrieben führt spätestens bei der Widerherstellung oft zu Verzweifelung. Einfacher ist es, ein Abbild der gesamten Platte zu erstellen, z.B. via dd. Mit dem noch aus Unix Zeiten stammende Tool sind auch den meisten Linux-Nutzern schon irgendwann mal in Berührung gekommen - z.B: beim Erstellen eines Linux Live-Sticks aus einem ISO-Abbild heraus ;-).

Sicherung

Also wieder in das Live Linux von eben gebootet, externe Festplatte angeschlossen und los gehts!

dd if=/dev/sda of=<pfad-zum-image> status=progress

Dabei muss /dev/sda durch die Platte ersetzt werden, die von Windows benutzt wird und für die Zieldatei auf der externen Platte eingesetzt werden. Das ganze führt dann zu einem 1:1 Abbild der Festplatte, wird also unter Umständen sehr, sehr groß!

Oft fehlt es auch einfach an einer externen Festplatte oder man möchte auf einen entfernten (oder den eigenen) Rechner sichern. Hier springen ssh mit dd zusammen für uns ein!

dd if=/dev/sda status=progress | ssh <user>@<host> dd of=<pfad-zum-image>

Hier müssen entsprechend noch und durch den Benutzer und die Maschien auf die das Backup gesichert werden soll ersetzt werden. Allerdings bleibt das Problem der Größe unserer Sicherung. Wie so oft hilft einem auch hier das Kombinieren von GNU Tools weiter:

dd if=/dev/sda status=progress | gzip -1 - | ssh <user>@<host> dd of=<pfad-zum-image>.gz

Ob wir an der Stelle nun gzip, xz ein anderes Tool zum Komprimieren einsetzen bleibt wieder jedem selber überlassen. Ich habe hier gzip gewählt, da es schnell ist (zumdem noch mit der Option -1, d.h. niedrige Kompression, schnelle Komprimierung) und der Speicherplatz sekundär für mich ist. Steht die Speicherplatzersparnis im Vordergrund kann hier auch 9 für hohe Kompression gewählt werden. Aber es spricht auch absolut nichts dagegen jegliches andere Verfahren zu wählen, einzige Vorraussetzung: der Vorgang muss über die Dateiströme stdin und stdout laufen.

Wer mehr auf BZip2 steht mag eventuell folgendes probieren:

dd if=/dev/sda status=progress | gzip -j1 - | ssh <user>@<host> dd of=<pfad-zum-image>.bz2

(oder)

dd if=/dev/sda status=progress | bzip2 -1 - | ssh <user>@<host> dd of=<pfad-zum-image>.bz2

Glücklicherweise bietet xz eine verwandte Syntax, also müssen wir auch hier nicht viel ändern:

dd if=/dev/sda status=progress | xz -0 - | ssh <user>@<host> dd of=<pfad-zum-image>.xz

Wiederherstellung

Die Wiederherstellung läuft dann wieder analog, nur eben in umgekehrter Reihenfolge ab; wichtig dabei - die Komprimierung muss beim Wiederherstellen auch rückgangig gemacht werden.

ssh <user>@<host> dd if=<pfad-zum-image>.gz | gunzip - | dd of=/dev/sda

Das ganze klappt natürlich auch analog mit den jeweils anderen Kompressionsverfahren:

ssh <user>@<host> dd if=<pfad-zum-image>.bz2 | gunzip -j - | dd of=/dev/sda

(oder)

ssh <user>@<host> dd if=<pfad-zum-image>.bz2 | bunzip - | dd of=/dev/sda

Oder für xz:

ssh <user>@<host> dd if=<pfad-zum-image>.xz | unxz - | dd of=/dev/sda

…und Umgekehrt

Natürlich ist das ganze weder auf Windows noch auf die Richtung beschränkt! Es geht nämlich auch umgekehrt. Bisher haben wir aus unserem Live Linux heraus gesichert und wiederherstellt. Manchmal ist es aber bequemer den Vorgang von der eigenen Maschiene aus zu steuern. Dafür ändern wir einfach unsere Ansicht auf die Dinge und nutzen:

ssh <user>@<host> dd if=/dev/sda \| gzip -1 - | dd of=<pfad-zum-image>.gz

Für das Sichern und:

dd if=<pfad-zum-image>.gz | ssh <user>@<host> gunzip - \| dd of=/dev/sda

für die Widerherstellung.

Beachtet werden muss hierbei vor allem das Escaping der Pipe (also \|) vor, bzw. für die Wiederherstellung nach dem gzip Kommando, da der Befehl sonst nicht auf dem entfernten Rechner, sondern erst lokal, also nach der Übertragung der Daten durch das Netzwerk, ausgeführt wird. Das würde zwar auch funktionieren, aber das Netzwerk nur unnötig belastet. Benutzername und Host sind an dieser Stelle natürlich die des Live Linux, auf dem dadurch ein aktivierter SSH-Server erfordert wird, und nicht, wie bisher, die der Zielmaschiene für das Backup.

Ab jetzt sollte also auch der Windows-Sicherung nichts mehr im Wege stehen :-)