# ZFS (Dateisystem)

ZFS ist ein von Sun Microsystems entwickeltes transaktionales Dateisystem, das zahlreiche Erweiterungen für die Verwendung im Server- und Rechenzentrumsbereich enthält. Hierzu zählen die vergleichsweise große maximale Dateisystemgröße, eine einfache Verwaltung selbst komplexer Konfigurationen, die integrierten RAID-Funktionalitäten, das Volume-Management sowie der prüfsummenbasierte Schutz vor Datenübertragungsfehlern. Der Name ZFS stand ursprünglich für Zettabyte File System, ist aber inzwischen ein Pseudo-Akronym. Das Wort Zettabyte hat mit dem aktuellen Dateisystem keinen Zusammenhang.

## Eigenschaften

ZFS ist ein 128-Bit Copy-On-Write-Dateisystem mit einer im Vergleich zu herkömmlichen Dateisystemen deutlich erweiterten Funktionalität. Bei herkömmlichen Dateisystemen verwaltet genau ein Dateisystem genau eine Partition. Sollen mehrere physische Partitionen zu logischen Partitionen zusammengefasst werden, muss hierzu eine zusätzliche Logical-Volume-Manager-Software installiert werden. Zur Ausfallsicherung können viele Dateisysteme zusätzlich durch ein optionales softwarebasiertes RAID-Subsystem (Software-RAID) abgesichert werden. ZFS fasst diese drei Funktionen zusammen und ergänzt diese um einen prüfsummenbasierten Schutz vor Datenübertragungsfehlern.

### Datenträger-Pools

In der Praxis werden zunächst aus physischen Datenträgern (eigentlich Datenspeicher-Geräten) logische Einheiten – sogenannte Pools (bzw. zPools) – gebildet, welche optional auch ausfallsicher ausgelegt sein können (RAID). Innerhalb eines Pools können dann beliebig viele logische Partitionen (mit je einem Dateisystem) angelegt werden, wobei diese, soweit es die Größe des Pools zulässt, dynamisch wachsen, aber auch verkleinert werden können. Um administrative Einschränkungen durchzusetzen, kann für jede logische Partition eine minimale und maximale Größe vorgegeben werden. Die logischen Partitionen können dabei in eine hierarchische Struktur eingebettet werden, innerhalb derer diese und andere Parameter auch vererbt werden können. Weiterhin ist es möglich, Datenbereiche aus Pools als dedizierte „Block-Devices“ (siehe auch Datenblock-orientierte Geräte) zur Verfügung zu stellen.
Die zweite Besonderheit von ZFS ist die besonders einfache Administration. Um einen Pool über mehrere Festplatten zu erzeugen und auf diesem eine Partition anzulegen, werden lediglich zwei einfach strukturierte Befehle benötigt. Das Partitionieren, Aufbauen des logischen Volumens und schließlich das Einhängen ins bestehende Dateisystem werden automatisch erledigt, können aber bei Bedarf auch manuell vorgenommen werden.

### Ausfallsicherheit
#### Redundanz

Wie bei einem klassischen Volume-Manager können die zugrunde liegenden Pools ausfallsicher angelegt sein. Hierzu werden aus mehreren physischen Datenträgern per Software-RAID sogenannte Redundanz-Gruppen gebildet, eine oder mehrere dieser redundanten Gruppen bilden dann einen ausfallsicheren Pool. Das in das Dateisystem integrierte RAID-Subsystem bietet gegenüber klassischen Hardware- oder Software-Raid-Implementierungen den Vorteil, dass zwischen belegten und freien Datenblöcken unterschieden werden kann und somit bei der Rekonstruktion eines Raid-Volumens nur belegter Plattenplatz gespiegelt werden muss, hieraus resultiert im Schadensfall, besonders bei wenig gefüllten Dateisystemen, eine enorme Zeitersparnis. ZFS stellt mehrere RAID-Level zur Auswahl. Bei der Spiegelung (RAID-1) bilden zwei (oder mehr) Festplatten eine gespiegelte Redundanz-Gruppe, wobei die Daten zweimal oder öfter gespeichert werden können. Weiter gibt es zwei RAID-Z genannte Implementierungen. RAID-Z1 arbeitet ähnlich wie RAID-5, RAID-Z2 entspricht weitestgehend RAID 6. Bei RAID-Z1 bilden drei (oder mehr) Festplatten die Redundanz-Gruppe, dabei sind die Daten wie bei einem RAID 5 System paritätsgesichert, so dass eine der Festplatten ausfallen kann, ohne dass dabei Datenverluste entstehen. Durch das integrierte Design des ZFS wird jedoch im Gegensatz zu RAID-5 kein batteriegepufferter Speicher (NVRAM) benötigt, da keine Schreiblücke (write hole) zwischen Daten-Schreiben und Parity-Schreiben auftritt. Die RAID-Z2 genannte, ebenfalls schreiblückenfreie Implementierung von RAID-6 ist seit Solaris Express 47 verfügbar. Seit Juli 2009 ist auch RAID-Z3, also eine RAID-Z-Implementierung mit 3 Paritätsbits, verfügbar. Die Geschwindigkeitsoptimierung durch parallelen Zugriff (RAID-0 – Striping) wird von ZFS automatisch vorgenommen.

