Datensicherung mit Bacula und Mac OS X

(2007-08-24)

Bacula ist eine Netzwerk-Backup-Software, die für mich das Mittel der Wahl ist um alle wichtigen Rechner zu sichern. Die wichtigen Funktionen für mich ist die Fähigkeit, Linux-, Mac OS X- und Windows-Rechner zu sichern, die gut konfigurierbaren FileSets, inkrementelle Backups, Benachrichtigung via Mail und gzip-Kompression.

Zur Sicherung und vor allem zur Bare-Metal-Recovery (das Wiederherstellen des Backups auf eine komplett leere Festplatte) auf Mac OS X spricht sich die Bacula-Dokumentation leider nicht so sehr aus, sodass ich diesen Artikel schrieb.

Ich gehe davon aus, dass die Prinzipien, Begriffe und Konfiguration von Bacula bekannt ist und dass der Server einwandfrei läuft.

Konfiguration

Beteiligte Rechner

Der Director und Storage Daemon läuft bei mir auf einem Linux-Server, der zu sichernde Mac ist ein MacBook.

Konfiguration

Da das Prinzip der Bacula-Konfiguration auf anderen Websites schon zur Genüge erklärt ist, beziehe ich mich hier nur auf die Einzelheiten, die für Mac OS X wichtig sind (hfsplussuport, FileVault und die Liste der auszuschließenden Dateien).

FileSet {
    Name = "macbook-set"
    Include {
        Options {
            signature = MD5
            compression = gzip
            hfsplussupport = yes
        }
        File = /
        # Da FileVault als anderes Dateisystem gilt, muessen wir den Pfad explizit angeben
        File = /Users/michael
    }
    Exclude {
        @/etc/bacula/std_mac_exclude.files
        # Das FileVault-Image hingegen lassen wir aus, da wir ja die Dateien sichern
        File = /Users/.michael/michael.sparseimage
    }
}

Damit man die Liste der auszuschließenden Dateien nicht bei jedem Mac, den man sichert, wiederholen muss, habe ich sie in die Datei std_mac_exclude.files ausgelagert. Ausgeschlossen werden alle Mountpoints (für FTP/SMB-Server, USB-Geräte, etc…), die temporären Dateien, eingelegte CD-ROMs und das automatisch durchsuchte Netzwerk.

/etc/bacula/std_mac_exclude.files

File = /Volumes
File = /tmp
File = /private/tmp
File = /cdrom
File = /automount
File = /Network
File = /.vol

FileVault

Wenn man FileVault benutzt, hat man drei Möglichkeiten:

  1. Man gibt keine speziellen Einstellungen an und lässt somit Bacula das FileVault-Image sichern.
    Der Nachteil hierbei ist, dass man keine einzelnen Dateien wiederherstellen kann. Der Vorteil ist, dass man seine Wiederherstellung 1:1 durchführen kann.
  2. Man konfiguriert Bacula wie oben gezeigt und sicher somit den Inhalt des FileVault-Images, nicht aber das Image selbst.
    Der Vorteil hierbei ist das Wiederherstellen einzelner Dateien, der Nachteil ist, dass man nach einer Bare-Metal-Recovery FileVault erst wieder aktivieren muss (oder es manuell währenddessen aktiviert, da weiß ich aber nicht, ob das überhaupt funktioniert).
  3. Man sichert sowohl den Inhalt, als auch das Image.
    Der Vorteil ist, dass man sowohl einzelne Dateien wiederherstellen, als auch einfach eine Bare-Metal-Recovery durchführen kann. Der Nachteil ist, dass man doppelt so viel Speicherplatz für das Backup braucht.

Bare-Metal-Recovery

Voraussetzungen:
  • Mac OS X Installation Disc (10.4)
  • Eine vorher kompilierte, statische Version vom Bacula-Client (bacula-fd)
  • Die Konfigurationsdatei (bacula-fd.conf) des Clients
  • Einen USB-Stick oder eine externe Festplatte, um die beiden Dateien (bacula-fd und bacula-fd.conf) auf die leere Platte zu spielen sowie um das Script rd.sh auszuführen um die RAM-Disk zu erstellen

Statische Version des Bacula-Clients

Auf der Mac OS X Installation Disc sind alle benötigten Libraries vorhanden, daher brauchen wir keine statische Version (das Kompilieren einer statischen Version auf Mac OS X funktioniert ohnehin nicht).

./configure --enable-client-only
make

Anschließend kopieren wir src/filed/bacula-fd und die Konfigurationsdatei, die wir zuvor schon verwende haben (bacula-fd.conf) auf den USB-Stick.

