ZFS unter Linux
Die Befehle zpool und zfs
Zum Kennenlernen folgt hier eine kurze Liste, was man mit den neuen Befehlen zpool und zfs erreichen kann.
Um die bestehenden Pools aufzulisten, benutzt man den 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, neu: 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 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.
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 zfs create tank/files/martin zfs create tank/files/frank zfs create tank/files/jan
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 pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 errors: No known data errors
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 pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz1 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 spares sdf AVAIL errors: No known data errors
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