Suns ZFS gilt derzeit als das modernste Filesystem. Der Linux-Kernel unterstützt es zwar nicht direkt, aber auf Umwegen. Im Test offenbarten sich jedoch Hürden, die ZFS unter Linux oft straucheln lassen. Nur ein proprietärer Anbieter kann mit Kompatibilität und Speed überzeugen.
Am Anfang stand eine vermeintlich ganz normale forensische Auswertung. Ermittler hatten einen Solaris-Server beschlagnahmt und sollten dessen Daten auswerten. An sich nichts Besonderes, wären da nicht drei Festplatten im Raid-5-Verbund unter ZFS verbaut gewesen.
Reichlich Komplex: ZFS
Die Vorgabe, die brandneuen ZFS-Treiber unter Linux ([1], [2], [3]) einzusetzen, um eine logische Datensicherung zu erstellen, entwickelte sich zum komplexen Projekt, das in den Tabellen, Benchmarks und Testergebnissen des vorliegenden Artikels mündete. Tabelle 1 zeigt die dabei verwendeten Versionen.

Tabelle 1: Benutzte ZFS-Versionen” width=”284″ height=”252″ /> Tabelle 1: Benutzte ZFS-Versionen
ZFS als 128-Bit-Dateisystem integriert Raid- und Volume-Management mit Prüfsummen und glänzt durch zahlreiche Erweiterungen für Rechenzentren [4]. Der Name stammt ursprünglich von Zetabyte File System und stellte eine Anspielung auf die riesigen Datei- und Dateisystemgrößen (beides 16 Exbibyte, 16 mal 260 Byte) dar, die ZFS unterstützt. Weil die Features der von Sun für Solaris 10 entwickelten Software den Rahmen gängiger Filesysteme deutlich sprengen und weit in den HA- oder Netzwerkbereich reichen, entwickelte sich unter Linux-Anhängern eine heftige Diskussion, wobei die Vertreter der “One Job, one Tool”-Fraktion dem Stack-übergreifenden Funktionsumfang skeptisch gegenüberstanden.
Auch weil ZFS der Common Development and Distribution Licence (CDDL, [5]) unterliegt, lässt eine vollständige Implementierung im Linux-Kernel auf sich warten, Anwender müssen auf spezielle Tools oder Fuse zurückgreifen. Die CDDL enthält beispielsweise Passagen, nach denen die Lizenz ungültig wird, wenn ein Lizenznehmer rechtliche Schritte gegen den Lizenzgeber unternimmt. Das richtet sich vor allem gegen Patentklagen und gilt als umstritten. Die CDDL stammt aus dem Jahr 2004, als Sun die Freigabe von Solaris vorbereitete, fast ganz Open Solaris unterliegt ihr.
Auf den Zahn gefühlt
Grund genug, die Theorie und die versprochenen Eigenschaften der verschiedenen Lösungen in die Praxis umzusetzen. In den folgenden Beispielen kommen sowohl Kernel-basierte Varianten als auch die einfach zu implementierende Lösung über den Userspace und ZFS-Fuse auf einem AM3-Mainboard mit einer 500-GByte-Systemplatte und drei 1-TByte-Festplatten mit einem Raid-5-System zum Einsatz. Im Multiboot mit fünf Betriebssystemen auf jeweils 80 GByte großen Partitionen landen da:
- Open Solaris Beta 201003
- Free BSD 8.1
- Debian Squeeze
- Ubuntu 10.10 Desktop mit ZFS-Fuse
- Ubuntu 10.04 Server LTS mit proprietärem Kerneltreiber
Alles in den 64-Bit-Varianten. Die verbleibende Kapazität der Hauptplatte dient der Sicherung der Images.
Wie bei Dualboot üblich, muss der Anwender bei der Installation verhindern, dass die Betriebssysteme den Master Boot Record (MBR) überschreiben. Im Beispiel erstellt ihn Open Solaris, alle anderen OS nur einen Volume Boot Record in der jeweiligen Partition. Die Multiboot-Einträge schreibt der Admin in die »menu.lst« von Open Solaris.
Wer hier VBR-Loader erstellt hat, dem genügen einfache Chainloader-Befehle zur Bootauswahl. Der Eintrag für Free BSD lautet beispielsweise:
title "FreeBSD 8.1" root (hd0,1) chainloader +1
Leicht zu erkennen: Open Solaris verwendet noch den altgedienten Grub 1. Wer die »menu.lst« aber in »/boot« sucht, wird sich schwer tun: Open Solaris legt diese in »/rpool/boot/grub/« ab.
Den ZFS-Pool auf Open Solaris erstellen …
Sind alle Kandidaten installiert, geht es ans Erstellen des Raid 5. Die drei 1-TByte-Festplatten bindet der Admin im Originalzustand ein. Die Partitionierung übernimmt dann Open Solaris. Die Festplatteninformationen zeigt unter Solaris der Befehl »format« in einem Terminal an. Abbildung 1 zeigt die für Linux-Anwender wegen der verwendeten Slices etwas gewöhnungsbedürftigen Bezeichnungen der Festplatten.