#### Snapshots

Copy-On-Write erlaubt es, sehr effizient Snapshots zu erstellen, dies geschieht praktisch sofort und das Dateisystem bleibt online. Ein Snapshot friert den aktuellen Dateisystemzustand ein, darauf folgende Schreiboperationen repräsentieren jeweils die Differenzen zum letzten Snapshot. ZFS-Snapshots können zum Lesen gemountet oder auch archiviert (zfs send) werden, des Weiteren gibt es ZFS-Clones, diese entsprechen einem beschreibbaren Snapshot.

#### Automatische Datenfehlerkorrektur

Neben den Möglichkeiten, Daten gegen Festplattenausfälle zu sichern, wird außerdem jeder einzelne Block im Dateisystem mit einer Prüfsumme versehen, sodass Datenfehler im Dateisystem (z. B. verursacht durch Datenübertragungsfehler) automatisch erkannt und ggf. ohne manuellen Eingriff behoben werden können. Der Performance-Verlust ist dabei minimal. Auch stellt ZFS sicher, dass der Zustand des Dateisystems zu jeder Zeit konsistent ist und deshalb auch beispielsweise nach einem Stromausfall kein Überprüfen des Dateisystems (per fsck) notwendig ist.

### Deduplikation

Im Oktober 2009 wurde Deduplikation für ZFS freigegeben. Dadurch werden Blöcke mit identischem Inhalt nur noch einmal physisch abgelegt, was hilft Plattenplatz zu sparen. Ein typischer Anwendungsfall ist das Anlegen von virtuellen Festplatten für virtuelle Maschinen, die jeweils alle eine Installation eines virtualisierten Betriebssystems enthalten. Eine weitere wäre aus gleichartigen Backups redundante Information zu entfernen. Deduplikation benötigt allerdings viel RAM, wodurch ZFS bei Nutzung als ressourcenhungrig bezeichnet wurde. In OpenZFS bietet sich daher eher die LZ4 Kompression an, die eher auf Geschwindigkeit als auf Kompression ausgelegt ist und keinen zusätzlichen Speicher benötigt.

### Performance

Weiterhin ist ZFS ein relativ schnelles Dateisystem; aufgrund der integrierten RAID-Funktionen und End-To-End-Checksummen kommt es jedoch in der Geschwindigkeit auf älteren bzw. langsameren Systemen nicht an einfachere Dateisysteme heran, wobei die Performance von ZFS auch davon abhängig ist, welche RAID-Funktionalität genutzt wird und ob die einzelnen Platten unabhängig voneinander und gleichzeitig Daten transferieren können.

### Datenkapazität

ZFS ist für sehr große Datenmengen ausgelegt, was durch die durchgängige Verwendung von 128-Bit-Zeigern erreicht wird. In der Praxis sind die Grenzen jedoch mit denen eines 64-Bit-Dateisystems vergleichbar. Bei der Implementation unter Solaris und beispielsweise auch FreeBSD werden 64-Bit-Datentypen verwendet, da es in C derzeit keine architektur- und compilerübergreifend nutzbaren 128-Bit-Datentypen gibt. Im Wesentlichen werden die ersten 64 Bits des Zeigers immer zusammen mit 64 Nullen abgespeichert, die bei der Verarbeitung ignoriert werden. Das ermöglicht es, bestehende Dateisysteme später als echte 128-Bit-Dateisysteme weiterhin verwenden zu können.

