FreeBSD lässt sich seit Version acht auch auf ZFS-Datenträgern installieren und booten. Ziel des folgenden Beispiels ist es, FreeBSD auf einem ZPool-Mirror bestehend aus zwei Festplatten »ada0
«
und »ada1
«
zu installieren. Der Weg dorthin ist sehr steinig und das Installationsprogramm vereinfacht die Prozedur nur teilweise. Allerdings wird man dann mit einer Funktionalität belohnt, die man von Windows kennt: Die Snapshots ermöglichen es, sogenannte Wiederherstellungspunkte anzulegen. Das ist vor allem für Entwickler und Softwaretester interessant.
Zunächst lädt man sich vom FreeBSD-Verteiler das Image für einen USB-Stick oder CD der sogenannten Fixit-Software herunter. Das ist eine Notfall-Shell, die die Möglichkeit bietet, ein System "von außen" zu administrieren und zu reparieren. Auch die reguläre Installations-DVD bietet diese Funktionalität, wenn man im Installationsprogramm den Menüpunkt »Shell
«
auswählt.
Nachdem man sich entweder einen bootfähigen USB-Stick oder eine DVD erstellt hat, startet man das System mit dem gewünschten Datenträger. Im Auswahlmenü des BSDInstaller wählt man die Option »Shell
«
aus und findet sich anschließend in einer Shell wieder.
Zunächst werden beide Festplatten für den Einsatz mit GPT vorbereitet. Unter Umständen ist es möglich, dass der Kernel einen Schreibzugriff auf die Festplatten verhindert. Um die Sperre aufzuheben, genügt das folgende Kommando:
sysctl kern.geom.debugflags=0x10
Für den weiteren Installationsprozess lädt man die ZFS-Module:
kldload opensolaris kldload zfs
Alle Festplatten eines ZPools müssen identisch partitioniert sein. Das erleichtert die Administration. Außerdem hat man gleichzeitig die Möglichkeit, bei einem Defekt von einer anderen Platte zu booten. Dies gelingt mit den Aufrufen:
gpart create -s gpt ada0 gpart create -s gpt ada1
Im folgenden Schritt werden die einzelnen Partitionen angelegt. Hierbei ist zu beachten, dass die Swap-Partition aus Performance-Gründen nicht auf einem ZFS-Datenträger liegt. Die beiden nachfolgenden Befehle reservieren Platz für den Bootloader. Die Größe von 222 Blocks resultiert aus der Tatsache, dass der Bootloader maximal diesen Speicherbereich belegt.
gpart add -s 222 -t freebsd-boot -l boot0 ada0 gpart add -s 222 -t freebsd-boot -l boot1 ada1
Anschließend werden die restlichen beiden Partitionen erzeugt, wobei die Partitionen, die als ZPool zusammengefasst sind, das Label »zdisk0
«
beziehungsweise »zdisk1
«
erhalten:
gpart add -s 8G -t freebsd-swap -l swap0 ada0 gpart add -t freebsd-zfs -l zdisk0 ada0 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 gpart add -s 8G -t freebsd-swap -l swap1 ada1gpart add -t freebsd-zfs -l zdisk1 ada1
Damit FreeBSD überhaupt von einem ZPool bootet, braucht es den entsprechenden Bootcode:
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
Für die folgenden Schritte wird der ZPool »fbsd
«
angelegt, indem die Partitionen mit dem Label »zdisk0
«
und »zdisk1
«
eingebunden werden:
zpool create -o altroot=/mnt -O canmount=off fbsd mirror /dev/gpt/zdisk0 /dev/gpt/zdisk1
Die virtuellen Geräte »/dev/gpt/zdisk(0|1)
«
hat der FreeBSD-Device-Manager aus den zuvor angelegten Labels »zdisk(0|1)
«
erzeugt, um den Zugriff auf die Partitionen zu erleichtern. Der Parameter »altroot=/mnt
«
gibt einen alternativen Mountpoint für »/
«
an, und »canmount=off
«
bedeutet, dass »/
«
von ZFS nicht automatisch gemountet werden soll, sondern vom Mount-Befehl des Betriebssystems.
Eine Installation von FreeBSD verlangt nach einer bestimmten Hierarchie im Verzeichnisbaum. Da auch der Portstree mit seinen Dateien im ZPool liegen soll, sind einige Besonderheiten zu beachten, die später näher erläutert werden. Für mehr Datensicherheit sorgt die ZFS-Option »checksum
«
mit dem Algorithmus »fletcher4
«
. Es hat sich herausgestellt, dass dieser Algorithmus sehr stabil ist und selbst bei großen Datenmengen zuverlässig funktioniert.
zfs set checksum=fletcher4 fbsd
Das Anlegen des Root-Dataset im ZPool geschieht folgendermaßen:
zfs create -o mountpoint=/ fbsd/ROOT
Das für temporäre Dateien benötigte Verzeichnis erhält einen eigenen mit aktivierter Datenkompression versehenen Datensatz innerhalb des ZPool:
zfs create -o compression=on -o exec=on -o setuid=off fbsd/tmp chmod 1777 /mnt/tmp
Das Chmod-Kommando sorgt dafür, dass das Sticky-Bit gesetzt ist. Dadurch haben die User nur die Berechtigung, Dateien zu löschen oder zu verändern, die sie selber erzeugt haben. Die nächsten zwei Kommandos erzeugen die Datasets für das Betriebssystem:
zfs create fbsd/usr zfs create fbsd/usr/local
Die Partition für die Home Directories sollte man in einem separaten ZPool vorhalten. Für das Beispiel reicht es aus, die Home-Partition im ZPool »fbsd
«
anzulegen:
zfs create -o setuid=off fbsd/home
Die Abschnitte für den Portstree bedürfen einer genaueren Betrachtung. Im Verzeichnis »/usr/ports
«
ohne »/usr/ports/distfiles/
«
und »/usr/ports/packages/
«
liegen später Textdateien wie Makefiles und Patches, die sehr viel Speicherplatz benötigen. Die eingeschaltete Kompression reduziert den Speicherbedarf erheblich, da sich Textdateien sehr gut komprimieren lassen.
zfs create -o compression=lzjb -o setuid=off fbsd/usr/ports
Dagegen liegen in den Verzeichnissen »/usr/ports/distfiles
«
und »/usr/ports/packages
«
die heruntergeladenen Ports-Archive und die generierten Pakete. Das sind ausschließlich Binärdateien, die sich nur wenig komprimieren lassen. Daher wird für diese Verzeichnisse die Kompression abgeschaltet, was die Systemlast reduziert:
zfs create -o compression=off -o exec=off-o setuid=off fbsd/usr/ports/distfiles zfs create -o compression=off -o exec=off -o setuid=off fbsd/usr/ports/packages
Auch für das Verzeichnis »/var
«
bietet es sich an, durch aktivierte Kompression Speicherplatz zu sparen. Allerdings sollte man sich vorher überlegen, welche Art von Dateien in den einzelnen Unterverzeichnissen liegen sollen. In der Erfahrung des Autors hat sich die Struktur in Listing 1 als effizient erwiesen.
Listing 1
/var auf ZFS
Im Verzeichnis »/var/crash
«
landen Coredumps, die sehr groß werden und aus binären Daten und ASCII-Daten bestehen. Sie lassen sich daher gut komprimieren.
zfs create -o exec=on -o setuid=off fbsd/var/spool
Der Druckerspooler generiert ebenfalls Dateien von erheblicher Größe, weil die Postscript- oder PCL-Kommandos als reiner ASCII-Text zwischengespeichert werden. Weil die Kompression aber einiges an Rechenleistung erfordert, besteht bei schnell wachsenden Spool-Dateien die Gefahr der Überlastung. Aus diesem Grund sollte man hier keine Kompression aktivieren. Übrigens gilt diese Regel auch für Spool-Dateien des Maildienstes Postfix.