Inhaltsverzeichnis

ZFS

ZFS ist ein Dateisystem, das sich sehr gut für große Datenmengen eignet. Es sollten aber auch entsprechende Hardwarevoraussetzungen vorhanden sein.

Informationen

Eine Seite, die ZFS gut erklärt ist pthree.org.

ZFS on Linux

Ich verwende ZFS on Linux auf einem Debian-Server. Homepage von ZFS on Linux

zpool erstellen

Es sollte immer die ID einer Festplatte / Partition verwendet werden, da sich die Laufwerksbuchstaben (/dev/sda, /dev/sdb, etc.) bei einem Neustart des Systems ändern können. Die Option -o ashift=12 sollte bei Festplatten mit 4KB-Sektoren unbedingt verwendet werden, um die volle Performance zu erreichen. Diese sorgt für ein korrektes Alignment der Partitionen.

zpool mit einem zmirror (RAID1) erstellen

zpool create -o ashift=12 home mirror /dev/disk/by-id/ID_DER_FESTPLATTE1  /dev/disk/by-id/ID_DER_FESTPLATTE2

Im Beispiel ist home der Name des zu erstellenden zpools. Dieser wird dann direkt unter / eingebunden. Es kann ein beliebiger Name für den Pool vergeben werden.
mirror gibt an, dass ein Pool mit gespiegelten Festplatten erstellt werden soll. Am Ende werden die Pfade zu den Festplatten angegeben. Es sind alle Festplatten anzugeben, die für den Spiegel verwendet werden sollen. Es sind auch Partitionen möglich. Wenn eine ganze Festplatte angegeben wird, erstellt zfs die Partitionen selbstständig.

zpool mit einem raidz erstellen

zpool create -o ashift=12 data raidz2 /dev/disk/by-id/ID_DER_FESTPLATTE1 /dev/disk/by-id/ID_DER_FESTPLATTE2 /dev/disk/by-id/ID_DER_FESTPLATTE3 /dev/disk/by-id/ID_DER_FESTPLATTE4 usw.

Im Beispiel wird ein raidz2 erstellt. Dies entspricht etwa RAID6. D.h. es dürfen bis zu zwei beliebige Festplatten ausfallen, ohne dass es zu Datenverlust kommt. weitere mögliche raidz-Level sind raidz1 für einfache Parität (RAID5), und raidz3 mit dreifacher Parität (Es dürfen bis zu drei Festplatten ausfallen).
data ist der Name des Pools. Er wird direkt unter / eingebunden. Ein Eintrag in /etc/fstab ist nicht notwendig!

weitere sinnvolle Optionen

ZIL (Log) hinzufügen

zpool add -o ashift=12 pool log mirror ID_SSD_1 ID_SSD_2

Fügt dem Pool pool einen ZIL-log Spiegel hinzu. Durch den ZIL werden Synchrone Schreibzugriife beschleunigt. NFS profitiert hiervon massiv! Für den ZIL wird nur wenig Speicher benötigt. Es genügt z.B. eine kleine Partition auf einer SSD. Der Restliche Speicherplatz der SSD kann gut als L2ARC verwendet werden.

L2ARC (Cache) hinzufügen

zpool add -o ashift=12 pool cache ID_SSD

Fügt dem Pool pool einen Cache hinzu. Häufige Lesezugriffe auf die gleichen Daten profitieren vom Cache. Als Cache sollte eine SSD verwendet werden. Man kann z.B. auch eine SSD entsprechend partitionieren und eine kleine Partition für den ZIL verwenden.

Special Device hinzufügen

zpool add -o ashift=12 pool special mirror ID_SSD1 ID_SSD2

Auf dem Special-Device werden die Metadaten gespeichert. Dadurch ggf. enormer Performance-gewinn. Das Redundanzlevel sollte dem des Pools entsprechen, da beim Ausfall der komplette Pool verloren ist. Die nötige Kapazität der SSD hängt vom Datenbestand ab. Falls die SSD voll ist, werden weitere Metadaten auf den Haupt-Pool geschrieben.

kleine Blöcke auf Special Device auslagern

Um die Performance beim schreiben/lesen von (sehr) kleinen Dateien zu verbessern, können kleine Datenblöcke auf dem Special Device, statt auf den normalen Datasets gespeichert werden. Dazu gibt man die maximale Größe von Blöcken an, die auf dem Special Device gespeichert werden sollen. Blöcke, die größer als die angegebene Größe sind, werden auf den regulären Datasets gespeichert. Datenblöcke mit max. der angegebenen Größe werden auf dem Special Device gespeichert.

zfs set special_small_blocks=16K pool

Ab jetzt werden Blöcke bis 16kB auf dem Special Device gespeichert. Es ist möglich, diese Option für jedes Dataset separat und unabhängig einzustellen.

ACHTUNG: Die angegebene Blockgröße special_small_blocks solte immer kleiner sein, als die Blockgröße des Pools (standard: 128K)! Wenn special_small_blocks gleich der Blockgröße des Pools gesetzt wird, wird ALLES ins Special Device geschrieben!

TRIM für SSDs

Wenn man einen SSD-Pool hat, kann es sinnvoll sein, TRIM zu aktivieren. Dies kann die Schreibperformance verbessern. autotrim meldet der SSD nach einem Löschvorgang automatisch nicht mehr benötigte Blöcke. Dies ist ein schneller Vorgang, weil nur Blöcke gemeldet werden, die gerade gelöscht wurden.

zpool set autotrim=on pool