## Weiterentwicklung

Sun entwickelte ZFS seit 2001 für das Betriebssystem Solaris und hat es 2006 mit Solaris 10 6/06 offiziell, inklusive kommerziellem Support, veröffentlicht. Zudem stellte Sun ZFS unter der Common Development and Distribution License (CDDL) für OpenSolaris (ab Build 27a) bereit. ZFS war auf allen von Solaris unterstützten Architekturen verfügbar: SPARC und x86 (sowohl 32-Bit-x86, IA-32, als auch 64-Bit, x64). Entworfen und umgesetzt wurde das Projekt vom Sun-Team unter der Leitung von Jeff Bonwick.
Auf Basis der Veröffentlichung von Sun wurde ZFS von Pawel Jakub Dawidek, mit Unterstützung durch Sun-Entwickler, bereits früh auf FreeBSD portiert und ist seit FreeBSD 7.0 (veröffentlicht Anfang 2008) im Basissystem enthalten, wurde damals aber noch als experimentell eingestuft; Mit FreeBSD 8.0 (Ende 2009) gilt es als stabil.
Auch Apple hatte ZFS-Unterstützung, vorerst nur lesend, in Mac OS X Leopard (veröffentlicht Ende 2007) integriert. Volle Implementierung war für die Server-Version 10.6 (Snow Leopard, 2009) angekündigt worden, wurde dann jedoch doch nicht umgesetzt. Stattdessen wurden auf Apples Open-Source-Projektseite Mac OS Forge Quelltext und Binärprogramme der ZFS-Portierung veröffentlicht. Am 23. Oktober 2009 gab Apple dort bekannt, dass das ZFS-Projekt eingestellt worden war. Don Brady, der bei Apple für die Entwicklung von ZFS zuständig gewesen war, gründete nach seinem Austritt bei Apple die Firma Ten’s Complement und entwickelte dort das Dateisystem unter dem Namen ZEVO weiter. 2012 wurde die Firma von GreenBytes übernommen, die 2014 wiederum von Oracle übernommen wurde. Obwohl ZEVO kostenpflichtige kommerzielle Software war gab es von GreenBytes 2012 eine Community Edition gratis.
Eine direkte Unterstützung innerhalb des Linux-Kernels ist aus Lizenzgründen problematisch, daher gibt es keine in die offiziellen Kernelquellen integrierte Linux-Implementierung. Allerdings wurde mit dem Projekt ZFS on FUSE eine Implementierung geschaffen, die ZFS auch unter Linux nutzbar machte. Diese lief jedoch im Userspace und hatte dadurch verschiedene Nachteile, unter anderem einen verminderten Datendurchsatz. ZFS on FUSE wird seit 2012 nicht mehr weiterentwickelt, die letzte Version ist 0.7.0 und erschien am 9. März 2011. Dessen Ersatz ist die OpenZFS-Portierung ZFS on Linux.

### Oracle ZFS

Nach der Übernahme von Sun durch Oracle (in den Jahren 2009 bis 2010) findet die Weiterentwicklung von ZFS im Rahmen von Solaris statt. Da diese jedoch nicht öffentlich ist, ist auch nicht leicht zu erkennen, wie engagiert Oracle dabei tatsächlich vorgeht.

### OpenZFS

