Mit den Tipps und Workshops im ADMIN-Magazin 03/2013 sichern Administratoren ihre Webserver und Netze gegen Angriffe ab: gegen Abhören sensibler Informationen, ... (mehr)

ZFS als Root-Partition

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.

FreeBSD-Dateisystem

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.

comments powered by Disqus

Artikel der Woche

Loadtests ohne Server

Für Loadtests der eigenen Server bietet sich die Cloud an, denn kurz getaktet lassen sich dort viele Rechnerinstanzen starten, die das eigene Budget nur wenig belasten. Noch flexibler, günstiger und besser skalierbar sind Tests mit einer Serverless-Infrastruktur wie AWS Lambda. Wir führen vor, wie Sie dort mit Serverless Artillery eigene Loadtests starten. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018

Microsite