Im Zeichen des Drachen (Linux-Magazin, Juli 2012)

Mit Clonezilla gehen volle Systembackups und Restores mit nur wenigen Tastendrücken von der Hand. Eine maßgeschneiderte Lösung reduziert den Backup auf das Einlegen einer CD, mittels eines aufgebrannten Perlskripts.

Leider steht in meinem Haushalt noch immer ein PC mit Windows 7 herum, auf dem meine Gattin die Steuererklärung anfertigt und mit Photoshop an digitalen Aufnahmen herumwerkelt. Als Backup-Lösung für diesen PC bot sich das in Windows 7 eingebaute Backup-Programm an. Doch als dieses mit den gesicherten Daten anschließend keinen Restore mehr zusammenbrachte, mit kryptischen Fehlermeldungen um sich warf, und dank des bekannten blickdichten Vorhangs keine Fehleranalyse zuließ, fiel die Entscheidung auf eine handgestrickte Linux-Lösung.

Frei klonen

Abbildung 1: Nach dem Einlegen der Clonezilla-CD erscheint das Boot-Menü.

Das freie Programm Clonezilla ([2]) liefert eine bootbare CD (alternativ: USB-Stick), die auf einem beliebigen PC eine Debian-basierte Live-Distro hochfährt. Der User hangelt sich durch ein Dutzend Menüs (Abbildung 2) und kann zügig zwischen Backup und Restore automatisch ermittelter Plattenpartitionen wählen. Die Daten sichert Clonezilla wahlweise auf einer eingestöpselten USB-Platte oder übers Netz per ssh auf einem anderen Rechner im Netzwerk.

Abbildung 2: Einer der Dialoge zur Konfiguration des Clonezilla-Backups.

Hass auf Handarbeit

Bei regelmäßig stattfindenden Backups nervt die ewig gleiche Handarbeit freilich, und deswegen erlaubt es Clonezilla Power-Usern, ihr eigenes Backup-Skript mit auf die CD zu brennen ([3]). Dieses steuert den Ablauf dann automatisch nach dem Booten. Die Backup- und Restore-Funktionen muss der Automatisierer dabei nicht neu erfinden, sondern darf sich aus dem umfangreichen Clonezilla-Werkzeugkasten mit seinen Shell-Skripts bedienen.

In den Perlmeister-Studios nimmt die maßgeschneiderte Backup-CD zum Beispiel nach dem Einlegen über ssh Kontakt mit dem Backup-Server im lokalen Netzwerk auf und beginnt, die Partitionen der ersten gefundenen Festplatte des PCs komprimiert zu übertragen. Dabei ist Clonezilla so schlau, nicht nur die Daten des jeweiligen Dateisystems festzuhalten, sondern schreibt auch gleich die ganze Partitionstabelle mit, damit der Restore später leichter von statten geht.

Rank und schlank

Die Clonezilla-Suite versteht dabei (mittels des ebenfalls frei verfügbaren Programms partimage [4]) die gängigen Dateisysteme (Ext[2-4], NTFS, FAT, HFS+, Reiser, usw.) und sichert nur tatsächlich benutzte Bereiche, ist also bei nur teilweise genutzten Festplatten weit effizienter als eine bitweise Sicherung mit dd. Da Systeme zur Speicherung der Backup-Daten manchmal mit antiken Dateisystemen aufwarten, die keine langen Files mögen, zerlegt Clonezilla die Sicherungsdateien auf Wunsch in handliche, optional auch komprimierte Brocken (Abbildung 3).

Abbildung 3: Clonezilla speichert die Backup-Daten in komprimierten 2-Gigabyte Stückchen zusammen mit den Partitionsdaten der Festplatte ab.

Um dem User das Studium aller Parameter der mit Funktionen nur so gespickten Clonezilla-Skripts zu ersparen, gibt es nach einem per Menü konfigurierten Lauf wie in Abbildung 4 gezeigt die intern genutzten parametrisierten Funktionsaufrufe aus. Hat sich der User also einmal durch die Dialoge zur Erstellung des Backups gehangelt, braucht er später nur dieses Kommando auf die CD zu brennen und kann sich so den Dialog-Dschungel künftig ersparen.

Abbildung 4: Nach der Menüauswahl schlägt Clonezilla eine Kommandozeile vor, die den Backup nächstes Mal automatisch erledigt.