Abbildung 1: Partitionen erstellen unter Open Solaris. Die Laufwerkbezeichner unterscheiden sich signifikant von denen unter Linux, weil das Unix mit Slices arbeitet, also Partitionen in Partitionen.
Der anschließende Befehl »zpool« erstellt das Raid-System (siehe Abbildung 1):
zpool create mybackups Raidz c4t2d0 c4t3d0c4t5d0
Das Kommando »zpool status« aus Abbildung 2 überprüft den Erfolg.

Abbildung 2: Ein auf Open Solaris angelegter Raid-Pool ist erfolgreich eingebunden. Sein Name lautet »mybackups«, die Raid-5-Option hat »Raidz« im »zpool create«-Kommando festgelegt.
Die vertrauten Befehle »mount« und »df -h« liefern weitere Informationen über den Mountpoint und die Kapazität des Raid. Standardmäßig erzeugt das System ein Directory im Wurzelverzeichnis, benannt nach dem Namen des Pools, oder bei Bedarf mit der Option »-m /Verzeichnis« individuell angepasst.
Als Gesamtkapazität erscheinen knapp 2 TByte, der korrekte Wert für drei Festplatten von 1 TByte im Raid-5-Verbund. Bevor sich der Pool in den anderen Betriebssystemen testen lässt, sollte der Admin noch Daten hineinkopieren.
… und mit Free BSD importieren
Free BSD wird jetzt (nach Open Solaris) das erste Betriebssystem, das mit dem ZFS-Pool arbeiten soll. Ob er sich für eine Grafikoberfläche oder die reine Kommandozeilenversion entscheidet, bleibt dem Admin überlassen. Alle verwendeten Unix-Derivate machten im Test keine Probleme, solange die Anwender mit GUIs wie Gnome und deren Tools arbeiteten. Befehle mit direktem Einfluss auf die Hardware, etwa die Verwaltung von Speichermedien und Netzwerkkarten, muss der Admin ohnehin meist erst nachschlagen, weil sich die Betriebssysteme in den Device-Namen unterscheiden.
Den unter Open Solaris erstellten Pool importiert nicht nur unter Free BSD der Befehl »zpool import« . Er hat im Listing 1 bereits einige Informationen gesammelt, den Pool »mybackups« hat er zwar erkannt, doch gibt es Inkompatibilitäten durch Versionsunterschiede. Deshalb meldet das Tool den Pool als defekt und der Import-Befehl mit »–force« -Option (»zpool import -f mybackups« ) verweigert die Arbeit.
Listing 1
zpool import auf Open Solaris
01 # zpool import 02 pool: mybackups 03 id: 18344450410782017931 04 state: UNAVAIL 05 status: The pool was last accessed by another system. 06 action: The pool cannot be imported due to damaged devices or data. 07 08 mybackups UNAVAIL newer version 09 Raidz1 DEGRADED 10 ad14p1 ONLINE 11 ad16p1 ONLINE 12 dsk/c4t5d0s0 UNAVAIL cannot open
Free BSD arbeitet leider noch mit einer veralteten ZFS-Version und kann diesen Pool nicht lesen. Ein neuer Pool, basierend auf einer älteren Version, muss her, doch zuvor sollen die anderen Betriebssysteme beweisen, was sie können.
Kfree BSD
Einen interessanten Weg, um ZFS unter Linux zu nutzen, beschreitet das Kfree-BSD-Projekt [1]. Sein Ansatz ist es, zwar die Kernel-basierte ZFS-Implementierung von Free BSD zu nutzen, jedoch dem Anwender eine bekannte Debian-Umgebung zu spendieren. Mit dem Download des »mini.iso« von [6] steht ein Installationsmedium zur Verfügung, das wahlweise ein Debian Lenny, Squeeze oder Sid auf einen Free-BSD-Kernel aufsetzt. So bremsen Userspace-Treiber die Leistung nicht, aber der Linux-Anwender fühlt sich (abgesehen von geringfügigen Namensanpassungen der Geräte) trotzdem fast wie zu Hause. Auch der zuvor benutzte Zpool-Befehl kommt hier wieder zum Zuge, zumindest nach der Installation der Userspace-Werkzeuge mit »aptitude install zfsutils« . »zpool import« zeigt den Pool zwar an, aber auch hier erscheint die Fehlermeldung, dass es sich beim Pool um eine neuere Version handelt, exakt identisch mit Listing 1.
KQ Infotech
Für Linux-Anwender, die Lernaufwand scheuen, gibt es den proprietären ZFS-Treiber von KQ Infotech [2], zum Beispiel für die LTS-Version 10.04 von Ubuntu. Nach einer Registrierung steht der kostenlose Download bereit, derzeit als Debian-Pakete ohne jede Dokumentation. Diese und eine FAQ-Liste sollen laut Hersteller in Kürze auf der Webseite zu finden sein.
Der erste Installationsversuch scheiterte im Test mit Fehlermeldungen. Auf eine Supportanfrage antwortete das indische Team allerdings sofort. Es arbeitete etwa eine halbe Stunde per SSH auf dem Testserver, dann war der Fehler gefunden und ZFS einsatzklar. Die Minimalinstallation des Ubuntu-10.04-Servers erwartete Awk, die Software verlangte aber das bessere Gawk. Die Supporttechniker installierten es manuell und ersetzten Awk durch einen Symlink. Die Abhängigkeitsliste im Installationspaket will der Hersteller ebenfalls bald korrigieren.
Der Vorteil der KQ-Infotech-Variante ist offensichtlich: Alle Geräte tragen die typischen Devicenamen. Im Gegensatz zu den ersten beiden Varianten zeigt der Importversuch auch gleich einen Lösungsvorschlag (Listing 2). Der Import mit der »–force« -Option holt jetzt zwar den Pool, mountet ihn aber nicht. Auf Anfrage beim Hersteller erfuhren die Tester, das sei die derzeitige Standardeinstellung. Erst nach einem zusätzlichen Mountbefehl »zfs mount mybackups« klappte der Dateizugriff.
Listing 2
zpool import mit KQ Infotech
01 zpool import 02 pool: mybackups 03 id: 18344450410782017931 04 state: ONLINE 05 status: The pool was last accessed by another system. 06 action: The pool can be imported using its name or 07 numeric identifier and the '-f' flag. 08 See: http://www.sun.com/msg/ZFS-8000-EY 09 config: 10 11 mybackups ONLINE 12 Raidz1 ONLINE 13 sdb1 ONLINE 14 sdc1 ONLINE 15 sdd1 ONLINE
Ubuntu mit ZFS-Fuse
Der vierte Kandidat im Vergleich ist ein aktuelles Ubuntu 10.10. Das enthält auch die freien ZFS-Fuse-Treiber, die keinen Geschwindigkeitsrausch erwarten lassen, aber als Grundlage für eine logische Datensicherung eine pflegeleichte Lösung versprechen. Auch hier ist »zpool import« wieder der erste Befehl (Listing 3).
Listing 3
zpool import mit Fuse
01 zpool import 02 pool: mybackups 03 id: 18344450410782017931 04 state: ONLINE 05 status: The pool was last accessed by another system. 06 action: The pool can be imported using its name or numeric identifier and the '-f' flag. 07 see: http://www.sun.com/msg/ZFS-8000-EY 08 config: 09 10 mybackups ONLINE 11 Raidz1-0 ONLINE 12 disk/by-id/ata-ST31000520AS_5VX058FP-part1 ONLINE 13 disk/by-id/ata-Hitachi_HDS721010KLA330_GTH000PAH2W4AH-part1 ONLINE 14 disk/by-id/ata-SAMSUNG_HD103UJ_S13PJDWS619757-part1 ONLINE
Die Rückmeldung ist bekannt, aber hier funktioniert der Import über die »–force« -Option einwandfrei, die Daten stehen anschließend sofort zu Verfügung. Aus Sicht des Forensikers ist das die eleganteste Lösung, auch weil sie mit einem aktuellen Ubuntu sehr schnell über »aptitude install zfs-fuse« eingerichtet ist.
Durchsatz
Für Admins stellt sich eher die Frage nach der Performance, und dafür darf das Benchmarktool Iozone [7] herhalten. Es liegt im Quelltext vor und lässt sich deshalb für alle getesteten Betriebssysteme benutzen. Auf jedem Kandidaten setzten die Tester des Linux-Magazins
iozone -r 4k -s 10g -i 0 -i 1
ab, was eine 10 GByte große Datei anlegt. Die Schreib- und Lesebefehle erfolgen bei einer Blockgröße von 4 KByte. Das File musste laut Manpage größer als der RAM (8 GByte) sein, damit Cache-Vorgänge und Arbeitsspeicher weniger Einfluss auf die Testergebnisse nehmen. Abbildung 3 zeigt die Ergebnisse des Benchmark, als Referenz eignet sich der letzte Block mit einem Ext-3-System ohne Raid.