Unter der Bezeichnung OpenZFS wurde im September 2013 damit begonnen, alle bisherigen, von Sun bzw. Oracle unabhängigen Entwicklungen in einem Projekt zusammenzuführen. Dabei sollte das Dateisystem unter anderem auch betriebssystemübergreifend vereinheitlicht werden.
Als Basis dienten die bereits vorhandenen Weiterentwicklungen, wie jene aus FreeBSD, die wiederum auf der CDDL-Veröffentlichung von Sun basieren. OpenZFS ist daher grundsätzlich zwar zu Oracle ZFS kompatibel, aber nicht vollständig. Von OpenZFS gibt es einzelne Entwicklungszweige für diverse Betriebssysteme:
* illumos – OpenZFS ist in das Betriebssystem integriert
* ZFS on FreeBSD (ZoF)
* ZFS on Linux (ZoL)
* OpenZFS on macOS (O3X)
* OpenZFS on Windows (ZFSin)
Das als Abspaltung von OpenSolaris hervorgegangene freie Betriebssystem illumos dient den OpenZFS-Portierungen als Basis. Neue Funktionen und Weiterentwicklungen werden so in illumos direkt eingepflegt und daraus von den Portierungen, und somit betriebssystemübergreifend, übernommen.
Auch in FreeBSD ist ZFS integriert und kann wahlweise genutzt werden. Einige Distribution verwenden sogar primär ZFS, wie beispielsweise TrueNAS Core (vormals FreeNAS). Von dieser Distribution ist auch eine Enterprise-Version, wahlweise mit zertifizierter Hardware, genannt TrueNAS Enterprise, verfügbar. Für beide Versionen trägt die Firma iXsystems die Projektverantwortung.
War das ab 2006 entwickelte ZFS on FUSE ursprünglich die einzige Möglichkeit unter Linux, so wurde nun mit OpenZFS ein alternativer Lösungsansatz möglich. Als ZFS on Linux werden dabei die nötigen Kernel-Module außerhalb des Kernel-Quellbaums gepflegt. Da diese Implementierung im Kernelspace läuft, entfallen die Nachteile, die sich zuvor aus der (notgedrungenen) Nutzung von FUSE ergeben hatten. Nach Aussagen der Entwickler ist dieses Projekt seit der im April 2013 veröffentlichten Version 0.6.1 reif für den produktiven Einsatz. Es ist u. a. in der Linux-Distribution Ubuntu von Canonical seit Version 16.04 („Xenial Xerus“) enthalten, muss jedoch vom Benutzer installiert werden. Die OpenZFS-Binärpakete werden dabei direkt aus dem offiziellen Repository bezogen.
Für das auf BSD basierende macOS von Apple gibt es mit OpenZFS on OS X (der Name von macOS bis 2016 war OS X) ebenfalls eine Portierung, die als Dateisystemtreiber die Verwendung von ZFS in macOS ab Mountain Lion (Version 10.8, 2012) ermöglicht.
Die Portierung auf Windows von Microsoft heißt ZFSin. Die erste Alpha-Version, ZFSin 0.1, wurde am 20. September 2017 für Windows 10 x64 veröffentlicht.

## Technische Daten

| Wortlänge | 128 Bit |
| Volume Manager | integriert |
| Ausfallsicherheit | RAID-1 RAID-Z1 (1 Parity-Bit, ~RAID 5) RAID-Z2 (2 Parity-Bits, ~RAID 6) und RAID-Z3 (3 Parity-Bits) integriert |
| max. Größe des Dateisystems$^1$ | 16 EiB (= 2$^{64}$ Byte) |
| max. Anzahl an Dateien in einem Dateisystem | 2$^{48}$ |
| max. Größe einer Datei$^1$ | 16 EiB (= 2$^{64}$ Byte) |
| max. Größe jedes Pools | 2$^{128}$ Byte |
| max. Anzahl an Dateien in einem Verzeichnis | 2$^{48}$ |
| max. Anzahl an Geräten im Pool | 2$^{64}$ |
| max. Anzahl an Dateisystemen im Pool | 2$^{64}$ |
| max. Anzahl an Pools im System | 2$^{64}$ |
* $^1$Beschränkungen ergeben sich nur durch aktuelle Implementationen. Per Definition könnte das Dateisystem weitaus größere Datenmengen speichern.

## Kritik

