Dateisystem zfs (ZoL = ZFS on Linux)

zfs ist ein von Solaris kommendes Dateisystem, das einige Vorzüge in sich vereint, u.a.:

Vorteile im RAID-Betrieb

Linux-Distributionen, die ZoL unterstützen

Tipps

Partitionierung

Fehlererkennung

Boot-Problem: rpool kann nicht importiert werden

Tritt gerne nach Upgrade auf 20.04 auf.

Man landet dann auf dem initramfs-Prompt. Probiert man dort zpool import, kommt ein Hinweis, dass das Filesystem woanders importiert ist.

Wenn man sich sicher ist, dass das nicht der Fall ist, kann man via zpool import -f rpool es forcieren.

Boot-Problem: /var/cache kann nicht gemounted werden

Tritt oft direkt nach o.g. Problem auf. Ursache ist, dass das Verzeichnis /var/cache nicht leer ist und sich zfs daher weigert darauf zu mounten.

Lösungen:

Speicherverwaltungs-Konflikte?

Ich habe es schon erlebt, dass zfs irgendwie instabil war.

Man hatte den Eindruck, dass sich zfs und Linux sich um's RAM schlagen und es dabei manchmal nur Verlierer gibt. :-)

Abhilfe: Speicherverbrauch von ZFS limitieren, z.B. auf 8GB:

# /etc/modprobe.d/zfs.conf
options zfs zfs_arc_max=8589934592

Danach (wenn man zfs als root-Filesystem hat):

update-initramfs -u

Wichtige Kommandos

Mirror / RAID / Pool - Status checken

zpool status

Snapshot erstellen

Kann man z.B. vor größeren Änderungen (wie Upgrades) machen:

zfs snapshot -r rpool@before-upgrade-to-xxxx

Mirror: Datenträger ersetzen

# falls zu entfernender DT noch im Pool ist:
zpool detach rpool /dev/disk/by-id/<bad-disk>-partN

# dann neuen/leeren DT identisch partitionieren wie vorhandenen DT mit Daten

# Spiegel neu zusammenbauen:
zpool attach rpool /dev/disk/by-id/<existing-disk-with-data>-partN /dev/disk/by-id/<new-disk-empty>-partN

# danach sollte es alle benutzten Datenblöcke auf die leere Disk-Partition kopieren "resilvering"...
zpool status

Mirror erzeugen aus einzelnem Datenträger

# leere GPT-Partitiontable auf neuem/leeren DT anlegen, z.B. mit fdisk

# Spiegel erzeugen (wenn man die ganzen Disks angibt, macht es auf der neuen eine entspr. Partitionierung):
zpool attach rpool /dev/disk/by-id/<existing-disk-with-data> /dev/disk/by-id/<new-disk-empty>

# danach sollte es alle benutzten Datenblöcke auf die leere Disk-Partition kopieren "resilvering"...
zpool status

Verschlüsselung

/!\ Kombination von Verschlüsselung mit ZFS-Kompression und/oder ZFS-Deduplikation ist potentiell problematisch.

Platzbedarf: ein ansonsten minimales Debian 11 rootfs mit zfs-dkms (und dessen Abhängigkeiten) hat ca. 1.5GB belegten Platz.

zpool create rpool mirror /dev/disk/by-id/<disk1>-partN /dev/disk/by-id/<disk2>-partN
zpool set feature@encryption=enabled rpool
zfs create -o encryption=aes-256-ccm -o keyformat=passphrase rpool/ccm
zfs create -o encryption=aes-256-gcm -o keyformat=passphrase rpool/gcm  # aes-256-gcm is default in OpenZFS >= 0.8.4
zfs create -o encryption=off rpool/none

gcm war in meinen Versuchen beim Lesen ca. doppelt so schnell wie ccm. Beim Schreiben war die Geschwindigkeit ähnlich.

Test-Umgebung: Virtualbox VM auf Xeon E5-2667v2 Workstation (HW mit AES-NI).

zfs mount -a -l    # alle FSe mounten, inkl. verschlüsselte
zfs umount -a      # alle FSe umounten - Vorsicht: danach ist key immer noch im RAM geladen!
zfs unload-key -a  # alle Keys aus dem RAM entladen.