Totaler Bedienluxus

Bevor das in Abbildung 4 gezeigte Kommando ocs-sr aber direkt nach dem Booten funktioniert, stehen noch einige weitere Konfigurationsschritte an. Soll der Backup übers Netzwerk und ssh auf einem anderen Rechner erfolgen, muss das Bootskript zunächst eine IP-Adresse vom DHCP-Server holen und die Netzwerkverbindung initialisieren. Clonezilla bietet hierzu zwar das Skript ocs-live-netcfg an, doch dieses nutzt ebenfalls Dialoge, und weiß nichts von den Vorlieben des Users.

Statt dessen nutzt das heute vorgestellte Bootskript das Kommando sudo dhclient eth0, das auf Debian-Derivaten eine IP-Adresse vom DHCP-Server holt und entsprechend der ebenfalls zurückkommenden Netzwerkdaten DNS-Server, Netmask und Default Gateway einstellt.

Das gezeigte Kommando ocs-sr zum Anwerfen des Backups schreibt die zu sichernden Dateien stets ins lokale Dateisystem, unter dem angegebenen Verzeichnis (im Beispiel 2012-04-18-15-img). Erfolgt der Backup aber nicht auf eine USB-Platte, die unter dem aktuellen Verzeichnis gemountet ist, sondern übers Netzwerk, nutzt Clonezilla das Programm sshfs, das sich per ssh mit einem entfernten Rechner verbindet und ein dort liegendes Verzeichnis mit fuse-Technik mountet. Das Backup-Programm ocs-sr glaubt also weiterhin, in einen lokalen Dateibaum zu schreiben, aber unter der Haube lotst sshfs die Daten transparent auf den Backup-Server.

Schneckenrennen

Bei den Terabyte-Festplatten der heutigen Generation dauern Backups unter Umständen viele Stunden. Selbst wenn der Backup über Nacht läuft, kann es sein, dass er am Morgen, wenn der Anwender wieder am PC arbeiten muss, noch nicht abgeschlossen ist. Verfügt die zu sichernde Platte über mehrere Partitionen, kann der Admin den Backup unterbrechen, und beim nächsten Lauf sollte das Skript nicht gleich wieder von vorne anfangen, sondern den Backup bei der letzten noch nicht gesicherten Partition fortsetzen.

Weiter sollte der Backup-Admin kein Passwort eingeben müssen oder die dem ssh-Programm bei der ersten Verbindung übliche Warnung zu einem noch unbekannten Host bestätigen. Die CD sollte das Linux-System nach dem Einlegen hochfahren, alles automatisch konfigurieren und nach einer einzigen Bestätigung loslegen.

Mit dem Brotlaib hämmern

Nun soll es noch Anhänger der Shellprogrammierung geben, die derartige Funktionen in irgendeinem Shell-Dialekt zusammenklopfen, aber mir kommt das immer vor, als hämmerte jemand einen Nagel mit einem hartgewordenen Brotlaib in die Wand. Das Perl-Skript in Listing 2 implementiert die Features relativ übersichtlich. Da es einige CPAN-Module nutzt, stellt sich die Frage, wie man das Skript mit seinen Modulen auf die CD brennt.

Statisches Perl

Nutzt ein Perlskript CPAN-Module, läuft es nicht auf Anhieb auf einer Fremdumgebung wie der Clonezilla-Distro. Das CPAN hält hierzu einige Lösungen zur Bündelung von Modul-Sets und Skripts parat, wie zum Beispiel PAR ([5]). Kürzlich kam mit App::staticperl eine weiteres Framework hinzu. Es kompiliert erstaunlich kompakte, statische, von der Laufzeitumgebung relativ unabhängige Perl-Executables, die die verwendeten CPAN-Module bereits enthalten.

Listing 1 zeigt das Shell-Kommando, das aus dem Perl-Skript run-me das Executable run-me-clonezilla erzeugt. Das Tool filzt die verwendeten CPAN-Module nach Abhängigkeiten und fügt diese ebenfalls hinzu. Allerdings hapert es beim Erkennen der im Applikationsskript verwendeten Module, die der Entwickler herausfieseln und mit -M-Optionen manuell angeben muss. Gleiches gilt für dynamisch geladene Module. So holt Log::Log4perl zum Beispiel zur Laufzeit ein Modul mit dem Screen-Appender, sobald seine Konfiguration dies verlangt. App::staticperl kann dies durch rein statische Analyse allein unmöglich herausfinden und benötigt deswegen manuelle Unterstützung. Außerdem verlangt staticperl, dass der User alle später einkompilierten Module mit dem Aufruf staticperl instcpan [Modulname] über eine CPAN-Shell in staticperls lokalem Repository installiert.

