Storage & Protokolle
ZFS
ZFS ist ein Copy-on-Write-Dateisystem mit integriertem Volume-Management, Snapshots und Prüfsummen, das stille Datenfehler erkennt und repariert.
- Copy-on-Write
- Prüfsummen & Self-Healing
- Mirror / RAIDZ / dRAID
- Snapshots & Replikation
- Native Verschlüsselung
ZFS ist Dateisystem und Volume-Manager in einem: Es verwaltet die Datenträger selbst, fasst sie zu einem Pool zusammen und sichert jeden Block mit einer Prüfsumme ab. Dadurch erkennt und repariert es stille Datenfehler (Bit Rot), die klassische Dateisysteme übersehen. Entwickelt wurde es bei Sun für Solaris; heute wird es als OpenZFS quelloffen und plattformübergreifend (Linux, FreeBSD, illumos) weiterentwickelt.
Dieser Artikel erklärt den Aufbau aus Pool und vdevs, die Redundanzvarianten von Mirror über RAIDZ bis dRAID, wie ZFS Datenintegrität sichert, wie Arbeitsspeicher (ARC), Schreibpfad (ZIL/SLOG) und Tuning zusammenhängen und welche modernen Funktionen aktuelle OpenZFS-Versionen mitbringen.
1. Was ZFS ist: Pooled Storage und Copy-on-Write
ZFS verbindet zwei Aufgaben, die sonst getrennt sind: das Dateisystem und die Verwaltung der Datenträger (Volume-Management). Weil ZFS den gesamten Weg vom logischen Block bis zur physischen Platte kennt, kann es durchgehend für Integrität und Konsistenz sorgen, statt einer darunterliegenden RAID- oder LVM-Schicht zu vertrauen.
Statt einzelne Partitionen zu formatieren, fasst ZFS Datenträger zu einem Pool (zpool) zusammen, aus dem sich Dateisysteme (Datasets) und Block-Geräte (zvols) bedienen. Der Speicher wird dynamisch zugeteilt; feste Partitionsgrenzen entfallen.
Kern ist das Copy-on-Write-Prinzip: ZFS überschreibt nie einen bestehenden Block, sondern schreibt geänderte Daten an eine neue Stelle und hängt erst danach den Verweis um. Schreibvorgänge werden in Transaktionsgruppen gesammelt und etwa alle fünf Sekunden mit einem atomar geschriebenen Uberblock „committet“. Ein unterbrochener Commit lässt schlicht den alten, gültigen Zustand stehen, es gibt keinen halb geschriebenen Zwischenzustand. Aus demselben Grund kennt ZFS kein RAID-Write-Hole.
2. Pool, vdevs und Hilfsklassen
Ein Pool besteht aus einem oder mehreren vdevs (virtuelle Geräte). Daten werden über alle Daten-vdevs verteilt; die Redundanz wird je vdev festgelegt, nicht für den ganzen Pool. Wichtig: Ein Pool ist nur so ausfallsicher wie sein schwächstes Daten-vdev, denn fällt ein vdev komplett aus, ist der ganze Pool verloren.
Neben den Daten-vdevs kennt ZFS spezialisierte Hilfsklassen, mit denen sich Schreib- und Leselast gezielt auf schnelle Geräte verlagern lässt:
| vdev-Klasse | Aufgabe |
|---|---|
| Daten-vdev | Hält die Nutzdaten, als Mirror, RAIDZ, dRAID oder Einzelplatte |
| log / SLOG | Separates schnelles Gerät für das ZFS Intent Log, beschleunigt synchrone Writes |
| cache / L2ARC | SSD-Lese-Cache hinter dem RAM-Cache (ARC), seit OpenZFS 2.0 reboot-persistent |
| special | Metadaten und optional kleine Blöcke auf SSD/NVMe (deutlich schnellerer Random-Zugriff) |
| spare | Hot-Spare, springt bei einem Plattenausfall automatisch ein |
Special- und SLOG-vdevs spiegeln
Ein special-vdev hält primäre Daten (Metadaten), kein Cache: Fällt es aus, ist der Pool verloren. Es gehört daher gespiegelt, ebenso ein SLOG. Reine Cache-vdevs (L2ARC) sind unkritisch, ihr Ausfall kostet nur Cache.
3. Redundanz: Mirror, RAIDZ und dRAID
ZFS bringt sein RAID selbst mit, es braucht keinen Hardware-RAID-Controller. Drei Bauformen decken unterschiedliche Anforderungen ab:
| vdev-Typ | Ausfalltoleranz | Charakteristik |
|---|---|---|
| Mirror | n-1 von n Platten | Beste Random-IOPS (Lesen von allen Spiegeln), schnelles Resilver; Nutzkapazität = eine Platte. Erste Wahl für VM-Storage |
| RAIDZ1/2/3 | 1, 2 oder 3 Platten | Verteilte Parität, kapazitätseffizient; variable Stripebreite. Resilver bei großen Pools langsam (Random-IO über alle Platten) |
| dRAID | 1–3 (+ verteilte Spares) | Feste Stripebreite mit integrierten Spares, sequentielles Resilver in Stunden statt Tagen; für sehr große Pools (seit OpenZFS 2.1) |
RAIDZ-Erweiterung seit OpenZFS 2.3
Lange war ein RAIDZ-vdev nicht erweiterbar. Seit OpenZFS 2.3 (Anfang 2025) lässt sich einem bestehenden RAIDZ-vdev online eine einzelne Platte hinzufügen (zpool attach); die Daten werden dabei im Hintergrund neu verteilt. Was sich weiterhin nicht ändern lässt, ist das RAIDZ-Level selbst (aus RAIDZ1 wird kein RAIDZ2).
4. Datenintegrität: Prüfsummen, Scrub und Self-Healing
Jeder Block trägt eine Prüfsumme, die nicht im Block selbst, sondern im verweisenden Block liegt. Beim Lesen prüft ZFS sie und erkennt so stille Datenfehler, die andere Dateisysteme unbemerkt durchreichen. Voreingestellt ist das schnelle fletcher4; für besondere Anforderungen stehen kryptografische Verfahren wie sha256 oder das schnelle blake3 (neuere OpenZFS-Versionen) bereit, daneben weitere Algorithmen.
Liegt Redundanz vor (Mirror oder RAIDZ), repariert ZFS einen als fehlerhaft erkannten Block sofort aus der intakten Kopie, sowohl beim normalen Lesen als auch beim regelmäßigen Scrub, der den gesamten Pool durchliest. Ein monatlicher Scrub gehört zum Pflichtprogramm, um schleichende Fehler vor dem Ernstfall zu finden.
Scrub anstoßen und Pool-Status prüfen
zpool scrub tank
zpool status -v tank Warum ECC-RAM empfohlen ist
ZFS schützt Daten auf dem Datenträger, nicht im Arbeitsspeicher. Kippt ein Bit im RAM, bevor die Prüfsumme gebildet wird, errechnet ZFS eine gültige Prüfsumme für bereits verfälschte Daten und kann den Fehler nicht mehr erkennen. ECC-RAM fängt das auf Hardware-Ebene ab und ist für Produktivdaten dringend zu empfehlen (Pflicht ist es nicht).
ZFS muss die Datenträger direkt sehen. Ein Hardware-RAID-Controller davor verbirgt die einzelnen Platten, meldet Sektorgrößen falsch und nimmt ZFS die Selbstheilung. Richtig ist ein HBA im IT-Mode (JBOD), nicht ein RAID-Controller.
5. Arbeitsspeicher: ARC und L2ARC
ZFS hält im RAM einen adaptiven Lese-Cache, den ARC. Er gewichtet zwischen zuletzt und häufig genutzten Daten und passt seine Größe dynamisch an. Mehr RAM bedeutet in der Regel deutlich mehr Leseleistung; der ARC nutzt standardmäßig einen Großteil des freien Arbeitsspeichers und gibt ihn bei Bedarf wieder frei. Auf RAM-knappen Systemen lässt sich die Obergrenze über zfs_arc_max begrenzen.
Reicht der RAM nicht, kann eine SSD als L2ARC den Cache verlängern. Sie ist seit OpenZFS 2.0 reboot-persistent, kostet aber selbst etwas ARC für ihre Verwaltung und lohnt erst, wenn der RAM ausgereizt ist. Für viele kleine Random-Reads bringt ein special-vdev (Metadaten und kleine Blöcke auf NVMe) oft mehr als ein L2ARC.
6. Schreibpfad: synchrone vs. asynchrone Writes, ZIL und SLOG
ZFS sammelt alle Writes in Transaktionsgruppen und schreibt sie gebündelt. Synchrone Writes (etwa von Datenbanken, NFS oder iSCSI) müssen aber sofort bestätigt werden. Dafür gibt es das ZFS Intent Log (ZIL): Es protokolliert synchrone Writes, sodass der aufrufende Prozess zurückkehren kann; im Normalbetrieb wird das ZIL nie gelesen, sondern nur nach einem Absturz für das Replay.
Standardmäßig liegt das ZIL im Pool. Ein separates, sehr schnelles Gerät (SLOG) lagert es aus und beschleunigt so ausschließlich synchrone Schreiblast. Bei rein asynchronen Workloads (Backups, Bulk-Kopien) bringt ein SLOG nichts.
| sync-Modus | Verhalten | Einsatz |
|---|---|---|
| standard | POSIX-konform: nur explizit synchrone Writes laufen über das ZIL | Default, für die meisten Fälle richtig |
| always | Jeder Write wird synchron über das ZIL bestätigt | Maximale Sicherheit, kostet Durchsatz |
| disabled | Auch synchrone Writes werden nur asynchron behandelt | Nur für wegwerfbare Daten, Datenverlust bei Absturz |
sync=disabled belügt Anwendungen: Ein bestätigtes fsync() ist dann nicht wirklich auf der Platte. Bei Stromausfall gehen diese Writes verloren. Für Datenbanken, NFS und VM-Storage ist das keine Option. Ein SLOG ohne Power-Loss-Protection ist genauso riskant, denn er soll ja gerade vor genau diesem Verlust schützen.
7. Tuning: recordsize, ashift, Kompression, Direct I/O
ZFS lässt sich über Dataset-Properties fein an den Workload anpassen. Die wichtigsten Stellschrauben:
- recordsize maximale Blockgröße eines Datasets (Default 128K). Für Datenbanken an die Seitengröße angleichen (z. B. 16K für InnoDB), für große Mediendateien und Backups hoch (bis 1M). Wirkt nur auf neu geschriebene Daten.
- volblocksize Blockgröße für zvols (VM-Disks), auf aktuellen OpenZFS-Versionen 16K, nur bei Anlage setzbar. An das Gast-Dateisystem angleichen.
- ashift physische Sektorgröße des Pools.
ashift=12(4K) für praktisch alle modernen Geräte. Nach der Pool-Anlage nicht mehr änderbar, also vorher richtig setzen. - compression lz4 ist der De-facto-Standard (kaum CPU-Kosten, spart Platz und oft sogar IO); zstd (seit OpenZFS 2.0) für bessere Kompressionsraten bei Archiv- und Backup-Daten.
- atime auf Servern meist auf
offoderrelatime, sonst erzeugt jeder Lesezugriff einen Schreibvorgang. - Direct I/O seit OpenZFS 2.3 kann der ARC für O_DIRECT-Zugriffe umgangen werden, relevant für schnelle NVMe-Arrays und Datenbanken mit eigenem Cache.
Dataset mit workload-passenden Properties anlegen
zfs create -o recordsize=16K -o compression=lz4 tank/postgres 8. Snapshots, Clones, Replikation und Verschlüsselung
Dank Copy-on-Write sind Snapshots nahezu kostenlos und in Sekunden erstellt; sie belegen nur den Speicher der seither geänderten Blöcke. Aus einem Snapshot lässt sich ein beschreibbarer Clone ableiten (etwa für Test- oder Vorlagensysteme), und ein Bookmark bewahrt die Information für inkrementelle Übertragungen, ohne die Datenblöcke zu halten.
Mit zfs send/receive wird ein Snapshot als Datenstrom auf ein anderes System übertragen, inkrementell überträgt es nur die geänderten Blöcke. Das ist eine robuste Basis für Backups und Standort-Replikation. Ein Snapshot auf demselben Pool ist allerdings kein Backup; dafür braucht es ein getrenntes Ziel.
Die native Verschlüsselung arbeitet pro Dataset (Default AES-256-GCM). Besonders praktisch fürs Backup: Mit einem verschlüsselten Raw-Send (zfs send -w) gelangen die Daten verschlüsselt auf ein nicht vertrauenswürdiges Ziel, ohne dort je entschlüsselt zu werden.
Snapshot anlegen und inkrementell replizieren
zfs snapshot tank/home@2026-06-18
zfs send -i tank/home@2026-06-17 tank/home@2026-06-18 | ssh backup zfs receive backup/home 9. Deduplizierung: Vorsicht, und das neue Fast Dedup
ZFS kann identische Blöcke deduplizieren. Klassische Dedup führt dafür eine pool-weite Tabelle (DDT), die für akzeptable Leistung im RAM gehalten werden muss und mit der Zahl der Blöcke wächst, also stark von der Blockgröße abhängt. Läuft sie aus dem RAM, bricht die Leistung ein. Deshalb gilt seit jeher: im Zweifel Kompression statt Dedup.
Das mit OpenZFS 2.3 eingeführte Fast Dedup entschärft die schlimmsten Fallstricke (gepufferte DDT-Schreibvorgänge, harte Größenobergrenze per Quota, Prefetch und gezieltes Aufräumen) und macht die Tabelle steuerbar. Ressourcenintensiv bleibt es trotzdem, ein bewusster Sonderfall, kein Standard.
10. Block-Cloning: Kopien ohne Duplizieren
Mit OpenZFS 2.2 kam Block-Cloning (Reflinks): Wird eine Datei kopiert, legt ZFS keine zweite Datenkopie an, sondern lässt beide Dateien auf dieselben Blöcke zeigen und trennt sie erst beim Überschreiben (dateiweises Copy-on-Write). Anders als Deduplizierung braucht das keine teure pool-weite Tabelle und ist im Normalbetrieb praktisch gratis.
Genutzt wird es transparent über cp --reflink=auto, den Kernel-Aufruf copy_file_range() sowie Copy-Offload bei NFS und Samba. Seit OpenZFS 2.3 ist Block-Cloning standardmäßig aktiv. Für das Kopieren identischer Daten ist es der ressourcenschonende Weg, den die klassische Deduplizierung nicht bietet.
11. Best Practices und Fallstricke
- Kein Hardware-RAID ZFS gehören die Platten direkt (HBA/IT-Mode), sonst entfällt die Selbstheilung.
- Pool nicht randvoll ab etwa 80–90 % Füllstand leidet bei Schreib-/Löschlast die Leistung; etwas Puffer einplanen.
- Layout vorab planen ashift und RAIDZ-Level lassen sich nicht nachträglich ändern; eine RAIDZ-Erweiterung um Platten geht seit 2.3, ein Level-Wechsel nicht.
- Regelmäßige Scrubs z. B. monatlich, zur Früherkennung schleichender Fehler.
- SLOG nur gezielt nur bei synchroner Last und nur mit Power-Loss-Protection.
- ECC-RAM für Produktivdaten dringend empfohlen.
- Feature-Flags beachten ZFS hat keine lineare Pool-Version, sondern Feature-Flags. Ein Pool, der neue Features aktiviert hat, lässt sich auf älteren OpenZFS-Versionen nicht mehr (schreibend) importieren; vor einem Host- oder Distributions-Upgrade prüfen.
- TRIM für SSDs auf SSD-Pools
autotrim=onsetzen oder regelmäßigzpool trimausführen, das erhält Schreibleistung und Lebensdauer.
12. Stärken und Grenzen
| Stärken | Grenzen |
|---|---|
| End-to-End-Prüfsummen mit Selbstheilung im Mirror-/RAIDZ-Verbund | Selbstheilung braucht Redundanz; eine Einzelplatte erkennt Fehler nur, repariert ihn aber nicht |
| Copy-on-Write: konsistente Zustände, kein RAID-Write-Hole | vdev-Layout (ashift, RAIDZ-Level) ist nachträglich nur eingeschränkt änderbar |
| Dateisystem, Volume-Manager und Software-RAID in einem | RAM-hungrig (ARC); ECC-RAM für Produktivdaten dringend empfohlen |
| Sekundenschnelle Snapshots und inkrementelle Replikation (send/receive) | Snapshots ersetzen kein externes Backup |
| Native Per-Dataset-Verschlüsselung (AES-256-GCM, Raw-Send) | Deduplizierung bleibt ressourcenintensiv, auch mit Fast Dedup |
| Kompression (lz4/zstd) meist ohne spürbaren Nachteil | Unter Linux nicht im Mainline-Kernel (CDDL/GPL), Einbindung als Kernelmodul |
13. Typische Einsatzfelder
- Datei-/NAS-Server RAIDZ2 für Kapazität, Mirror für IOPS; ein special-vdev beschleunigt Metadaten und kleine Dateien.
- VM-Storage (lokal oder exportiert) Mirror-vdevs für IOPS, zvols mit passender volblocksize, großzügiger ARC, SLOG bei intensiver synchroner Last. ZFS dient dabei jedem Hypervisor: lokal auf dem Host oder über iSCSI, NFS oder NVMe-over-Fabrics an beliebige Plattformen angebunden.
- Backup-Ziele zstd-Kompression, große recordsize, inkrementelle Replikation per zfs send/receive auf ein getrenntes System.
- Datenbanken recordsize an die Seitengröße angleichen, ARC ggf. auf Metadaten beschränken, wenn die DB selbst cached.
Auch der Autor ist nur ein Mensch, dem Fehler unterlaufen können. Wenn in diesem Beitrag etwas nicht stimmt oder unklar ist, freuen wir uns über einen kurzen Hinweis über das Kontaktformular unten, wir prüfen und korrigieren das.
Der nächste Schritt
ZFS im eigenen Haus richtig einsetzen?
Wir klären, ob und wie der Baustein zu Ihrer Infrastruktur passt, und sagen offen, wann sich der Aufwand lohnt und wann nicht.