Dies ist eine alte Version des Dokuments!
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
- Autoexpand einschalten: Wenn man den Pool mal durch größere Festplatten erweitern möchte, muss diese Option vor dem Tausch der ersten Festplatte gesetzt werden. Dadurch steht die volle Größe der neuen Festplatten zur Verfügung, sobald alle Festplatten getauscht wurden.
pool
ist der Name des Pools.zpool set autoexpand=on pool
- Kompression einschalten! Dateien werden dann komprimiert gespeichert, was Speicherplatz spart. lz4 ist eine sehr schnelle Kompression, sodass kaum CPU-Leistung dafür benötigt wird.
zfs set compression=lz4 pool
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.
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/vm_1
Die Abbilder finden sich unter /dev/zvol/„poolname“/„ZVOLname“. Also z.B. „/dev/zvol/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!
- Synchrones Schreiben generell deaktivieren. Hier für das Dataset „dataset“ im Pool „pool“. ACHTUNG: Bei einem Stromausfall kann es zu unkontrolliertem Datenverlust kommen! Das Dateisystem wird aber konsistent bleiben. Dies sorgt z.B. für einen erheblich besseren Datendurchsatz beim Schreiben von vielen kleinen Dateien über NFS. Siehe auch http://milek.blogspot.de/2010/05/zfs-synchronous-vs-asynchronous-io.html milek.blogspot.de
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
.