Zwar verhindern lizenzrechtliche Gründe die Integration von Suns ZFS in den Linux-Kernel – über einen Trick kommen aber auch Linux-Anwender in den Genuss des viel gelobten Dateisystems.
Wer ein klassisches PC-System betreibt, nennt eine oder mehrere Festplatten sein eigen. Auf diesen befinden sich die Partitionen, die die jeweiligen Datenbereiche markieren. Innerhalb der Partitionen erstellen Sie dann das Dateisystem, in dem das Betriebssystem die Dateien ablegt. Mit ZFS ändert sich dieser bekannte Aufbau von Speichern.
Das Dateisystem ZFS aus dem Hause Sun fand im Juni 2006 offiziell Eingang in (Open-)Solaris [1] und ersetzte das bis dahin übliche UFS (“Unix File System”). Beim “Zettabyte File System” [2] handelt es sich um ein Meta-Dateisystem, das neben der Fähigkeit zum Abspeichern von Daten weitere Funktionen mitbringt, die den Umgang mit Massenspeichern vereinfachen.
ZFS gehört zu den 128-Bit-Dateisystemen und bietet viele positive Eigenschaften, wie eine erhöhte Ausfallsicherheit bei defekten Platten oder das Verwalten einer großen Anzahl von der Dateien. Da momentan keine 128-Bit-Datentypen existieren, nutzt ZFS die ersten 64 Bit und füllt den Rest der Struktur mit Nullen auf, die es im laufenden Betrieb ignoriert. Dadurch fällt es jedoch leicht, künftig auf volle 128 Bit umzustellen.
Über den integrierten Logical Volume Manager fasst ZFS bei Bedarf physische Datenträger (Laufwerke oder Partitionen) zu einem Pool zusammen. Darüber hinaus erlauben RAID-Funktionen [3], beim Vorhandensein von mehr als zwei Festplatten einen RAID-Pool anzulegen. Im Vergleich zu mit RAID-5 arbeitet das RAID-Z von ZFS jedoch bei Schreibzugriffen schneller und erweist sich bei unvorhergesehenen Ausfällen der Hardware als sicherer.
Zu den weiteren Fähigkeiten von ZFS zählt unter anderem das automatische Erstellen von so genannten Snapshots, die einen Dateisystemzustand wiederspiegeln. Dabei speichert ZFS nur die Unterschiede zum vorherigen Snapshot ab. Darauf aufbauend gestattet das Dateisystem Ihnen, “Clones” zu erzeugen. Im Gegensatz zu den Snapshots erlauben diese Replikate einen Lese- und Schreibzugriff. Das Hinzufügen von neuen Festplatten gestaltet sich ebenso leicht, wie das Austauschen von defekten Massenspeichern im laufenden Betrieb. Die Online-Kompression, bekannt von NTFS, erscheint dabei als eine nette Dreingabe.
ZFS und Linux
Sun hat ZFS unter der freien, aber nicht zu GPL kompatiblen CDDL freigegeben. Damit rückt eine Aufnahme in den Linux-Kernel vorerst in weite Ferne. Auch ein Ersatz scheint derzeit nicht in Sicht: ZFS hat momentan seiner Konkurrenz – von Oracles Btrfs [4], das ähnliche Eigenschaften besitzt, einmal abgesehen – vieles voraus.
Immerhin steht ZFS auch in Form eines Fuse-Moduls bereit – das erlaubt den Einsatz unter Linux. Die derzeitige Version 0.5 von ZFS-Fuse [5] läuft bereits stabil und machte im Test keine Probleme. Da es sich nicht um ein Kernel-Modul handelt, kommt es unter Umständen zu Geschwindigkeitseinbußen. Falls also Performance im Vordergrund steht, sollten Sie für den entsprechenden Rechner auf Solaris beziehungsweise eine BSD-Variante ausweichen. Aufgrund der weniger restriktiven BSD-Lizenz gehört ZFS dort schon jetzt zum Kernel.
ZFS installieren
Um ZFS unter Ubuntu einzurichten, nehmen Sie einfach folgenden Eintrag in der Repository-Datei /etc/apt/sources.list vor:
deb http://ppa.launchpad.net/brcha/ubuntu Release main multiverse restricted universe
Dabei setzen Sie an die Stelle von Release entsprechend gutsy, hardy, intrepid oder jaunty passend zu der von Ihnen verwendeten Distribution ein. Anschließend installieren Sie mit apt-get update && apt-get install zfs-fuse die Software.
Damit haben Sie die notwendigen Schritte zur Installation hinter sich gebracht. Für alle weiteren Operationen nutzen Sie die Befehle zfs und zpool auf der Kommandozeile.
Zpools anlegen und verwalten
Wie eingangs erwähnt, verwaltet ZFS einzelne Festplatten oder ganze Verbünde von Festplatten in so genannten Pools. Diese Einheiten erstellen Sie mit dem Werkzeug zpool. Dabei spielt es beim Erzeugen keinerlei Rolle, ob es sich um eine ganze Festplatte, mehrere Partitionen oder im einfachsten Fall um Dateien handelt. Im Beispiel kommen letztere zum Einsatz; es fällt aber nicht schwer, das Konzept auf Festplatten zu übertragen.
Für den Test erzeugen Sie, wie in Zeile 1 von Listing 1 gezeigt, acht virtuelle Festplatten für ZFS. Beachten Sie, dass ZFS mindestens 64 MByte pro Datei benötigt. Als nächstes gilt es, via zpool den Pool anzulegen (Listing 1, Zeile 2).
Ein Verkleinern im Nachhinein wie bei XFS erlaubt ZFS nicht. Der angelegte Pool hat jetzt eine Größe von 256 MByte. Durch Hinzufügen von neuen Platten vergrößern Sie diesen beliebig (Listing 1, Zeile 3). Auch einzelne Teile des Pools lassen sich mit einem Befehl ersetzen. So tauscht etwa das Kommando in Zeile 4 von Listing 1 die virtuelle Platte 1 gegen die Nummer 6 aus.
$ for i in $(seq 8); do dd if=/dev/zero of=/tmp/$i bs=1024 count=65536; done $ zpool create testpool /tmp/1 /tmp/2 /tmp/3 /tmp/4 $ zpool add testpool /tmp/5 $ zpool replace testpool /tmp/1 /tmp/6
Im realen Betrieb bekommt der Benutzer von einem solchen Austausch nichts mit. Diese Variante nutzt jedoch nichts, falls einer der Datenträger ausfällt: Passiert das vor dem Austausch, gehen die Daten verloren. Das Hinzufügen, wie oben beschrieben, ließe sich am ehesten mit RAID-0 vergleichen und garantiert keine Ausfallsicherheit, sondern nur zusätzlichen Platz.
Einen guten Überblick erhalten Sie stets mit dem Befehl zfs list, der den Namen der Pools, den Speicherplatzverbrauch und den Einhängepunkt ausgibt. Das Kommando zpool iostat -v fördert Details wie Lese- und Schreiboperationen zu Tage.
Mehr Ausfallsicherheit
Eine einfache Möglichkeit, die Ausfallsicherheit zu erhöhen, besteht im Spiegeln von Festplatten – RAID-1 genannt (siehe Kasten “Mirroring”). Eine ebenfalls gegen Datenverluste schützende RAID-Variante, RAID-5, benötigt mindestens drei Festplatten: Infolge dessen steigen die Kosten für Hardware. Aufgrund der niedrigen Preise für Speichermedien gehen drei Festplatten zu 500 GByte heute allerdings schon für unter 150 Euro über den Ladentisch. Die effektive Speicherkapazität errechnet sich nach der Formel: (Anzahl der Festplatten – 1) * (Größe der kleinsten Festplatte). Im Fall von drei Platten zu 500 GByte erhalten Sie insgesamt eine Kapazität von 1 TByte.
Zwar gehen bei RAID-5 (einfache Parität) durch den Defekt einer einzelnen Platte des Verbunds keine Daten verloren. Zudem lassen sich die auf der kaputten Platte gelagerten Daten auf ein Ersatzlaufwerk wiederherstellen. Fällt allerdings vor der Rekonstruktion ein weiteres Laufwerk aus, gehen alle auf dem Array gespeicherten Daten komplett verloren – hier gilt es also schnell zu handeln und für einen Ersatz der defekten Platte zu sorgen.
RAID-6 erhöht die Redundanz und Datensicherheit durch doppelte Parität nochmals: Der Defekt einer Platte bringt das System noch nicht ins Wanken, erst der Ausfall einer zweiten Disk versetzt das Array in einen unsicheren Zustand. RAID-6 benötigt mindestens vier Festplatten und fällt daher verhältnismäßig teuer aus – nicht zuletzt, da es die Kapazität zweier Platten für das Speichern der Paritätsdaten abzweigt.
Ähnlich wie beim Software-RAID unter Linux erlaubt ZFS RAID-Z und RAID-Z2, die ähnlich funktionieren wie RAID-5 beziehungsweise RAID-6. Sie arbeiten allerdings alle Schreibvorgänge so ab, dass Daten und Prüfsummen in einem Durchgang auf der Platte landen und daher das Dateisystem auch bei einem Stromausfall konsistent bleibt. Ein klarer Vorteil liegt im Verzicht auf einen teuren Hardware-RAID-Controller. Single- oder Dual-Core-CPUs kosten einen Bruchteil eines solchen Controllers und bringen heute genug Leistung mit, um dessen Aufgaben mit zu übernehmen.
Mirroring
Das Spiegeln von zwei Festplatten entspricht dem RAID-Level 1. Das System legt beim Schreiben die Daten stets auf beiden Platten ab, wodurch volle Redundanz entsteht. Der Ausfall eines Datenträgers zieht also keinen Datenverlust mit sich. Eine optionale Hot-Spare-Platte ersetzt im Falle eines Defekts das kaputte Laufwerk.
RAID einsetzen
Das folgende Beispiel demonstriert ein RAID-Z mit drei (virtuellen) Festplatten – RAID-Z2 funktioniert analog. Das Schlüsselwort lautet dabei raidz2 statt raidz. Einen Pool mit RAID-Funktionalität erstellt die Befehlsfolge aus Listing 2
$ for i in $(seq 3); do dd if=/dev/zero of=/tmp/rpool$i bs=1024 count=65536; done $ zpool create rpool raidz /tmp/rpool1 /tmp/rpool2 /tmp/rpool3
Allerdings erlaubt es ZFS es nicht ohne weiteres, den Speicherplatz in einem vorhandenen RAID-Z(2) zu erhöhen: So dürfen Sie beispielsweise keine neuen Platten zum RAID-Pool hinzufügen. Mit einem kleinen Trick umgehen Sie jedoch sich diese Beschränkung. Dazu ersetzen Sie, wie in Listing 3 zu sehen, die bereits vorhandenen Festplatten einfach durch drei größere.
$ for i in $(seq 4 6); do dd if=/dev/zero of=/tmp/rpool$i bs=1024 count=128000; done $ zpool replace rpool /tmp/rpool1 /tmp/rpool4 $ zpool replace rpool /tmp/rpool2 /tmp/rpool5 $ zpool replace rpool /tmp/rpool3 /tmp/rpool6
Alternativ erhöhen Sie nachträglich die Kapazität des Arrays, indem Sie Mirror- oder RAID-Z-Pools zum schon vorhandenen Pool rpool hinzuzufügen (Listing 4). Das ist insbesondere dann sinnvoll, wenn die neuen Festplatten dieselbe Größe haben wie die schon vorhandenen. RAID-Z wäre dem Mirror jedoch wegen der Ausfallsicherheit vorzuziehen, außer es stehen nur zwei Platten bereit.
$ zpool add rpool mirror /tmp/rpool4 /tmp/rpool5 $ zpool add rpool raidz /tmp/rpool4 /tmp/rpool5 /tmp/rpool6
Datenverlust vorbeugen
Moderne Festplatten verfügen über eine Selbsttest-Funktion, mithilfe spezieller Programme können Sie den aktuellen Zustand der Hardware auslesen. Befindet sich eine Platte in einem kritischen Zustand, erlaubt ZFS, diese aus einem bestehenden Pool herauszunehmen, um die Hardware zu überprüfen:
zpool offline rpool /tmp/rpool3
Stellt sich heraus, dass die Hardware irreparablen Schaden genommen hat, steht ein Austausch an. Die neue Hardware ersetzen Sie im System mittels des Kommandos zpool replace, wie in Listing 3 zu sehen. Während also offline die Platte lediglich im Verband deaktiviert, ersetzt – wie der Name schon sagt – replace ein vorhandenes Medium.
ZFS synchronisiert im Anschluss den Pool, was unter Umständen einige Minuten dauert. Mit dem Befehl zpool status behalten Sie den Überblick über den gegenwärtigen Zustand.
Snapshots erstellen
Wer sich bisher wunderte, wieso sich Apple für ZFS interessiert, den dürfte ein interessantes Feature bei Mac OS X aufgefallen sein: Dessen “Time Machine” speichert Zustände des Dateisystems ab. Damit haben Sie die Möglichkeit, zu älteren Zuständen wieder zurückkehren. Hinter Time Machine verbirgt sich ZFS, das mit seinen Snapshots alles Notwendige mitbringt.
In OpenSolaris haben die Entwickler dieses Feature bereits in Nautilus [6] integriert. Unter Linux bleibt es vorerst nur über die der Befehlszeile zu erreichen. Einen Schnappschuss erstellen Sie beispielsweise mit dem Befehl zfs snapshot rpool@erstellt. Wichtig dabei ist das Zeichen @ und eine darauf folgende beliebige Zeichenkette. Vorhandene Pools und Snapshots zeigt zfs list an (Listing 5).
Wenn Sie nun im Pool Veränderungen vornehmen, also Dateien kopieren oder hinzufügen, unterscheiden sich die Spalten USED und REFER vom Ausgangszeitpunkt. Haben Sie versehentlich Daten gelöscht, reicht ein zfs rollback rpool@erstellt aus, und der Pool befindet sich wieder im ursprünglichen Zustand.
$ zfs list NAME USED AVAIL REFER MOUNTPOINT rpool 409K 266M 32,2K /rpool rpool@erstellt 0 - 32,2K -
Fazit
ZFS bietet im Vergleich zu den gängigen Linux-Dateisystemen recht interessante Features, beispielsweise die Integration von Volume-Managers und RAID sowie das Erstellen von Snapshots. Viele weitere hier nicht erwähnte Features, wie die Online-Kompression oder die Möglichkeit, Pools zu exportieren beziehungsweise zu importieren, machen deutlich, wieviel Vorsprung das Dateisystem momentan gegenüber der Konkurrenz hat. Zwar verspricht Oracle mit Btrfs ähnliche Möglichkeiten; jedoch geht noch einige Zeit ins Land, bis Btrfs sich für den produktiven Einsatz eignet.
Glossar
-
Logical Volume Manager
-
Abstraktionsebene zwischen Festplatten und Dateisystem, die es erlaubt, mehrere Festplatten (“physical volumes”) zu einer so genannten Volume-Group zusammenzufassen. Darauf bauen dynamische “logical volumes” auf, auf denen Sie Dateisysteme anlegen.
-
RAID
-
Redundant Array of Inexpensive Disks. Gruppe vom Verfahren zum Zusammenschluss mehrerer Festplatten zu einem ausfallsicheren Plattenverbund.
-
CDDL
-
Common Development and Distribution License. Diese Open-Source-Lizenz basiert auf der Mozilla Public License 1.1. Die Free Software Foundation rät von einer gemeinsamen Nutzung zusammen mit GPL-lizenziertem Code ab.
-
Parität
-
Paritätsbits auf den Festplatten helfen beim Erkennen von fehlerhaft übertragenen Informationen. Spezielle Algorithmen korrigieren anhand dieser Bits beim Transfer entstandene Fehler.
[1] OpenSolaris: http://www.opensolaris.com
[2] ZFS: http://opensolaris.org/os/community/zfs/
[3] RAID: Marcus Nasarek, “Easy Raider”, LinuxUser 04/2006, S. 42, http://www.linux-user.de/ausgabe/2006/04/042-raid-basics/
[4] Btrfs: Marcel Hilzinger, “Clever schachteln”, LinuxUser 04/2009, S. 37, https://www.linux-community.de/Artikel/18004/
[5] ZFS-Fuse: https://developer.berlios.de/projects/zfs-fuse/
[6] Snapshot-Integration in Nautilus: http://blogs.sun.com/erwann/entry/zfs_on_the_desktop_zfs