Listing 1: build.sh

    1 staticperl mkapp run-me-clonezilla --boot \
    2  run-me -MFile::Basename -MFile::Temp \
    3  -MFile::Glob -MSysadm::Install \
    4  -MLog::Log4perl \
    5  -MLog::Log4perl::Appender::Screen 

Die CD als Schlüssel

Zur passwortlosen Authentisierung auf dem Backup-Server enthält das Skript einen Private Key ohne Passphrase, der mit ssh-keygen -t rsa in einer Datei id_rsa generiert wurde. Ab Zeile 137 steht ein Here-Document mit sämtlichen Zeilen des Private Keys (in Listing 2 aus Sicherheitsgründen ausge-ixt). Der zugehörige Public Key (in id_rsa.pub) wandert in die Datei ~/.ssh/authorized_keys auf dem Backup-Server unter der User-ID des Backup-Users. Wer also die CD (oder das .iso-Image) in Händen hält, verfügt über den Schlüssel zum Backup-Server und braucht weder Passwort noch Passphrase für den Key.

Beim ersten Verbinden mit dem Backup-Server von der Kommandozeile fragt ssh den User, ob dies auch der richtige Host sei und fügt dessen Signatur dann in die Datei ~/.ssh/known_hosts ein. Dieser Eintrag wandert ab Zeile 130 in das Here-Document im Perl-Skript, damit die automatische Verbindungsaufnahme später keine Bestätigung fordert.

In Perl gegossen

Listing 2: run-me


</PRE>
<P>

Zeile 10 legt die IP-Addresse des Backup-Servers fest, dies muss, wie die verwendete Userid in Zeile 11, an die lokalen Gegebenheiten angepasst werden. Die Funktion network() initialisiert den mit der selbstgebrannten CD gebooteten Rechner im Netzwerk. Die ab Zeile 38 definierte Funktion mount ruft sshfs auf, um das lokale Verzeichnis /home/partimag mit dem Verzeichnis /backup/clonezilla auf dem Backup-Server zu verbandeln. Die hierfür genutzte Funktion sysrun() stammt aus dem Fundus des CPAN-Moduls Sysadm::Install und führt die ihr übergebenen Shell-Kommandos in einem system()-Befehl aus, nachdem es eine entsprechende Nachricht an das im Skript ebenfalls aktivierte Log4perl-Framework geschickt hat.

Die Option ssh_command des sshfs-Programms erlaubt es, zusätzliche ssh-Parameter anzugeben. Die Option -i gibt die Lage des private Key an, den Zeile 41 vorher in einer temporären Datei abgelegt hat. Die Option BatchMode=yes stellt dem User keine Fragen, sondern bricht ab, falls etwas nicht automatisch klappt. Und die Option GlobalKnownHostsFile gibt schließlich die Datei an, die die Signaturen bekannter Rechner enthält. Kurz vorher hat das Skript die Ausgabe der Funktion known_hosts() (Zeile 127) in dieser temporären Datei abgelegt.

Unterbrechen erlaubt

Damit der Backup-Admin einen Lauf notfalls unterbrechen kann, sucht die Funktion backup_all() in Zeile 61 das Verzeichnis des letzten Backups heraus. Den legt das Skript jeweils mit aktuellem Datumsstempel an, also führt reverse sort zu einer Liste, deren erstes Element der letzte Backup ist. Innerhalb dieses Backup-Verzeichnisses wiederum sucht Zeile 70 nach einer Datei namens "DONE", die das Backup-Skript immer dann anlegt, falls ein Backup aller angegebener Partitionen abgeschlossen wurde. Fehlt diese Datei, wurde der Backup unterbrochen. Zeile 71 findet in diesem Fall eine angefangene Partition, und die for-Schleife ab Zeile 93 setzt den Backup dort fort.

Kasten: VM vorbereiten

