Das Backup-Programm BoxBackup
Platzsparendes netzwerkweites Backup
Restore
Prinzip
Einzelne Dateien können wir mit bbackupquery zurückholen. Nehmen wir als Beispiel an, wir haben /var/lib/ntp/ntp.drift verloren und wollen es wiederhaben. Am Prompt von bbackupquery können wir Kommandos eingeben. Im folgenden Listing sehen wir die Kommandos hinter dem Prompt query %gt; und die Ausgabe unmittelbar darunter.
query > cd var/lib/ntp query > ls 00002798 f----- ntp.drift query > ls -o 000013d9 f--o-- ntp.drift 00002780 f--o-- ntp.drift 00002798 f----- ntp.drift query > ls -ot 000013d9 f--o-- 2007-03-03T20:29:57 ntp.drift 00002780 f--o-- 2007-03-04T00:29:57 ntp.drift 00002798 f----- 2007-03-05T00:29:57 ntp.drift query > get -i 00002780 ntp.drift Object ID 00002780 fetched sucessfully. query > quit Logging off... Session finished.
Die Kommandos ähneln denen in einem FTP-Client. Ein normales ls
-Kommando zeigt nur die aktuelle Version der Datei an. Mit ls -o
sehen wir alle Versionen mit ihren IDs; mit ls -ot
wird zusätzlich noch das Datum angezeigt. Nun wollen wir aus unverständlichen Gründen die Version vom 4.3.2007 wieder herstellen. Dies geschieht mit der get
-Anweisung. Ohne die Option -i
würde die letzte Version wieder hergestellt. Nachdem wir das Programm verlassen haben, finden wir die Datei im aktuellen Verzeichnis vor. Von dort können wir sie in ihr Zielverzeichnis verschieben. Wie in einem FTP-Client hätten wir mit dem lcd
-Kommando in das Zielverzeichnis wechseln und die Datei direkt dorthin schreiben können.
Ein Restore funktioniert prinzipiell genauso. Hierbei kommt das Kommando restore
zum Einsatz, das ein ganzes Unterverzeichnis in ein lokales Verzeichnis zurücksichert. Auch eine Vergleichsoperation compare
gibt es, deren Syntax der von restore
ähnelt. Beim Restore gibt es keine Möglichkeit, einen älteren Stand auszuwählen - dies ist eines der noch geplanten Features.
Test des Restore
Auf jeden Fall sollte man auch einmal testen, dass man mit dem Backup seinen Rechner auch wiederherstellen kann! Zumindest sollte man die Daten einmal komplett aus dem Archiv abrufen und auf Vollständigkeit prüfen.
Nun hat man vielleicht auf dem Client nicht genug Platz, um die Dateien in ein separates Verzeichnis zurückzuholen. Andererseits kann man eigentlich nur von diesem Client aus die Daten lesen, da sie verschlüsselt sind. Doch hier kommt uns die Sicherung der notwendigen Daten im client-Verzeichnis zu Hilfe. Mit einer Kopie dieser Daten können wir auf einem beliebigen Rechner zentral alle Backups prüfen. Dazu kopieren wir zunächst das ganze Verzeichnis auf den Zielrechner, wozu wir ein NFS-Volume, scp, rsync oder andere Methoden einsetzen können. Mit NFS zum Beispiel:
cp -a /mnt/backup/clients /mnt/server/backup
Melden wir uns an diesem Server an und wechseln in dieses Backup-Verzeichnis. Das kann als normaler Benutzer geschehen, wenn wir vorher diesen Benutzer zum Besitzer des ganzen Verzeichnisses gemacht haben. Die Konfigurationsdaten und Schlüssel jedes Clients liegen nun unter [client]/boxbackup. Unser Ziel ist, durch Verwendung der jeweiligen Konfigurationsdatei des Clients das richtige Zertifikat zu laden und so Zugriff zu bekommen. Dazu müssen wir in der Konfigurationsdatei aber den Pfad der Zertifikatsdatei anpassen:
for client in *; do sed -i -e "s:etc:var/backup/$client:" $client/boxbackup/bbackupd.conf done
Probieren wir, ob wir die Backup-Daten des Clients sehen können. Vorher wechseln wir aber noch in ein leeres Testverzeichnis, das wir ggf. zuvor anlegen. So können die Backup-Daten keine vorhandenen Daten überschreiben.
bbackupquery -c /var/backup/<client>/boxbackup/bbackupd.conf
Es klappt! Nun können wir Verzeichnis für Verzeichnis rücksichern, was aber zu viel Handarbeit bedeutet:
restore boot boot restore etc etc ...
Um die Integrität des Backups systematisch zu prüfen, habe ich daher ein weiteres Skript erstellt. Um es zu benutzen, muss man lediglich die Variable basedir
anpassen. Dann kann man es von jeder beliebigen Stelle aus aufrufen. Auch dieses Skript steht zum Download bereit.
#!/bin/sh # hjb 2007-03-29 basedir="/app" cd "$basedir/backup-tree" || exit 1 query() { local client=$1 shift /usr/sbin/bbackupquery -q -c "$basedir/backup/$client/boxbackup/bbackupd.conf" "$@" } for client in *; do cd $client || exit 2 chmod -R 0700 * rm -rf * files=$(query $client ls quit | egrep '^[0-9]{8}' | cut -d ' ' -f 3-) for i in $files; do echo -n $client $i: query $client "restore $i $i" quit | tr -d . done cd .. done
Bei diesem Test stellte ich mit Besorgnis fest, dass einige Dateien im Backup Fehlermeldungen lieferten und das Restore abbrach. Ein Teil dieser Fehler war mit einer defekten Festplatte zu erklären. Nachdem ich diese aus dem RAID entfernt hatte, nahmen die Fehler ab. Einige blieben jedoch. Nachdem die Versuche, anhand der Hilfen auf der BoxBackup-Homepage das Problem zu lokalisieren, fehlgeschlagen waren, löschte ich die betroffenen Client-Accounts und legte sie neu an. Man verliert dadurch die Versions-Historie der gesicherten Dateien, aber eine andere Lösung sah ich zunächst nicht. Einige Probleme blieben jedoch weiterhin, so dass ich die Vermutung hatte, dass BoxBackup 0.10 noch Fehler aufweist. Ich begann also, die betroffenen Clients auf neuere Versionen aus dem Versionsverwaltungssystem des Projektes zu aktualisieren.
Doch meine Zweifel an der Korrektheit des Programmes scheinen unbegründet. Das wahre Problem liegt woanders, und zwar an einigen merkwürdigen Zugriffsrechten. So hatte ich auf einem Client folgendes Verzeichnis:
dr-xr-xr-x 2 hans hans 4096 2007-11-02 23:57 include
Sind in diesem Verzeichnis Dateien enthalten, versucht die Rücksicherung, sie anzulegen. Dass dies mit einem »Permission denied« scheitert, kann man mühelos sehen. Die einzige Lösung ist, auf dem zu sichernden Rechner die Rechte zu ändern, in diesem Fall: chmod u+w include
.
Hier ist das Rezept, wie man solchen Problemen auf die Spur kommt. Man lässt zuerst das Restore-Test-Skript normal laufen. Gibt es für Client »client« und Verzeichnis »dir« einen Fehler aus, dann führt man das Kommando, das zu dem Fehler führte, unter »strace« von Hand aus:
strace -f -olog -s300 /usr/sbin/bbackupquery -q \ -c <basedir>/backup/<client>/boxbackup/bbackupd.conf \ "restore -r <dir> <dir>" quit
Hilfreich ist die Option -r, die dazu führt, dass sich der Fehler sofort wiederholt. Nur finden wir danach in der Datei log einen Hinweis, was das Problem war. Beispiel:
11748 open("usr-local/test/include/xyz", _WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = -1 EACCES (Permission denied)
Mit folgendem Kommando kann man im aktuellen Verzeichnis (auf dem Client) nach ähnlichen Problemen fahnden:
find . -type d ! -perm /0200
Eine weiterer Fehler kann unter recht bizarren Umständen auftreten, wenn man symbolische Links hat, die mit einer absoluten Pfadangabe auf ein Verzeichnis zeigen. Ich vermutete hier einen Fehler in BoxBackup 0.10, was schließlich bestätigt und korrigiert wurde. Wer eine Version vor 5. November 2007 einsetzt, kann als Workaround den absoluten Link durch einen relativen ersetzen.