Abbildung 3: Im Iozone-Benchmark kommt auch das außer Konkurrenz antretende Ext 3 gar nicht so schlecht weg, zumindest bei Schreibzugriffen. Beim Lesen sind jedoch alle ZFS-Varianten schneller.
Die Ergebnisse sprechen eine deutliche Sprache: Wer Wert auf Performance legt, kommt bei ZFS im produktiven Einsatz nicht um eine Kernel-basierte Lösung wie KQ Infotech herum. Auch Apple setzt in seinen neueren, auf BSD aufbauenden Betriebssystemen übrigens Kernel-basierte ZFS-Treiber ein, deren Performance angeblich nahe an die von Open Solaris herankommt. Im Test erkannte ein Macbook mit ZFS formatierte USB-Platten auch problemlos.
ZFS-Fuse stellt dagegen keine Alternative dar. Die Benchmarks in Abbildung 3zeigen die mageren Ergebnisse, vor allem bei Schreibzugriffen. Die Kfree-BSD-Implementierung teilt mit Free BSD den gravierenden Nachteil, dass sich aktuelle Pool-Versionen nicht mounten lassen. Zur Analyse bestehender Systeme taugt es deshalb weniger.
Während Admins primär an der Leistung orientiert sind und ihre Pools selbst erstellen, muss der Forensiker bei sichergestellten Systemen Lesezugriff und Schreibschutz gewährleisten und mit Images arbeiten (Kasten “ZFS mit EWF-Images”). Das klappt mit KQ Infotechs Treibern, der Fuse-Treiber dagegen erlaubte im Test unter Ubuntu 10.10 kein erfolgreiches Read-only-Mounten des Raid-Pools und konnte den Testpool aus den virtuellen Images nicht finden.
ZFS mit EWF-Images
Für einen Ermittler günstig sind die ZFS-Implementierungen, die den Pool nicht automatisch mounten, weil er das Dateisystem in der Regel nachweisbar Read-only zur Verfügung stellen muss. Das erledigt die Zpool-Option »-o ro« :
zpool import o ro -f mybackups
Zpool merkt sich diese Einstellungen, weitere Attribute setzt zum Beispiel das Kommando »set« , allerdings muss dafür Umount den Pool nochmals lösen:
zfs umount mybackups zfs set atime=off mybackups zfs set exec=off mybackups zfs mount mybackups
»atime=off« verhindert das Verändern der Access Time, »exec=off« unterbindet das Ausführen von Programmen. Jetzt steht der logischen Datenauswertung nichts mehr im Wege. Drei typische Beispiele sind:
# MD5-Hashwerte aller Dateien: find /mybackups -type f -print0 | xargs U -0 md5sum > mybackups_md5 # Eine Dateiliste aller Dateien: find /mybackups -type f -print0 | xargs U -0 ls -lisa > mybackups_ls
Auch die History Files gehören zu den Leckerbissen besonders für Forensiker, unter ZFS macht sie der Befehl »zpoool history -il mybackups« sichtbar.
Virtuelle Images
Die Tests im Artikel beziehen sich ausschließlich auf physikalische Medien, der Forensiker arbeitet aber fast immer mit Images des EWF-Standards. Das Programm Xmount [8] aus den Debian-Repositories konvertiert EWF-Files virtuell in Raw-Images. Einen Bericht dazu gab es im Linux Magazin [9].
Um herauszufinden, ob sich ein ZFS-Raid-5-Verbund auch aus EWF-Dateien wiederherstellen lässt, erstellten die Autoren drei Dd-Images unter Open Solaris. Wie die Versionsliste in Tabelle 1 zeigt, setzt Open Solaris 201003 auf die neueste Zpool-Version 22. Diese lässt sich derzeit aber nicht auf allen anderen Systemen lesen, deshalb nutzten die Autoren für den Test Images unter Open Solaris 2009.06 mit der kompatibleren Zpool-Version 14 und koppelten diese an jeweils ein Loop-Device:
dd if=/dev/zero of=disk1 bs=1024k count=100 dd if=/dev/zero of=disk2 bs=1024k count=100 dd if=/dev/zero of=disk3 bs=1024k count=100 lofiadm -a disk1 /dev/lofi/1 lofiadm -a disk2 /dev/lofi/2 lofiadm -a disk3 /dev/lofi/3
Zuletzt erzeugt Zpool mit
zpool create testpool Raidz /dev/lofi1 /dev/lofi/2 /dev/lofi/3
den Testpool und der Admin kopiert ein paar Daten hinein. Die forensische Auswertung soll danach in Ubuntu 10.04 mit den KQ-Infotech-Treibern erfolgen.
Dafür ordnet Losetup jedem Raw-Image ein Loopback-Device zu:
losetup /dev/loop1 disk1 losetup /dev/loop2 disk2 losetup /dev/loop3 disk3
»zpool import« listet den Testpool und erlaubt Import und Mount:
zpool import -f testpool zfs set readonly=on testpool zfs set atime=off testpool zfs set exec=off testpool zfs mount testpool
Der Testpool ist lesbar, die forensischen Attribute sind gesetzt, das ZFS-Raid kann somit problemlos ausgewertet werden.
Besser auf Version 4 warten
Wer noch kein ZFS-fähiges Betriebssystem installiert hat, sollte sich auf jeden Fall für eines mit ZFS in Version 4 entscheiden. Die KQ-Infotech-Lösung scheint nicht nur für Forensiker das derzeitige Optimum zu sein, sondern auch für Admins, die bestmögliche Performance benötigen und bei der gewohnten Device-Syntax bleiben wollen.
Bis auf den Rewrite-Wert können sich die hier gemessenen Werte durchaus sehen lassen, sie liegen nur knapp unter denen von Open Solaris. Den vielversprechenden Ansatz von Kfree BSD, ein Debian auf einen Kernel von Free BSD aufzusetzen, sollten anspruchsvolle Admins erst nach einer Aktualisierung auf Version 4 in Betracht ziehen.
Infos
- Kfree BSD: https://www.linux-magazin.de/NEWS/Debian-Squeeze-unterstuetzt-ZFS-mit-kFreeBSD
- Proprietärer ZFS-Treiber von KQ Infotech: http://zfs-kqinfotech.com
- ZFS via Fuse: https://www.linux-magazin.de/NEWS/Nativer-ZFS-Support-fuer-Linux
- Ulrich Gräf, “ZFS”: Linux Technical Review 02/07, S. 126
- CDDL: http://hub.OpenSolaris.org/bin/download/Main/licensing/cddllicense.txt
- Kfree-BSD-Wiki: http://wiki.debian.org/Debian_GNU/kFreeBSD
- Iozone: http://www.iozone.org
- Xmount: https://www.pinguin.lu
- Hans-Peter Merkel, Markus Feilner, “Kreuz und quer”: Linux-Magazin 10/09, S. 90





