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.
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. |
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.
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. |
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.
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.
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.
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.
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
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.
</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 Funktionmount
ruftsshfs
auf, um das lokale Verzeichnis/home/partimag
mit dem Verzeichnis/backup/clonezilla
auf dem Backup-Server zu verbandeln. Die hierfür genutzte Funktionsysrun()
stammt aus dem Fundus des CPAN-Moduls Sysadm::Install und führt die ihr übergebenen Shell-Kommandos in einemsystem()
-Befehl aus, nachdem es eine entsprechende Nachricht an das im Skript ebenfalls aktivierte Log4perl-Framework geschickt hat.Die Option
ssh_command
dessshfs
-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 OptionBatchMode=yes
stellt dem User keine Fragen, sondern bricht ab, falls etwas nicht automatisch klappt. Und die OptionGlobalKnownHostsFile
gibt schließlich die Datei an, die die Signaturen bekannter Rechner enthält. Kurz vorher hat das Skript die Ausgabe der Funktionknown_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ührtreverse 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 Befehlocs-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. |
Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2012/07/Perl
"Clonezilla, The Free and Open Source Software for Disk Imaging and Cloning", http://clonezilla.org/
"Use your own script and run it on Clonezilla live", http://clonezilla.org/customized-clonezilla-live.php
"Partimage", http://www.partimage.org/Main_Page
"PAR - The Perl Archive Toolkit", http://search.cpan.org/~rschupp/PAR-1.005/