ZFS wurde für den Server- und Rechenzentrumseinsatz konzipiert. Eigenschaften, die in diesem Einsatzgebiet von Vorteil sind, erweisen sich teilweise als Nachteil beim Einsatz auf Arbeitsplatzrechnern und eingebetteten Systemen. So ist für eine Verwendung von ZFS die Anlegung eines Pools notwendig, auch unterstützt ZFS bisher kein Shrinking von Partitionen, was die Handhabung auf Arbeitsplatzrechnern mit z. B. nur einer Festplatte, deutlich erschwert.
Die Verarbeitung der 128-Bit-Pointer (siehe Eigenschaften) ist vergleichsweise aufwendig, da sie nicht der Wortbreite aktueller CPUs entspricht, die typischerweise bei 32 Bit im Bereich Appliances und älterer Personal Computer sowie bei 64 Bit im Bereich aktueller Einzelplatzrechner und den meisten Servern liegt. Somit ist auf derartigen Systemen keine optimale Performance gegeben. Überhaupt bringt die 128-Bit-Auslegung nur dort Vorteile, wo ungewöhnlich große Datenmengen gespeichert werden sollen. Im SOHO-Bereich hingegen sind je nach Datenträgergröße 32- oder 64-Bit-basierte Dateisysteme bezüglich der ablegbaren Datenmengen ausreichend (vergl. Btrfs, Ext2, FAT32, HFS+, NTFS, UFS usw.), die üblicherweise schon unter Verwendung von 32-Bit-Datentypen Dateisysteme mit einer Kapazität von knapp 16 Terabyte (z. B. ext2) verwalten können, bei 64-Bit-Pointern natürlich weitaus mehr, beispielsweise ca. 8 Exabyte (8 Millionen Terabyte) bei XFS. Die 128-Bit-Auslegung bedeutet hier also nur zusätzlichen Rechen- und Zeitaufwand sowie einen etwas erhöhten Platzbedarf auf dem Medium.
ZFS nutzt Copy-On-Write und ein Journal (ZIL, ZFS Intent Log). ZFS kann so zu jeder Zeit auf ein konsistentes Dateisystem zurückgreifen. Sicherungen und Rücksicherungen von Blöcken sowie Dateisystemprüfungen sind so bei Abbrüchen wie einem Stromausfall nicht nötig. Inkonsistenzen in Metadaten und Daten werden bei jedem Lesevorgang automatisch erkannt und bei redundanter Information soweit möglich automatisch korrigiert. Die Leistung von solchen Dateisystemen nimmt allerdings ab ca. 80 % Belegung spürbar ab, wie bei allen anderen Dateisystemen auch.

## Trivia

Zur theoretischen Kapazität von ZFS kursiert folgendes Zitat:
   “Populating 128-bit file systems would exceed the quantum limits of earth-based storage. You couldn't fill a 128-bit storage pool without boiling the oceans.”
   „Ein 128-Bit-Dateisystem zu füllen würde die quantenmechanische Grenze irdischer Datenspeicherung übersteigen. Man könnte einen 128-Bit-Speicher-Pool nicht füllen, ohne die Ozeane zu verdampfen.“
Zum Verständnis des Zitats sei angemerkt, dass die Speicherung oder Übertragung einer Informationseinheit – z. B. ein Bit – an die Speicherung oder Übertragung von Energie gekoppelt ist, da Information ohne ein Medium nicht existieren kann, d. h. Information ist an die Existenz unterscheidbarer Zustände gekoppelt. Um einen Speicherpool mit 128-Bit-Adressierung zu füllen, wäre eine Energiemenge notwendig, die größer ist als die Menge an Energie, die ausreichen würde, um die irdischen Ozeane zu verdampfen. Gleichzeitig ist „boiling the ocean“ im Englischen ein idiomatischer Ausdruck dafür, etwas Unmögliches zu versuchen. Bonwick illustriert damit, dass ZFS für alle Zukunft genügend Kapazität bietet.

### Bemerkung

Die mindestens notwendige Energie zur Speicherung von 2$^{128}$ Bytes beträgt (bei 20 °C) 2100 TWh und ergibt sich nicht aus der Quantenmechanik, sondern aus der Thermodynamik. Sie geht auf Boltzmann und Planck zurück, siehe Boltzmann-Konstante. Damit kann man knapp 3 Kubikkilometer Wasser von 20 °C verdampfen, das ist weniger als ein Hundert Millionstel der Wassermenge unserer Ozeane und deutlich weniger als die Wassermenge des Bodensees.