RAM-Disk

Das Script, um eine RAM-Disk unter Mac OS X zu erstellen, habe ich auf explanatorygap.net gefunden. Es muss auf dem USB-Stick (oder -Festplatte) gespeichert werden.

rd.sh

echo "Creating RAM Disk for $1"
dev=hdik -drivekey system-image=yes -nomount ram://2048
if [ $? -eq 0 ] ; then
    newfs $dev
    mount -o union $dev $1
fi

Die eigentliche Rettung

Ich gehe davon aus, dass eine leere Festplatte (oder eine, deren Daten nicht mehr benötigt werden) am Computer angeschlossen ist (ob via Firewire, USB, oder direkt eingebaut spielt keine Rolle).

Der erste Schritt besteht nun darin, von der Mac OS X Installation Disc zu starten, wozu man beim Einschalten des Systems C gedrückt halten muss, bis das Apfel-Logo erscheint.

Nach der Sprachauswahl geht es an das Einrichten einer Partition, auf die später die Daten wiederhergestellt werden. Diese muss natürlich mindestens genauso groß sein, kann aber auch größer sein. Über Dienstprogramme, Festplattendienstprogramm beziehungsweise Utilities, Disk Utility (je nach Sprache) lässt sich das Programm dazu aufrufen.

Die neu erstellte Partition wird dann automatisch gemountet, was man auch mit mount nachsehen kann. Wir wechseln nun ins Terminal, das sich auch bei Dienstprogramme finden lässt. In diesem Beispiel habe ich die neue Partition „MacHD” genannt. Wir wechseln nun in das Verzeichnis und kopieren die beiden vorbereiteten Dateien vom USB-Stick (der auch automatisch eingebunden wird, sobald er angeschlossen wird):

cd /Volumes/MacHD
cp /Volumes/USB/bacula-fd /Volumes/USB/bacula-fd.conf .

Wichtig hierbei ist, dass diese beiden Dateien direkt im Root-Verzeichnis liegen. Im Backup dürfen diese beiden Dateien nicht existieren, sonst bricht Bacula bei der Wiederherstellung ab!

Wir erstellen nun eine RAM-Disk, die wir über /var legen, sodass Bacula in /var/bacula/working schreiben kann (auf der Mac OS X Installation Disc wird /var natürlich nicht schreibbar gemountet). Man könnte auch ein Verzeichnis auf der neu angelegten Partition erstellen, das von Bacula als Working-Directory genutzt wird, aber die 1 MB große RAM-Disk langt aus und wir müssen hinterher weniger aufräumen.

/Volumes/USB/rd.sh /var
mkdir -p /var/bacula/working

Außerdem müssen wir die Netzwerkschnittstelle konfigurieren, damit wir eine Verbindung zum Director/Storage Daemon bekommen:

ifconfig en0 192.168.1.5

Je nach Installation von Bacula muss hier noch ein Standardgateway gesetzt werden (damit eine Verbindung ins Internet klappt):

route add default gw 192.168.1.1

Nun starten wir den File Daemon:

./bacula-fd

Und dann geht’s am anderen Rechner weiter. Nach dem Start von bconsole zeigen wir uns mit list jobs die letzten Backups an und wählen die ID des letzten Backups für den zu wiederherstellenden Rechner.

Dann starten wir das Wiederherstellen (beziehungsweise die Dateiauswahl dafür) mit folgendem Befehl (die JobID muss natürlich ausgetauscht werden):

restore jobid=123 all

Da wir keine Dateien aus- oder abwählen möchten, beenden wir mit done die Auswahl und werden nun gefragt, ob Bacula anfangen soll. Da wir nicht nach /tmp/bacula-restores wiederherstellen wollen, verändern wir mithilfe von mod den Parameter 9) Where. Hier geben wir den Pfad zu unserer Partition ein, also in diesem Beispiel /Volumes/MacHD und bestätigen dann mit yes.

Je nach Netzverbindung dauert das Wiederherstellen eine Weile (bei mir ca 20 Minuten für 30 GB über ein Gigabit-LAN).

Anschließend muss unbedingt noch das von uns im Backup ausgelassene Verzeichnis /dev angelegt werden, sonst wird Mac OS X beim nächsten Neustart nicht hochfahren:

mkdir dev

So, das war’s. Nun schließen wir das Terminal und wählen bei Dienstprogramme das Programm Startvolume, wo wir „Mac OS X auf MacHD” wählen und auf „Neustarten” klicken.