1.149. ZFS auf FreeBSD
1.149.1. Was ist ZFS?
1.149.2. Anforderungen
ZFS hat leider relativ hohe Hardwareanforderungen. Um es wirklich sauber und schnell nutzen zu können, sollte das System unter FreeBSD/amd64 laufen und über mindestens ein Gigabyte RAM verfügen. Der Betrieb unter FreeBSD/i386 und auch mit weniger als einem Gigabyte RAM ist nur unter Einschränkungen möglich. Siehe hierzu http://wiki.freebsd.org/ZFSTuningGuide.
1.149.3. Implementationsstatus
ZFS ist mittlerweile stabiler Bestandteil von FreeBSD und kann bedenkenlos auch für Produktivsysteme eingesetzt werden. Mittlerweile ist auch das Booten von ZFS möglich. Das in FreeBSD eingesetzte ZFS basiert auf der OpenZFS-Entwicklung und unterstützt Featureflags. Als integraler Bestandteil von FreeBSD ist es seit einiger Zeit auch möglich während der Installation über den Installer ein System komplett auf ZFS aufsetzen zu lassen.
1.149.4. Zpool und ZFS
Ein Datensatz. Ein Datensatz ist das, was man im Sprachgebrauch als ZFS bezeichnet. Ein Datensatz wächst dynamisch, sprich er nimmt innerhalb des Pools genau soviel Platz ein, wie die Daten in ihm. Man kann ihm eine maximale Größe zuordnen und auch ein mindestmaß an Speicherplatz garantieren.
Ein Volume. Ein Volume entspricht einem herkömlichen Blockgerät. Es wird ein Gerät in /dev angelegt, welches mit einem normalen Dateisystem wie UFS2 formatiert werden oder als Swap genutzt werden kann. Dabei kann es trotzdem die Vorzüge des Zpools nutzen, wie Datenintegritätsprüfungen oder die sehr schnellen und günstigen Snapshots.
Ein Snapshot. Dies ist der eingefrorene Zustand eines Datensatzes oder eines Volumens.
1.149.5. Administration eines ZPool
Die Administration eines ZPool ist nicht sonderlich kompliziert, jeder der schon mit ähnlichen Systemen wie gmirror oder auch Raid-Controllern gearbeitet hat, dürfte schnell Ergebnisse erzielen. Aber auch für Anfänger sollte es sich schnell erschließen.
1.149.5.1. Anlegen eines Zpool
Angelegt wird ein ZPool mit dem Kommando
zpool create -m mountpunkt name art gerät1 gerät2 spare gerät3 gerät4
1.149.5.2. Löschen eines Zpool
Gelöscht wird ein Zpool mit dem Kommando
zpool destroy name
Dies Kommando hängt alle Datensätze aus, exportiert den Zpool und zerstört ihn. Dies geschieht ohne eine Sicherheitsnachfrage und alle Daten gehen dabei verloren!
1.149.5.3. Entfernen eines Gerätes aus einem ZPool
Ein Gerät wird aus einem ZPool entfernt mit
zpool remove gerät
Das Entfernen kann einige Zeit dauern, da die Daten erst umkopiert werden müssen. Außerdem muss der Pool alle seine Daten auch ohne das zu entfernende Gerät aufnehmen können. Aus einem RaidZ kann kein Gerät entfernt werden.
1.149.5.4. Hinzufügen eines Gerätes zu einem ZPool
Ein Gerät wird so in einen Zpool eingefügt
zpool attach name gerät
Das Gerät steht sofort zur Verfügung, ein Neuaufbauen ist nicht notwenig. Zu beachten ist, dass man zu einem RaidZ kein gerät hinzufügen kann und ein Spiegel zwei neue Geräte benötigt.
1.149.5.5. Ein Gerät ersetzen
Wer ein defektes oder zu kleines Gerät ersetzen möchte, kann dies mit diesem Kommando machen
zpool replace name altes_gerät neues_gerät
Die Daten werden dann umkopiert, was eine Weile dauern kann. Zu beachten ist, dass im Spiegel oder RaidZ das neue Gerät mindestens so groß wie das alte sein muss. Im RaidZ und im Mirror kann zusätzlicher Speicherplatz nicht verwendet werden bis alle Festplatten durch größere ausgetauscht wurden und der Zpool dazu angestoßen wird den größeren Platz zu nutzen.
1.149.5.6. Sonstiges
Dies waren die wichtigsten Kommandos. Desweiteren ist es möglich mittels
zpool list name
zpool export name
Daraufhin werden alle Datensätze ausgehängt und der Pool geschlossen. Wieder einfügen kann man ihn mittels
zpool import name
Eine Liste aller für den Import zur Verfügung stehenden Zpools kann man mit dem Kommando
zpool import
angezeigt werden.
Für weitere Möglichkeiten, wie dem Abschalten von Geräten innerhalb eines Pools oder dem Aktualisieren auf eine neuere ZFS Version sei wieder auf die Handbuchseite zpool(1) verwiesen.
1.149.6. ZFS
1.149.6.1. Das Konzept
1.149.6.2. Anlegen eines Datensatzes
Mit dem Kommando
zfs create pool/pfad/zu/datensatz
wird ein neuer Datensatz erstellt und an der angebenen Position relativ zur Wurzel des Zpool eingehängt. Eventuell fehlende Verzeichnisse werden dabei automatisch erstellt.
1.149.6.3. Löschen eines Datensatzes
Mit dem Kommando
zfs destroy pool/pfad/zu/datensatz
wird der gewählte Datensatz ausgehängt und zerstört. Die in ihm enthaltenen Daten sowie abhängende Snapshots werden zerstört.
<note tip> Sollten sich auf einem vollen zfs Datensatz mal keine Dateien mehr löschen lassen, mit dem Hinweis: No space left on device.
Kann man mit:
cp /dev/null <file auf dem vollen Datensatz>
eine Datei löschen um anschließend wieder regulär dateien mir rm löschen zu können. </note>
1.149.6.4. Verschieben und umbennen
Natürlich kann man einen Datensatz verschieben und umbenennen. Gibt man
zfs rename pool/pfad/zu/datensatz pool/neuer/pfad/zu/datensatz
ein verschiebt man den Datensatz innerhalb der ZFS-Hirachie.
1.149.6.5. Ändern von Optionen
Jeder Datensatz hat eine Unmenge von Einstellungsmöglichkeiten. Hier werden nur die wichtigsten durchgesprochen werden, für weitere sei auf die Manpage zfs(1) verwiesen. Gesetzt werden Einstellungen mit
zfs set option=wert pool/pfad/zu/datensatz
und mit
zfs get option pool/pfad/zu/datensatz
kann man sich den aktuellen Wert einer Variable ausgeben lassen. Wichtige Variablen sind:
quota=size gibt die maximale Größe des Datensatzes an. Als Modifikatoren sind k, m und g für Kilobyte, Megabyte und Gigabyte erlaubt.
reservation=size gibt den garantierten Speicherplatz für einen Datensatz an. Modifikatoren wie oben.
mountpoint=pfad Verzeichnis abhängig zum Wurzelverzeichnis des Systems, in dem der Datensatz eingehängt wird.
sharenfs=on|off muss eingeschaltet werden, um den Datensatz per NFS freizugeben. Eine temporäre Freigabe kann mittels „zfs share pool/pfad/zu/datensatz“ gemacht werden. Vorraussetzung ist, dass der NFS-Server in /etc/rc.conf aktiviert wurde.
compression=off|lzjb|gzip schaltet die Kompression ein. Dies betrifft nur neue Daten. lzjb ist schnell, gzip komprimiert gut.
atime=on|off gibt an, ob die „Accesstime“ beim Zugriff auf eine Datei neu gesetzt wird. Das Abschalten macht den Datensatz merklich schneller, kann aber auch viele Programme verwirren.
readonly=on|off macht wenn gesetzt den Datensatz unmodifizierbar.
jailed=on|off macht den Datensatz aus einem Jail heraus verwaltbar.
Die geänderten Optionen sind sofort wirksam, weitere Dinge neben dem Setzen sind nicht notwendig.
1.149.7. Snapshots und Klone
Einen wesentlichen Vorteil bietet ZFS durch seine - wie oben besprochen günstigen - Snapshots und die eng mit diesen verbundenen Klone, welche es erlauben komplette Datensätze in wenigen Sekunden zu kopieren. ZFS Snapshots sind deutlich günstiger als ihre Kollegen vom UFS2, weshalb man ohne bedenken auch sehr viele von ihnen parallel nutzen kann.
1.149.7.1. Erstellen eines Snapshots
Ein Snapshot wird mit dem Kommando
zfs snapshot datensatz@name
erstellt. Datensatz ist hierbei der Datensatz, von dem ein Snapshot erstellt werden soll und Name ist entsprechend der Name des Snapshots. Dies Benennungsschema ist vorgegeben, ein Snapshot heißt immer ursprung@eigener name. Der Snapshot „gutes_beispiel“ von /banane/test1 wäre also /banane/test1@gutes_beispiel.
1.149.7.2. Löschen eines Snapshots
Snapshots werden exat wie Datensätze gelöscht.
zfs destroy datensatz@name
Dies ist nicht möglich, wenn von dem Snapshot noch Dinge wie Klone abhängig sind.
1.149.7.3. Zurückrollen eines Snapshots
Mittels
zfs rollback datensatz@name
wird der per Snapshot gesicherte Datensatz innerhalb von Sekunden auf den Zustand des Snapshots zurückgesetzt. Alle Änderungen an ihm sind unwiderbringlich verloren. Der Snapshot wird dabei nicht gelöscht.
1.149.7.4. Zugriff auf Snapshots
Die Snapshots können mit
zfs list
angezeigt werden. Um auf sie zuzugreifen wechselt man in das unsichtbare Verzeichnis .zfs um Wurzelverzeichnis des Datensatzes. So befindet sich unser oben angelegter Snapshot in /banane/test1/.zfs/snapshot/gutes_beispiel/. Das das Verzeichnis unsichtbar ist bedeutet, dass Programme wie ls(1) oder die Autovervollständigung der Shell es nicht sehen können!
1.149.7.5. Klone erstellen
Klone sind nichts anderes als beschreibbare Snapshots. Zum derzeitigen Zeitpunkt können sie lediglich von Snapshots erstellt werden, nicht jedoch von Datensätzen. Daher muss man von einem Datensatz erst einen Snapshot erstellen, welchen man dann „klonen“ kann. Dieser Snapshot bildet die Grundlage für den Klon, dieser ist von ihm abhängig. Dieser Snapshot kann daher nicht gelöscht werden, solange Klons zu ihm existieren.
zfs clone snapshot pool/pfad/zu/klon
erstellt einen Klon und hängt ihm am angebenen Pfad relativ zur Wurzel des Zpool ein. Dort kann er wie ein normaler Datensatz behandelt werden. Leider können Klone zur Zeit nicht auf den Datensatz, von dem der ihm zugrundeliegende Snapshot stammt, zurückgerollt werden.
1.149.7.6. Klone in Datensätze umwandeln
Ein Klon kann jederzeit zu einem vollständigen Datensatz umgewandelt werden.
zfs promote pool/pfad/zu/klone
Hiernach ist der Klon ein normaler Datensatz und kann als solcher verwendet werden. Man kann den Datensatz allerdings nicht wieder in einen Klon zurückwandeln. Die Abhängigkeit zum Snapshot, welche der Klon hatte, verschwindet bei dieser Operation.
1.149.8. Andere Dateisysteme auf Zpool
Neben Datensätzen, Snapshots und Klonen kann auf einem Zpool wie oben bereits besprochen auch ein Volume erstellt werden. Dieser taucht in /dev/zvol als ein normales Gerät auf und kann mit jedem anderen Dateisystem formatiert werden. So kann jede Dateisystem auf die Vorteile des Zpool zurückgreifen. Mounten muss man allerdings herkömmlich, auch dateisystemspezifische Dinge wie fsck kann der Zpool nicht ersetzen.
1.149.8.1. Erstellen eines Volumes
Ein Volume wird wie ein Datensatz mit
zfs create -V größe pool/name
erstellt. Wobei Name der Name des Volumens ist und auch sein Gerät in /dev/zvol so heißt. Ein Volume muss immer im Wurzelverzeichnis des Zpool angelegt werden.
1.149.8.2. Warten eines Volumes
Ein Volume kann wie ein normaler Datensatz behandelt werden. Es können Snapshots erstellt und zurückgerollt werden, ebenso kann man wie bereits erklärt Klone nutzen. Sogar diverse Optionen können wie oben beschrieben eingestellt werden. Auch das Löschen läuft wie bei normalen Datensätzen ab.
1.149.8.3. Swap auf Zpool
Theoretisch ist es natürlich auch möglich ein Volume mittels swapon(8) als Swap zu nutzen. Dies ist derzeit allerdings sowohl unter FreeBSD als auch unter Solaris sehr problematisch. Das Problem ist, dass das System auf die Swap schreiben möchte, wenn es nur noch wenig Arbeitsspeicher zur Verfügung hat. Zpool benötigt aber sehr viel Arbeitsspeicher für seine Daten. Nun kann es dazu kommen, dass der Speicherbedarf von Zpool schneller steigt, als das System freiräumen kann. Es kommt zum Absturz. Daher ist von Swap auf Zpool dringenst abzuraten!
Zuletzt geändert: 2023-07-22