Dieser Beitrag ist erschienen in freiesMagazin (Link) 02/2010 / Lizenz: GNU Free Documentation License (GNU FDL) (Link) / Autor: Martin Böcher.
Wenn Sie diesen Artikel weiterverwenden möchten, beachten Sie bitte die Lizenzbedingungen. Vielen Dank.
ZFS unter Linux
von Martin Böcher
Das Dateisystem ZFS [1] ist eines der mächtigsten in der Unix-Welt. Es gehört nicht zum Linux-Kernel, aber dennoch kann man es problemlos unter Linux benutzen. Dieser Artikel soll einen kleinen Einblick in das ZFS-Thema geben. Am Beispiel einer Datensammlung und eines Software-RAIDs werden praktische Anleitungen für den Einstieg in dieses besondere Dateisystem gegeben.
Einleitung
Es gibt viele Dateisysteme für Linux und andere Betriebssysteme. Meist werden sie mit einem speziellen Ziel entwickelt, z. B. besonders groß oder schnell zu sein. Unter Linux ist derzeit Ext3 am verbreitetsten, wobei der Nachfolger Ext4 bereits seinen Weg in den Linux-Kernel gefunden hat (siehe „Das Dateisystem Ext4“ [2]). Wenn es um sehr große Datenmengen geht, wird auch schon mal ein neues Dateisystem entwickelt, z. B. um die Unmengen von Bildern bei Facebook zu lagern [3].
In diesem Artikel soll es aber um ein Allzweck-Dateisystem gehen, das nicht nur mit 248 Dateien, die bis zu 16 EiB (= 16·260 Byte) groß sein dürfen, zurecht kommt, sondern auch gleich diverse RAID-Level mit sich bringt. Man kann Festplatten zu einem Pool hinzufügen, wieder entfernen, Unmengen an Dateien anlegen, Backups blitzschnell mit Snapshots erstellen, Bereiche komprimieren und noch sehr viel mehr: Willkommen in der zettabyte-großen Welt von ZFS [4].
Der Ursprung
Das ZFS-Dateisystem wurde von Sun Microsystems [5] für Solaris 10 entwickelt. Ursprünglich stand ZFS für Zettabyte File System, heute ist der Name ein Pseudo-Akronym [6]. ZFS steht unter der CCD-Lizenz (CCDL) [7], was den Einsatz unter OpenSolaris [8] ermöglichte. Mittlerweile gibt es ZFS nicht nur für Solaris und OpenSolaris, sondern auch für FreeBSD [9], Mac OS X und dank FUSE auch für Linux.
Mit Googles Hilfe
Im Jahr 2006 hat Ricardo Correia das Projekt, ZFS mittels FUSE-Framework [10] zu Linux zu portieren, gestartet. Dies geschah im Rahmen des Google Summer of Code (siehe „Google Summer of Code“, freiesMagazin 12/2009 [11]). Daraufhin entstanden auch das zum Projekt gehörige Wiki [12] und sein zfs-on-linux-Blog [13]. Beide sind leider nicht mehr aktuell und Ricardo Correia hat sich aus dem Projekt zurückgezogen. Es wird aber auf einer neuen Seite [14] weiter gepflegt und weiterentwickelt. Aktuell ist hier die Version 0.6.0 Beta. Über die Mailingliste [15] findet man weitere Informationen sowie Kontakt zu anderen Benutzern und den Entwicklern.
ZFS und FUSE installieren
Um ZFS unter Linux zu benutzen, wird weitere Software benötigt. ZFS gehört nicht zum Linux-Kernel und bisher auch zu keiner Standardinstallation.
Mit dem Paketmanager installiert man ZFS, wobei die Pakete je nach Distribution unterschiedlich benannt sind. Die beschriebenen Tests wurden mit Gentoo Linux [16] durchgeführt, bei dem das Paket zfs-fuse (sys-fs/zfs-fuse) genannt wird und in der Version 0.5.0 im portage tree (der offiziellen Gentoo-Paketsammlung) zu finden ist. Hilfen und hilfreiche Links zu Paketen von anderen Distributionen wie Debian und auch Quellcode findet man im WizyWiki [17] bzw. auf der neuen Projektseite [18]. Im Wiki von Ubuntu gibt es auch einen detaillierten Beitrag [19] über die Installation und die Anwendung von ZFS.
Zusätzlich werden weitere Pakete über Abhängigkeiten benötigt und installiert (scons, fuse, ggf. weitere Pakete). Das mitinstallierte FUSE (Filesystem in Userspace) ermöglicht überhaupt erst, ein Dateisystem im Userspace zu benutzen. Auf den Webseiten von FUSE [20] findet man auch eine gute Grafik, die den Zusammenhang zwischen Kernel und FUSE verdeutlicht, denn ansonsten werden Dateisysteme vom Kernel und seinen Modulen zur Verfügung gestellt.
ZFS starten
Um ZFS zu nutzen, müssen die Dienste für FUSE und ZFS erst einmal gestartet werden. Hierzu wird wiederum ein Kernelmodul benötigt.
Um das Kernelmodul zu laden, nutzt man den Befehl modprobe:
# modprobe fuse
|
Um die Dienste zu starten, gibt man die folgenden Befehle ein:
# /etc/init.d/fuse start |
Zwei Befehle und alles gehorcht!
Im Grunde gibt es für ZFS nur zwei Befehle: zpool und zfs. Mit zpool schafft man die Grundlagen wie den Pool (ein Zusammenschluss von Festplatten) und das RAID-Level (Grad der redundanten Anordnung unabhängiger Festplatten). Mit dem Befehl zfs konfiguriert man dann die einzelnen Einstellungen, wie z. B. den Einhängepunkt oder die Komprimierung bis ins Detail. Um die beiden Befehle besser kennen zu lernen, sollte man deren Hilfe in Form der Manpages lesen. Da ZFS nicht in allen Distributionen eingepflegt ist, kann man den Befehl am einfachsten ohne Argument aufrufen, also:
# zpool
|
bzw.
# zfs
|
oder die Manpages für zpool [21] und zfs [22] auf den Seiten von Sun Microsystems betrachten.
In den Beispielen werden drei oder teils auch mehr Festplatten verwendet: /dev/sda, /dev/sdb, /dev/sdc, /dev/sdX. Dabei ist sda das Linux-System und sdb, sdc etc. stehen für ZFS-Tests zur Verfügung. Man muss natürlich nicht ganze Festplatten, USB-Sticks oder sonstige Medien verwenden, es funktionieren ebenfalls Partitionen oder sogar Dateien, wobei letztere in diesem Artikel nicht behandelt werden. Sollte man Partitionen statt ganzen Speichermedien verwenden, muss immer auf die Partitionsnummer (z. B. sdc1, sdf3) geachtet werden, damit es keine Verwechslungen gibt und keine Daten verloren gehen.
Hinweis: Nur mit leeren Festplatten/USB-Sticks testen oder VORHER ein funktionierendes Backup erstellen, damit keine Daten verloren gehen!
Ab in den Pool
Ein Pool im ZFS kann man mit Virtual Volumes von LVM (siehe „Der Logical Volume Manager“, freiesMagazin 03/2009 [23]) vergleichen, nur bietet ZFS die Möglichkeit, mehrere dieser Volumes in einem Pool zu vereinen. Gut veranschaulicht wird dies in der Präsentation „The Last Word in Filesystems“ von James C. McPherson [24]. Dort werden auch verschiedene RAID-Level und andere Zusammenhänge in Verbindung mit Festplatten und Dateisystemen verdeutlicht.
Der Pool, der aus einer oder mehreren Festplatten (oder auch USB-Sticks) bestehen kann, wird bei ZFS meist „tank“ genannt, so auch hier in den Beispielen.
Die Befehle zpool und zfs
Zum Kennenlernen folgt hier eine kurz Liste, was man mit den neuen Befehlen zpool und zfs erreichen kann [25].
zpool
Um die bestehenden Pools aufzulisten, benutzt man folgenden Befehl:
# zpool list
|
Um einen Pool mit dem Namen tank anzulegen, wobei die gewünschte Festplatte /dev/sdb ist, nutzt man den Befehl
# zpool create tank /dev/sdb
|
Einen Pool löscht man ganz einfach mit (Achtung: ALLE Daten werden gelöscht!)
# zpool destroy tank
|
So legt man einen gespiegelten Pool (RAID-1, mit zwei Festplatten) an:
# zpool create tank mirror /dev/sdb /dev/sdc
|
Um die Integrität des Pools tank zu prüfen, gibt es folgenden Befehl:
# zpool scrub tank
|
Mit dem Befehl
# zpool get all tank
|
gibt man alle Informationen des Pools tank aus.
Der Befehl
# zpool status
|
gibt Informationen über den Aufbau aller Pools aus.
Wenn man eine neue Festplatte hinzufügen will, gibt es folgenden Befehl:
# zpool add tank /dev/sdd
|
Zum Entfernen der Festplatte /dev/sdd aus dem Pool tank, hilft der Befehl
# zpool remove tank /dev/sdd
|
Eine defekte Festplatte kann man so gegen eine Neue austauschen (defekt: sdb, neue HDD: sdd):
# zpool replace tank /dev/sdb /dev/sdd
|
Es ist auch möglich, einen Pool von einem Server zu einem anderen zu wechseln. Dies können auch unterschiedliche Architekturen sein, wie z. B. von einem SPARC-System mit dem Betriebssystem Solaris zu einem AMD64- oder Intel-System (Linux). Hierzu wird auf dem SPARC-Server der Befehl
# zpool export tank
|
eingegeben, um den Pool tank zu exportieren. Die Festplatten können ausgebaut werden und an den neuen Server angeschlossen werden. Auf dem AMD64/Intel-Server muss der Pool dann wieder importiert werden:
# zpool import tank
|
Jetzt steht das Dateisystem auf dem anderen System zur Verfügung und ist fertig umgezogen.
zfs
Um ein Dateisystem anzulegen (tank ist der Name des Pools, files der Name des Dateisystems) reicht der Befehl
# zfs create tank/files
|
Wenn ein Einhängepunkt (Mountpoint) gesetzt werden soll, geht dies mit
# zfs set mountpoint=/home/linus/storage tank/files
|
/home/linus/storage ist das Ziel im Verzeichnisbaum. Standardmäßig wird der Pool im Root-Verzeichnis (automatisch) angelegt. Mit der Option des Einhängepunktes kann man dies ändern.
Es können auch weitere Dateisysteme unterhalb von tank/files angelegt werden:
# zfs create tank/files/linus |
Das ZFS-Dateisystem vererbt seinen nachkommenden Dateisystemen seine Eigenschaften. Das heißt, es muss beispielsweise nur tank/files (z. B. unter /storage) eingehängt werden, um auch tank/files/linus unter /storage/linus zu erhalten. Die Dateisysteme werden nach dem Erstellen bzw. nach dem Importieren automatisch eingehängt. Der Pfad ist standardmäßig /<Dateisystemname>, sofern kein Einhängepunkt festgelegt wurde (s. o.).
Um alle Informationen des Pools tank ausgeben, gibt es den Befehl
# zfs get all tank
|
Um alle Informationen eines Unterdateisystems - z. B. tank/files - auszugeben, geht man analog dazu vor:
# zfs get all tank/files
|
Zum Komprimieren eines Dateisystems dient der Befehl
# zfs set compression=on tank/files
|
Auch Quotas (Begrenzung des Speicherplatzes) sind möglich. Um z. B. eine Begrenzung von 15 GB für linus einzurichten, reicht der Befehl
# zfs set quota=15g tank/files/linus
|
Anstatt den Platz zu begrenzen, kann man auch Speicherplatz reservieren. Zum Beispiel 10 GB für den Bereich frank:
# zfs set reservation=10g tank/files/frank
|
Beispiele aus dem Alltag
Um die ganze Prozedur etwas zu veranschaulichen, gibt es hier zwei Beispielszenarien. Das erste Szenario ist eine Datensammlung, die nicht sonderlich ausfallsicher sein muss, sondern nur viel Speicherplatz zur Verfügung stellen soll. Das zweite Szenario soll ein sicheres RAID sein. Hier soll eine defekte Festplatte getauscht werden.
Szenario 1: Die Datensammlung
Um den Pool tank zu erstellen, gibt man folgenden Befehl ein:
# zpool create tank /dev/sdb
|
Das war es schon! Wenn das Dateisystem voll sein sollte, kann man es einfach mit der nächsten Festplatte erweitern:
# zpool add tank /dev/sdc
|
Jetzt kann man den Status anzeigen lassen und sehen, dass das Dateisystem tank aus zwei Festplatten (sdb und sdc) besteht:
# zpool status tank |
Szenario 2: Das sichere RAID
Die Daten sollen auf einem RAID-5 (siehe unten) Platz finden. Hierzu wird ein Pool mit vier Festplatten erstellt:
# zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
|
Alternativ kann man auch gleich noch eine weitere Festplatte als Ersatz (Spare-Harddisk) mitgeben:
# zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde spare /dev/sdf
|
Das Ergebnis kann man sich genau wie im ersten Beispiel auflisten lassen:
# zpool status tank |
Sollte keine spare-Festplatte vorhanden sein, die automatisch eine Defekte ersetzt, kann man den Wechsel manuell durchführen (defekte HDD: sdb, neue HDD: sdg):
# zpool replace tank /dev/sdb /dev/sdg
|
Sicher ist sicher
Bei der Datensicherheit muss man verschiedene Aspekte beachten: Ausfallsicherheit, Zugriffssicherheit, Datenschutz und weitere Sicherheitspunkte. An dieser Stelle soll es einen kleinen Einblick in zwei Bereiche geben, die eine gewisse Grundlage bilden. Die anderen Bereiche der Sicherheit sind ebenfalls wichtig und sollten beachtet werden.
RAID
Ein „Redundant Array of Independent Disks“ (RAID [26]) hat das Ziel, die Ausfallsicherheit zu erhöhen. In einem RAID werden die Daten redundant über mehrere Festplatten verteilt, damit beim Ausfall einer Festplatte keine Daten verloren gehen. Nur beim RAID-0 werden die Festplatten logisch zu einer zusammengefasst, ohne eine Redundanz zu schaffen. Dieses Prinzip kann man in Hardware (RAID-Controller) oder in Software realisieren [27]. ZFS hat eine eigene Softwarevariante, ein RAID anzulegen und zu verwalten.
Seit „Solaris Express Community Edition, build 120“ (OpenSolaris) gibt es auch „Triple-Parity RAID-Z“ [28], was die Ausfallsicherheit gegenüber RAID-6 nochmals erhöht. Aber Achtung: Dieses Feature ist in der Version 0.5.0 von zfs-fuse noch nicht implementiert.
Zum Erstellen eines RAIDs wählt man die Festplatten/Partitionen aus und setzt sie zu einem Pool zusammen:
RAID-0:
# zpool create tank /dev/sdb /dev/sdc
|
RAID-1 (gespiegelte Festplatte):
# zpool create pool mirror /dev/sdb /dev/sdc
|
RAID-5:
# zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
|
RAID-6:
# zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd
|
„RAID-6 deluxe“ (Triple-Parity RAID-Z):
# zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd
|
Zusätzlich kann einem RAID-Verbund (egal ob mirror oder raidzX) auch noch eine oder mehrere Ersatzfestplatten mitgegeben werden. Hierzu dient das Argument spare, gefolgt von der Ersatzfestplatte:
# zpool create pool mirror /dev/sdb /dev/sdc spare /dev/sdd
|
Ein RAID besteht je nach RAID-Level aus zwei, drei oder mehr Festplatten. Wenn es angelegt ist, kann man die Anzahl nicht ändern. Um ein Dateisystem zu erweitern, vergrößert man deshalb nicht das RAID, sondern den Pool. Dieser kann z. B. aus mehreren RAIDs bestehen.
RAID-6 (Teil 1 des Pools):
# zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd
|
RAID-6 (Teil 2 des Pools):
# zpool add tank raidz2 /dev/sde /dev/sdf /dev/sdg
|
Kontrolle:
# zpool status |
Backups
Backups können mit ZFS-eigenen Snapshots (schreibgeschützte Momentaufnahme des Dateisystems) und Clones (beschreibbare und sofort einsetzbare Kopie eines Dateisystems) angelegt werden. Man sollte sich natürlich generell Gedanken über eine Backupstrategie machen. Ob gegebenenfalls eine externe (Aus-)Lagerung eines Monatsbackups auf Band oder ähnliches sinnvoll ist, muss jeder selbst entscheiden.
Der Snapshot ist eine schreibgeschützte (read-only) Kopie des Dateisystems. Man erstellt ihn ebenfalls mit dem zfs-Befehl. Man wählt das Dateisystem aus und hängt mit einem @ noch einen Namen dahinter, um später die verschiedenen Snapshots zu unterscheiden und wiederzufinden:
# zfs snapshot tank/files/linus@meintest
|
Ein Clone ist eine schreib- und lesbare Kopie des Dateisystems. Der Clone wird immer von einem Snapshot erstellt und bekommt einen neuen Namen (hier testclone):
# zfs snapshot tank/files/linus@meintest |
Weiteres zu Snapshots und Clones, zum Löschen oder Modifizieren von diesen und noch vieles mehr findet man ausführlicher im Administrationshandbuch [29].
Hilfe und Information
Die Informationen zu ZFS sind vermutlich genauso umfangreich wie die Dateisysteme und Dateien, die mit ihm erstellt werden können. An dieser Stelle sollen noch einige Links erwähnt werden, die mit reichlich Informationen weiterhelfen können.
Die wichtigste Anlaufstelle ist vermutlich der „Getting Started Guide“ [30] der „Community Group ZFS“ auf den OpenSolaris-Webseiten. Auch das sehr umfangreiche und aktuelle, über 300-seitige englischsprachige Administrationshandbuch hilft bestimmt weiter (siehe oben).
Zum Testen eines ZFS-Dateisystem gibt es auch ein Programm namens ztest [31], das direkt zum zfs-fuse Paket gehört.
Beim Chaosradio-Podcast-Network des Chaos Computer Clubs haben sich in der Chaosradio Express Ausgabe 49 [32] Tim Pritlove und Denis Ahrens mit dem Thema ZFS auseinandergesetzt.
Selbst auf YouTube findet man Videos zum Thema ZFS. Die Systemhelden [33] haben in Zusammenarbeit mit SUN ein schönes und lustiges „Lehr- und Demonstrationsvideo“ erstellt [34].
Ein schöner Vergleich zwischen ZFS und einem Soft-RAID, LVM und deren Kombination findet man auf der Seite von James Dickens [35]. Chris Samuel hat in seinem Blog [36] auch einige Tipps, Kommentare und einen Artikel, der auf LinuxWorld.com veröffentlicht wurde [37].
Fazit und Aussichten
Leider steht ZFS nicht unter der GPL [38] und wird damit auch nicht in den Linux-Kernel integriert werden. Abgesehen davon gibt es keine Probleme mit diesem Multifunktionsdateisystem.
An dieser Stelle sei noch erwähnt, dass ZFS via FUSE für Linux dem „original“ ZFS (für Solaris) im Prinzip immer einen Schritt hinterherhinkt, da zfs-fuse auf die fertige Version aufbaut und nicht gemeinsam oder parallel für Linux entwickelt wird. Dies liegt auch am Lizenzproblem.
ZFS wird ständig weiterentwickelt, wobei die Abwärtskompatibilität immer gegeben ist. Aktuell wurde ZFS um die Deduplikationsfunktion [39] erweitert. Auch das Booten von einem ZFS-Dateisystem wurde mittels initramfs schon realisiert [40]. Man darf gespannt sein, welche weiteren Funktionen noch folgen werden und hoffen, dass das neue Team ZFS für Linux auf den aktuellen Stand bringt und hält.
Das Arbeiten mit ZFS ist einfach und sehr angenehm, allein schon durch die kurzen und logischen Befehle. Ein Test lohnt sich in jedem Fall.
Kommentar/Leserbrief zu ZFS unter Linux
-> Interessanter Beitrag, allerdings sind die Beispiele zu raidz2 und raidz3 meiner Meinung nach unsinnig, da zu wenige Platten angegeben sind. So wie ich das verstanden habe, macht RAID6 (doppelte Parity) erst ab vier Platten Sinn und RAID7 (dreifach Parity), oder wie man das nennen mag, erst ab 5 Platten. Wobei das ja schon Overkill ist: mehr Parity als Daten. :)
Robert Perkuhn (Kommentar)
<- Es stimmt, leider habe ich die Beispiele nicht richtig aus meinen Testprotokollen kopiert. Bei raidz2 und raidz3 benötigt man im Prinzip 5 bzw. 8 Platten.
Martin Böcher
Links
-
http://hub.opensolaris.org/bin/view/Community+Group+zfs/WebHome
-
http://de.wikipedia.org/wiki/Common_Development_and_Distribution_License
-
http://www.filibeto.org/~aduritz/truetrue/solaris10/ZFS_SOSUG17oct2005_preso.pdf
-
http://hub.opensolaris.org/bin/view/Community+Group+zfs/intro
-
http://de.wikipedia.org/wiki/Redundant_Array_of_Independent_Disks
-
http://de.wikipedia.org/wiki/Redundant_Array_of_Independent_Disks#RAID-Z_im_Dateisystem_ZFS
-
http://hub.opensolaris.org/bin/download/Community+Group+zfs/docs/zfsadmin.pdf
-
http://hub.opensolaris.org/bin/view/Community+Group+zfs/intro
-
http://hub.opensolaris.org/bin/view/Community+Group+zfs/ztest
-
http://www.linuxworld.com/news/2007/090407-emerging-linux-filesystems.html?page=1
-
http://www.heise.de/open/meldung/ZFS-mit-Daten-Deduplikation-848298.html
-
http://groups.google.com/group/zfs-fuse/browse_thread/thread/3e781ace9de600bc/
Autoreninformation
Martin Böcher benutzt seit vielen Jahren Linux und andere freie Software. Um große Datenmengen zu verwalten und bereit zu stellen, benötigt er ein komplexes und zuverlässiges Dateisystem. Hier kommt auch ZFS zum Einsatz.
| Weiter > |
|---|