Einstellung kann überprüft werden mit:

zpool get autotrim

Auf Debian gibt es noch die Option periodic-trim. Dies kann aktiviert werden mit

zfs set org.debian:periodic-trim=enable pool

Wenn man diese Option aktiviert, wird der Pool am ersten Sonntag im Monat vollständig getrimmt.

Die beiden Optionen autotrim und periodic-trim dürfen beide zusammen aktiviert werden. Dann werden die SSDs nach jedem löschen schnell getrimmt, und jeden Monat noch mal vollständig.

Es ist auch möglich einen Pool manuell zu trimmen. Dazu führt man folgendes Kommando aus.

zpool trim pool

Datasets erstellen

Es ist empfehlenswert direkt in den Pools keine Daten zu speichern, da sonst einige tolle Funktionen von ZFS nicht sinnvoll genutzt werden können. Daher sollte man sogenannte Datasets anlegen. Diese stellen quasi Unterdateisysteme dar. Es kann z.B. auch sinnvoll sein für jeden Benutzer ein eigenes Dataset unter /home zu erstellen. Dadurch ist es auch sehr einfach möglich, für jeden Benutzer ein individuelles Quota einzurichten.

zfs create home/benutzer1

Erstellt ein Dataset benutzer1 im Pool home.
Eine Übersicht aller ZFS-Dateisysteme anzeigen:

zfs list

Datasets in anderes Verzeichnis mounten

Datasets können einfach an einen beliebigen Ort im Verzeichnisbaum gemountet werden. Dafür gibt es die Option mountpoint.

zfs set mountpoint=/pfad/zum/neuen/mountpunkt pool/dataset

Mountet pool/dataset auf /pfad/zum/neuen/mountpunkt

Quota

Für die Datasets können Quotas gesetzt werden, sodass diese eine maximal vorgegebene Größe nicht überschreiten können.

zfs set quota=100G home/benutzer1

Legt für das Dataset home/benutzer1 eine Maximalgröße von 100GB fest.

Exportieren der Dateisysteme über NFS

ZFS Kann die NFS-Exports selbst verwalten. Es muss dann nichts in /etc/exports eingetragen werden. Es wird allerdings ein Dummy-Export benötigt, weil sonst der NFS-Kernel-Server nicht startet. Dieser kann z.B. so aussehen:

# Dummy Export zum starten des NFS-Servers fuer ZFS
/mnt/dummy	localhost

Einen NFS-Export erstellt man dann mit ZFS:

zfs set sharenfs="rw=@192.168.2.0/24" pool/dataset

Dies exportiert das Dataset pool/dataset und alle untergeordneten Datasets an alle Rechner im Netz 192.168.2.0/24.
rw sorgt dafür, dass die Clients auch schreiben dürfen.
Alternativ kann der Export natürlich auch wie gewohnt in die Datei /etc/exports eingetragen werden. Man sollte sich aber auf eine Variante festlegen, damit man nicht wahnsinnig wird.

ZVOLs

ZVOLs bilden virtuelle Datenträger auf ZFS ab. Diese können z.B. als virtuelle Festplatte von Virtuellen Maschinen (VMs) verwendet werden.

ZVOL erstellen

Ein ZVOL mit einer Kapazität von 10GB auf dem Pool „pool“ erstellen:

zfs create -V 10G pool/zvol_1

Die Abbilder finden sich unter /dev/zvol/„poolname“/„ZVOLname“. Also z.B. „/dev/zvol/pool/vm_1“.

ZVOL für VMs

Gängige Dateisysteme verwenden eine Blockgröße von 4 kiB (4096 Bytes). Die standardblockgröße von ZVOLs ist aber 8kiB (8192 Bytes). Um optimale performannce zu erreichen, sollten ZVOLs für VMs mit einer Blockgröße von 4kiB erzeugt werden. Die Blockgröße eines ZVOL kann nachträglich nicht mehr geändert werden.

zfs create -b 4K -V 10G pool/vm_1

ZVOL vergrößern

Das ZVOL „vm_1“ auf „pool“ auf 20GB vergrößern:

zfs set volsize=20G pool/vm_1

Anschließend kann man mit der VM GParted booten und die Partitionen entsprechend vergrößern.

böse Tuning-Optionen

Wenn du nicht weißt, was du tust, solltest du diese Optionen nicht anwenden!

zfs set sync=disabled pool/dataset

ACHTUNG: wahrscheinlich ist es sinnvoller stattdessen dem Pool ein Log-Device (ZIL) hinzuzufügen!

Defekte Festplatte ersetzen

zpool replace -o ashift=12 pool alte_Festplatte neue_Festplatte

Ersetzt alte_Festplatte durch neue_Festplatte. Festplatten-IDs verwenden, wie beim Erstellen eines ZPools.

Festplatten hinzufügen / entfernen

Dies funktioniert nur mit einfachen Spiegeln (mirror) oder einzelnen Festplatten. (und natürlich bei Pools aus mehreren Mirrors.)

Festplatte hinzufügen

zpool attach -o ashift=12 pool vorhandene_Festplatte neue_Festplatte

Fügt der Festplatte vorhandene_Festplatte den Spiegel neue_Festplatte hinzu.
Man kann auch einem Spiegel eine weitere Festplatte hinzufügen. Dazu genauso vorgehen, und als vorhandene_Festplatte eine beliebige Festplatte des Spiegels angeben.

Festplatte entfernen

zpool detach pool Festplatte

Entfernt Festplatte aus dem Pool pool.