neue Dateisysteme in Linux – ZFS unter Ubuntu nutzen / Update III

Eines vorweg: Ich bin noch etwas skeptisch, was ZFS angeht. Zum einen, da ZFS von ehemals SUN Microsystems, nun Oracle entwickelt wurde. Und wie man sicherlich mitbekommen hat, ist wohl der Zeit von Solaris (und auch OpenSolaris) ein Ende in naher Zukunft vorausgesagt. Auch ist die Nutzung eher für große Datacenter als für den heimischen PC angedacht. Da es aber von SUN/ Oracle in größeren Szenarien angewandt wird, sehe ich hierbei kein Problem.
Das hält einen natürlich nicht davon ab, einmal über Sinn und Unsinn von ZFS auf seinem Heimrechner nachzudenken….

Hierzu habe ich ein recht cooles Filmchen gefunden, welches von SUN Microsystems (als es die noch gab 😉 ) erstellt wurde und eine der vielen ZFS Funktionen in einem proof-of-concept sehr anschaulich demonstriert:



Das wäre also ein Beispiel, was man mit ZFS machen kann. Gut, streitbar wäre der Punkt, ob ein ZPool mit USB-Flash Laufwerken an USB Hubs richtig sinnvoll ist 😉
Man hat also eine sehr hohe Datenausfallsicherheit und kann ohne Probleme Plattensubsysteme wegnehmen, ersetzen oder an anderen Orten wieder aufstellen. Das sollte somit klar erkennbar sein.


Nun ein anderes Beispiel, bei dem man einen der ZFS Vorteile nutzen kann: Plattensubsysteme („Festplatten“) können ohne Probleme in einem Pool zusammengefasst werden und schnell und einfach um weitere Festplatten erweitert werden. Soll heißen: Man hat beispielsweise eine Festplatte mit 120GB mit ZFS in einem Pool. Nun stellt man fest, dass diese nicht mehr ausreicht, da man z.B. 350GB braucht. Nun kann man eine weitere, 250GB große Festplatte in diesen Pool hinzufügen und, ohne sich viele Gedanken über diese zwei „Platten“ machen zu müssen, beide gemeinsam als 370GB Pool nutzen.
Nach einiger Zeit reichen auch diese 370GB nicht mehr. Also kurzerhand eine weitere, diesmal 500GB große Platte in den Pool aufgenommen. Nun sind also 870GB in dem Pool nutzbar.
Also kann man nun auf die vollen 870GB (zwar auf mehreren Hardware-Platten, aber nach außen hin eine) aus dem Pool zugreifen, ohne „wie früher“ Daten zwischen den Platten hin- und herkopieren und die optimale Auslastung (Beispiel: zwei große Verzeichnisse passen nicht auf eine Platte, man stückelt usw.) herstellen zu müssen. Völlig transparent im Hintergrund kann ZFS dieses für einen übernehmen und verteilt die Daten auf den Platten.
Dieses automatische Volume-Management ist nur ein Vorteil von ZFS.

Weitere Vorteile wären:

  • Kein anfälliges Dateisystem, welches z.B. nach einem Stromausfall zeitaufwändig repariert werden muss
  • RAID Unterstützung mit ZFS RaidZ, damit hohe Ausfallsicherheit (bis zu zwei HDDs gleichzeitig)
  • integrierter Volume-Manager (obiges Beispiel nutzt dieses)
  • Dateigröße bis zu 16 ExiByte (zum Vergleich: Windows VFAT 4GB)
  • Wortlänge von 128Bit
  • automatische Datenintegritätsprüfung durch Checksummen und Korrekturen
  • Snapshots mit Differenzbildung
  • Rollback im Dateisystem
  • Komprimierung
  • Datenkonsistenz der Daten auch nach „unsanftem“ ausschalten
  • Datenübertragung der Snapshots (ZFS-Clones) in andere Systeme
 