Der Aufruf von ocs-iso in einer VM stieß an die Grenzen des verwendeten Dateisystems, da weder das Ablageverzeichnis /home/partimag noch der temporäre Arbeitsbereich /tmp ausreichend Speicherplatz boten.

Führt der User aber nach dem Hochfahren der VM mit dem ISO-Image von der Clonezilla-Webseite ([2]) die im Shell-Skript prepare.sh aufgezeigten Schritte zum Anlegen zweier Festplattenpartitionen à 500MB aus, erzeugt der Befehl ocs-iso das gewünschte ISO-Image mit dem eingebrannten Bootscript ohne zu murren.

Listing 3: prepare.sh

    01 sudo fdisk /dev/sda <<EOT
    02 n
    03 p
    04 1
    05 
    06 +500MB
    07 n
    08 p
    09 2
    10 
    11 +500MB
    12 w
    13 EOT
    14 
    15 sudo mkfs.ext3 /dev/sda1
    16 sudo mkfs.ext3 /dev/sda2
    17 
    18 sudo umount /tmp
    19 sudo mount /dev/sda2 /tmp
    20 sudo mount /dev/sda1 /home/partimag

Backe, backe Kuchen

Um nun das statisch kompilierte Perlskript als Boot-Skript in ein Clonezilla-Image einzubacken, bootet der User das von Clonezilla heruntergeladene ISO-Image in einer VM (z.B. VirtualBox wie in Abbildung 5), initialisiert das Netzwerk und selektiert die Option "Command line prompt", sobald die hochgefahrene Clonezilla-Distro dies in einem Dialog anbietet.

Abbildung 5: Das ISO-Image mit dem handgestrickten Backup-Skript ist fertig.

Dann wechselt der User ins Arbeitsverzeichnis, kopiert das vorher erzeugte Perlskript-Executable hinein und führt ocs-iso aus:

    cd /home/partimag
    sudo scp user@xxx:/tmp/run-me-clonezilla .
    sudo cp run-me-clonezilla custom-ocs
    sudo /opt/drbl/sbin/ocs-iso \
      -g en_US.UTF-8 -k NONE -s -m ./custom-ocs

Dies funktionierte in einer Virtualbox-VM wegen Speicherplatzmangel nicht auf Anhieb, im Kasten VM vorbereiten stehen die zusätzlichen Installationsschritte, die schließlich zum Erfolg führten.

Heraus kommt ein ISO-Image mit der maßgeschneiderten Clonezilla-Distro, die das statisch kompilierte Perlskript als Bootskript enthält (Abbildung 6).

Abbildung 6: Das ISO-Image mit dem handgestrickten Backup-Skript ist fertig.

Zum Testen des fertigen ISO-Images bietet sich ebenfalls eine VM an, um den Verbrauch an CD-Rohlingen zu beschränken. Enthält die virtuelle Umgebung noch keine Festplatten-Partitionen, lassen sich diese mit fdisk und mkfs.ext3 schnell probeweise einrichten.

Verläuft der Test erfolgreich, bleibt nur noch, das erzeugte ISO-Image auf eine CD zu brennen. Der Befehl

    sudo cdrecord -v speed=4 \
      dev=/dev/cdrom clonezilla-img.iso

erledigt dies auf einer ins Laufwerk frisch eingelegten CD. Wie in Abbildung 7 gezeigt, schnappt sich das Skript die Partitionen, die dringend einen Backup benötigen.

Abbildung 7: Test in einer VM: Das ISO-Image mit dem eingebrannten Perl-Skript beraumt einen Backup aller Partitionen an und holt eine Bestätigung des Users ein.

Infos

[1]

Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2012/07/Perl

[2]

"Clonezilla, The Free and Open Source Software for Disk Imaging and Cloning", http://clonezilla.org/

[3]

"Use your own script and run it on Clonezilla live", http://clonezilla.org/customized-clonezilla-live.php

[4]

"Partimage", http://www.partimage.org/Main_Page

[5]

"PAR - The Perl Archive Toolkit", http://search.cpan.org/~rschupp/PAR-1.005/

Michael Schilli

arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. In seiner seit 1997 laufenden Kolumne forscht er jeden Monat nach praktischen Anwendungen der Skriptsprache Perl. Unter mschilli@perlmeister.com beantwortet er gerne Ihre Fragen.