Wo Licht ist, ist allerdings auch (etwas) Schatten zu finden. Ein paar Nachteile:

  • ZFS benötigt RAM zur Verwaltung der Datenstrukturen, mind 512MB, empfohlen 2GB oder mehr
  • noch nicht alle Betriebssysteme unterstützen ZFS
  • bei der Integration in Linux mit FUSE etwas geminderter Datendurchsatz (kaum merklich)
  • bei fehlerhafter Bedienung sind die Daten schnell weg

Exemplarisch stelle ich nun einmal ein Vorgehen vor, wie man eine USB Festplatte als single-disk-Pool einrichtet. Wichtig hierbei: Sollte man eine Festplatte mit bestehenden Daten nutzen, so sind diese unwiderbringlich (außer mit Backup) weg. Es empfiehlt sich, eine neue oder nicht benötigte Festplatte zu nehmen…. Weiterhin gilt, wie immer: Alles geschieht auf eigenes Risiko! Vertippt man sich, kann schnell das eigene System vernichtet werden!


In wenigen Schritten werde ich anhand eines Ubuntu Linux veranschaulichen, wie eine USB Festplatte für ZFS genutzt, darauf ein Pool angelegt , wie dieses Laufwerk ge-unmounted und an einem anderen Rechner gemountet wird.


  • 1. Schritt: Installation (sofern noch nicht geschehen) von ZFS FUSE

ZFS Fuse ist leider (u.a. wg. Inkompatibilität von GPL und CDDL) nicht von Haus aus mit in den Repositorys. Hierzu muss ein neuer Repo-Server eingetragen werden, danach kann mit einem Paketinstallationstool (z.B. APT) das nötige Paket nachinstalliert werden.
// Update 01.09.2010
Achtung: Hinweis für Ubuntu (und vielleicht auch andere User): Ich habe das seit wenigen Tagen verfügbare Update von zfs-fuse Version 0.6.0.1 auf 0.6.9.1 installiert, gleichzeitig kam noch ein Kernel-Update raus. Danach war ich nicht mehr in der Lage, ZFS zu nutzen. zfs und zpool konnten nicht mehr genutzt werden! Unbedingt bei Problemen die Version prüfen und ggfs. eine ältere installieren bzw. beim Update zfs-fuse ausnehmen!
Derzeit steht das Update auf 0.6.9.2 für Lucid zur Verfügung. Das habe ich noch nicht getestet und werde damit auch noch etwas warten…
Update //
// Update 26.09.2010
Ubuntu 10.04 und zfs-fuse in Version 0.6.9.2 wollten keine Freunde werden. Warum? Mir ist es schleierhaft. Und ehrlich gesagt habe ich auch wenig Lust, noch mehr rumzusuchen.
Die Versionen 0.6.0.x liefen ohne Probleme. Warum allerdings keine Version aus dem Ubuntu-APT-Repository in der Version 0.6.9.x mit ZFS wollte, ist mir unklar. Kein neuer Pool konnte angelegt werden, zpool create hat alle Versuche mit „cannot create pool…“, ebenfalls zpool import usw.

Nun habe ich endlich wieder eine Lösung hierfür gefunden. Einfach eine ganz neue Version suchen, finden, installieren und gut ist. In der /etc/apt/sources.list einen neuen Eintrag für ein weiteres APT-Repository vornehmen:

deb http://ppa.launchpad.net/bugs-sehe/zfs-fuse/ubuntu maverick main
deb-src http://ppa.launchpad.net/bugs-sehe/zfs-fuse/ubuntu maverick main

und die dort angebotene Version aktualisieren. Derzeit aktuell ist Version 0.6.9-7.
(Das obige Beispiel ist für Ubuntu 10.10 (maverick). Für 10.04 einfach maverick durch lucid ersetzen)
Und, welch ein schönes Wunder, diese Version geht und ZFS funktioniert, wie es soll 😉
Update //

Hinzufügen des Repository-Servers:
    #> sudo add-apt-repository ppa:jernej/zfs-fuse
Sollte dieses zu einer Fehlermeldung führen, dass add-apt-repository unbekannt sei, so muss zusätzlich vorher noch mit
    #> sudo apt-get install python-software-properties
dieses Tool installiert werden.
Der Repo-Server inkl. Key wird installiert und steht nun zur Verfügung. Nun kann das ZFS-Fuse Paket installiert werden.

Nun wird ZFS-Fuse installiert und kann genutzt werden:
    #> sudo apt-get install zfs-fuse
Der Dienst wird über die bekannten Systemdienst-Tools gestartet. Alternativ tut’s auch ein reboot des Systems, sollte man damit überfordert sein 😉


  • 2. Schritt: Herausbekommen, welches Device die USB Platte ist

Hierzu schauen wir in den dmesg Meldungen oder in /var/log/messages nach und suchen die Platte:

[ 6.522055] scsi 0:0:0:0: Direct-Access Hitachi HDP725050GLA360 PQ: 0 ANSI: 2 CCS
[ 6.523370] sd 0:0:0:0: Attached scsi generic sg1 type 0
[ 6.524091] sd 0:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB)
[ 6.525017] sd 0:0:0:0: [sdb] Write Protect is off
[ 6.525032] sd 0:0:0:0: [sdb] Mode Sense: 00 38 00 00
[ 6.525042] sd 0:0:0:0: [sdb] Assuming drive cache: write through
[ 6.526913] sd 0:0:0:0: [sdb] Assuming drive cache: write through
[ 6.526926] sdb: sdb1
[ 6.529959] sd 0:0:0:0: [sdb] Assuming drive cache: write through
[ 6.529978] sd 0:0:0:0: [sdb] Attached SCSI disk

Die USB Festplatte (hier eine Hitachi Festplatte mit 500GB) wird als /dev/sdb1 erkannt. (Dieses kann bei jedem abweichen und muss entsprechend angepasst werden. Trotzdem werde ich die Beispiele mit dieser Devicebezeichnung weiterführen.)
Noch befindet sich auf dieser ein ext3 Dateisystem, sie wird als /media/meineHDD gemountet und kann mit Daten gefüllt und von dieser gelesen werden.

 

  • 3. Schritt: Wir wollen diese Festplatte komplett für den ZFS Pool nutzen

Wir erstellen einen ZFS Pool mit dem Namen usbdisk bestehend aus einer Platte (sdb1)
    #> sudo zpool create usbdisk /dev/sdb1

Haben wir mehrere Platten, die wir gleichzeitig mit in den ZFS Pool fügen wollen, so können diese am Ende mit angegeben werden. Beispielsweise:
    #> sudo zpool create usbdisk /dev/sdb1 /dev/sdX1 /dev/sdY1
Dieses legt über den integrierten „Volume-Manager“ ein großes Volume (ähnlich Raid0, also keine Redundanz an). Nachträglich können ebenfalls weitere Festplatten eingefügt werden.

 

  • 4. Schritt: Wir prüfen den eingerichteten Pool und lassen uns die darin befindliche(n) Platten(n) anzeigen

Nachdem der Pool erfolgreich angelegt wurde können wir uns diesen auflisten und anzeigen lassen:
    #> sudo zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
usbdisk 464G 1011M 463G 0% ONLINE -

Automatisch wird dieser gemountet und befindet sich direkt unter /, gefolgt von dem vergebenen Poolnamen. Also in unserem Fall findet sich ein Mounteintrag mit /usbdisk.
    #> df -h
Dateisystem Größe Benut Verf Ben% Eingehängt auf
usbdisk 457G 1011M 456G 1% /usbdisk

Wir können nun Daten auf diesen kopieren und nutzen. Testweise kann man mal eine Datei anlegen
    #> sudo dd if=/dev/urandom of=/usbdisk/testfile.img bs=1024k count=100
Hiermit wird eine 100MB große Datei erstellt. Man kann sich nun mit md5sum /usbdisk/testfile.img eine Prüfsumme erstellen. Damit kann z.B. nach einem export und import auf anderem System gegengeprüft werden.

 

  • 5. Schritt: Statusüberprüfung des Pools

Um den Status, die im Pool befindlichen Platten und etwaige Fehler zu erkennen gibt es den Befehl zpool status. Über diesen kann, unter Angabe des Poolnamens (optional; wird der Pool nicht angegeben, werden alle aufgelistet) der Status des Pools abgerufen werden:
    #> sudo zpool status usbdisk

  pool: usbdisk
  state: ONLINE
  scrub: none requested
 config:
 
    NAME STATE READ WRITE CKSUM
    usbdisk ONLINE 0 0 0
     sdb1   ONLINE 0 0 0
  
  errors: No known data errors

Zu erkennen: Der Pool usbdisk besteht aus dem Device sdb1, der Pool ist online, die Festplatte OK, keine Fehler zu sehen. Also: Alles Top!

 

  • 6. Schritt: Die Festplatte wollen wir nun von dem Rechner trennen (diese soll ausgeschaltet oder an einen anderen angeschlossen werden):

Hierzu muss das ZFS Device freigegeben (exportiert oder auch ge-unmounted) werden. Das sollte man immer machen, eh die Platte getrennt wird:
    #> sudo zpool export usbdisk
Die Festplatte wird nun automatisch ge-unmounted und kann vom Rechner getrennt werden. Sollte bei dem obigen Aufruf eine Fehlermeldung kommen, dass das device busy ist, einfach mal prüfen, ob nicht noch irgendwer (man selber?) in dem Mountpoint /usbdisk ist…. Oder mit -f das unmounten forcieren.

 

  • 7. Schritt: Die Platte soll am gleichen (oder einem anderen) Rechner wieder nutzbar (d.h. gemountet) gemacht werden

Hierzu muss ZFS davon in Kenntnis gesetzt werden und die Platte mounten. Dieses geschieht über einen import. Eine Angabe des Devices ist nicht nötig. ZFS sucht sich automatisch die Platte:
    #> sudo zpool import usbdisk
Hiermit wird auf allen Platten nach einem ZFS System gesucht und dieses passend gemountet. Es steht uns nun wieder unter /usbdisk auf dem gleichen/ anderen System zur Verfügung. Ein mount zeigt einem dieses, es kann wieder drauf zugegriffen werden:

    usbdisk   on /usbdisk type fuse (rw,allow_other)

 


ZFS ist sehr umfangreich und bietet eine Fülle von Funktionen. Hier alle zu beschreiben wäre zu umfangreich 😉
Demnächst wird noch ein weiterer Blogeintrag mit mehr über ZFS erscheinen. Bis dahin lohnt es sich, einfach mal selber ein paar Seiten Doku zu ZFS durchblättern und selber zu probieren…


Weitere Infos sind hier zu finden:
http://de.wikipedia.org/wiki/ZFS_%28Dateisystem%29
http://www.pro-linux.de/artikel/2/1181/zfs-unter-linux.html
http://southbrain.com/south/tutorials/zpools.html
http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide

Dieser Beitrag wurde unter Dokus und Tipps, Linux/ UNIX, Technikspielkram abgelegt und mit , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Kommentare zu neue Dateisysteme in Linux – ZFS unter Ubuntu nutzen / Update III

  1. Lalufu sagt:

    Ich trete Dir ja nur ungerne auf die Fuesse, aber vdevs aus einem Pool entfernen (also das, was Du ganz am Anfang mit Gusto durchexerziert hast) kann ZFS nicht. Hinzufuegen ja (aber auch nur fuer linear und mirror).

    Der Linux LVM-Layer kann sowas aber.

    • rotzoll sagt:

      RE, ich danke dir.
      Die Passage habe ich entsprechend korrigiert (das „Entfernen aus dem Pool“ entfernt). Ich meinte zwar, dass ich dieses
      gelesen hatte, habe aber selber noch nicht die Zeit gehabt, es selber zu testen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*