Naja lange Rede kurzer Unsinn.
ZFS! Immer wieder hört man das es sich hierbei "nur" um ein Filesystem handelt. Ich will heute mal zeigen das das zwar stimmt, ZFS aber sehr viel mehr ist. Es ist praktisch ein Storage Werkzeugkoffer der fast alles abdeckt was einem in Sachen Storage so über den Weg laufen kann. Das Element mit dem alles anfängt ist der sogenannte zpool. In einem zpool packen wir alles was wir an Storage so nutzen wollen: Festplatte, USB-Sticks, einfach nur Dateien und was weiß ich noch für Devices. Ich werde hier aufgrund eines notorischen Festplattenmangels einfach ganz normale Files nehmen die jeweils 100MB Größe haben.
ZPools
Als erstes werden wir einfach mal die einfachste Sorte von zpools anlegen, nämlich solche die nur aus einem Datenträger bestehen.
[root@itzkoatl:zfsdemo]> zpool create tank $PWD/disk1 
[root@itzkoatl:zfsdemo]> zpool list
NAME    SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank   95.5M  73.5K  95.4M     0%  ONLINE  -
[root@itzkoatl:zfsdemo]> zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:
 NAME                                  STATE     READ WRITE CKSUM
 tank                                  ONLINE       0     0     0
   /export/home/raichoo/zfsdemo/disk1  ONLINE       0     0     0
errors: No known data errors
Das wars eigentlich schon. Alleine durch die Eingabe von zpool create tank $PWD/disk1 haben wir einen neuen zpool erstellt. Kein formatieren, kein mounten. Das File wurde direkt mit einem ZFS Filesystem auf dem mountpunkt /tank angehängt. Das dauert nur wenige Sekunden.
Was aber machen wenn man mehrere Festplatten hat und deren Platz in einem pool verwenden will?
[root@itzkoatl:zfsdemo]> zpool add tank $PWD/disk2   
[root@itzkoatl:zfsdemo]> zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:
 NAME                                  STATE     READ WRITE CKSUM
 tank                                  ONLINE       0     0     0
   /export/home/raichoo/zfsdemo/disk1  ONLINE       0     0     0
   /export/home/raichoo/zfsdemo/disk2  ONLINE       0     0     0
errors: No known data errors
[root@itzkoatl:zfsdemo]> zpool list 
NAME    SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank    191M  82.5K   191M     0%  ONLINE  -
Wir haben die neue Platte einfach durch add in den zpool eingefügt und wir zpool list zeigt hat sich die Kapazität von tank verdoppelt.
Wir können aber auch zpool mit RAID Fähigkeiten erstellen, dazu gibt es die subkommandos mirror, raidz und raidz2.
[root@itzkoatl:zfsdemo]> zpool create tank mirror $PWD/disk1 $PWD/disk2
[root@itzkoatl:zfsdemo]> zpool status tank
  pool: tank
 state: ONLINE
 scrub: none requested
config:
 NAME                                    STATE     READ WRITE CKSUM
 tank                                    ONLINE       0     0     0
   mirror                                ONLINE       0     0     0
     /export/home/raichoo/zfsdemo/disk1  ONLINE       0     0     0
     /export/home/raichoo/zfsdemo/disk2  ONLINE       0     0     0
errors: No known data errors
...
[root@itzkoatl:zfsdemo]> zpool create tank raidz2 $PWD/disk1 $PWD/disk2 $PWD/disk3 $PWD/disk4
[root@itzkoatl:zfsdemo]> zpool status tank                                    
  pool: tank
 state: ONLINE
 scrub: none requested
config:
 NAME                                    STATE     READ WRITE CKSUM
 tank                                    ONLINE       0     0     0
   raidz2                                ONLINE       0     0     0
     /export/home/raichoo/zfsdemo/disk1  ONLINE       0     0     0
     /export/home/raichoo/zfsdemo/disk2  ONLINE       0     0     0
     /export/home/raichoo/zfsdemo/disk3  ONLINE       0     0     0
     /export/home/raichoo/zfsdemo/disk4  ONLINE       0     0     0
errors: No known data errors
Man kann noch sehr viel mehr mit zpools anstellen, aber das reicht fürs erste ;).
Filesysteme
Das erste Filesystem haben wir ja schon mit dem Erstellen des zpools angelegt. Es trägt den Namen tank und ist unter /tank gemountet.
[root@itzkoatl:zfsdemo]> zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank  98.6K   158M  26.9K  /tank
Wir tun jetzt einfach mal so als würden wir eine Art home-Struktur anlegen wollen. Dazu legen wir ein separates home-Filesystem und ein Filesystem für jeden Benutzer an. ZFS Filesysteme sind in etwa vergleichbar mit dem was man unter herkömmlichen Filesystemen als Partitionen bezeichnet, nur das sie sich in ihrer Größe dem Inhalt anpassen. Ein ZFS Filesystem in dem also nichts liegt wird auch praktisch nichts an Plattenplatz belegen.
[root@itzkoatl:zfsdemo]> zfs create tank/home
[root@itzkoatl:zfsdemo]> zfs create tank/user1
[root@itzkoatl:zfsdemo]> zfs create tank/user2
[root@itzkoatl:zfsdemo]> zfs create tank/user3
[root@itzkoatl:zfsdemo]> zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank         247K   158M  34.4K  /tank
tank/home   26.9K   158M  26.9K  /tank/home
tank/user1  26.9K   158M  26.9K  /tank/user1
tank/user2  26.9K   158M  26.9K  /tank/user2
tank/user3  26.9K   158M  26.9K  /tank/user3
So wir haben unsere Filesysteme erstellt aber UPS! unsere User sind ja gar nicht an der richtigen Stelle gemountet, eigentlich gehören die ja nach /tank/home. Kein Problem, wir können den Mountpoint im Nachhinein einfach setzen
[root@itzkoatl:tank]> zfs set mountpoint=/tank/home/user1 tank/user1
[root@itzkoatl:tank]> zfs rename tank/user1 tank/home/user1
[root@itzkoatl:tank]> zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank              258K   158M  32.9K  /tank
tank/home        55.3K   158M  28.4K  /tank/home
tank/home/user1  26.9K   158M  26.9K  /tank/home/user1
tank/user2       26.9K   158M  26.9K  /tank/user2
tank/user3       26.9K   158M  26.9K  /tank/user3
Das rename ist eigentlich nicht nötig, ich habe es allerdings hier aus Schönheitsgründen mal gemacht ;). Durch das Umsetzen des Mountpoints wird das Filesystem von seinem alten Standort ausgehängt und am neuen Mountpoint eingehängt, alles automatisch.
Wir räumen jetzt einfach mal die anderen Filesysteme weg und arbeiten nur noch mit user1 weiter.
[root@itzkoatl:tank]> zfs destroy tank/user2
[root@itzkoatl:tank]> zfs destroy tank/user3
Filesystem Attribute
Jetzt zu ein paar interessanten Attributen die man mit set und get setzen und auslesen kann. Ich werde nur ein paar davon zeigen weil es wirklich eine ganze Menge sind, aber ich halte diese für die praktischsten.
Reservation
Hiermit läßt sich Plattenplatz aus dem zpool reservieren. Dem Filesystem wird also eine bestimmte Menge Storage zugesichert, wie man unten sieht hat tank/home/user1 10MB mehr Speicher zur Verfügung als alle anderen Filesysteme.
[root@itzkoatl:tank]> zfs set reservation=10m tank/home/user1
[root@itzkoatl:tank]> zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank              10.2M   148M  28.4K  /tank
tank/home         10.0M   148M  28.4K  /tank/home
tank/home/user1   26.9K   158M  26.9K  /tank/home/user1
Quotas
Was man reservieren kann, kann man aus begrenzen. Mit Quotas lassen sich Filesysteme klein halten.
[root@itzkoatl:tank]> zfs set quota=10m tank/home/user1
[root@itzkoatl:tank]> zfs list                         
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             10.2M   148M  28.4K  /tank
tank/home        10.0M   148M  28.4K  /tank/home
tank/home/user1  26.9K  9.97M  26.9K  /tank/home/user1
Compression
Der Name sagt es schon. Filesysteme lassen sich transparent komprimieren. Es gibt unterschiedliche Algorithmen wir nehmen hier gzip als Beispiel.
[root@itzkoatl:tank]> zfs set compression=gzip tank/home/user1
[root@itzkoatl:tank]> zfs get compression tank/home/user1
NAME             PROPERTY     VALUE            SOURCE
tank/home/user1  compression  gzip             local
Hier sollte man daran denken das nur Dateien komprimiert werden die nachträglich im Filesystem erstellt werden. Auch zeigt ls nicht die komprimierte sondern die reale Größe der Datei an.
NFS
Besonders praktisch ist NFS Sharing. Ich werde hier nur die einfachste Form zeigen, aber anstatt on lassen sich die normalen NFS Optionen für das Filesystem angeben. Unter Solaris wird hier alles automatisch eingerichtet und gestartet so das das eingeben einer einzige Zeile reicht um Filesysteme zu sharen (keine Ahnung wie das unter anderem Systemen ist).
[root@itzkoatl:tank]> zfs set sharenfs=on tank/home/user1
Das sind nur ein paar der vielen Attribute die ZFS bietet, alle zu zeigen würden den Rahmen sprengen ;)
Snapshots
Kommen wir zu einem meiner Lieblingsfeatures: Snapshots. Mit Snapshots lassen sich Filesysteme zu einem bestimmten Zeitpunkt einfrieren und auch wieder zurückspielen (und das innerhalb von ein paar Sekunden und ohne das es extra Plattenplatz belegt). Es ist ebenfalls jederzeit möglich in angelegt Snapshots reinzugucken. Wir werden jetzt einfach mal folgendes machen: Wie legen eine Datei mit dem Text "Das ist ein Test" an, danach erstellen wir einen Snapshot und werden die Datei verändern.
[root@itzkoatl:user1]> echo "Das ist ein Test" > text
[root@itzkoatl:user1]> ls
text
[root@itzkoatl:user1]> cat text
Das ist ein Test
[root@itzkoatl:user1]> zfs snapshot tank/home/user1@kleinertest
Ok wir haben den Zustand unseres Filesystems jetzt unter dem Snapshot mit dem Namen kleinertest gesichert. Nun wollen wir unsere Datei mal kaputtmachen und alles wieder herstellen.
[root@itzkoatl:user1]> echo "Ich mach alles kaputt!" >| text 
[root@itzkoatl:user1]> cat text 
Ich mach alles kaputt!
[root@itzkoatl:user1]> cat .zfs/snapshot/kleinertest/text 
Das ist ein Test
[root@itzkoatl:user1]> zfs rollback tank/home/user1@kleinertest
[root@itzkoatl:user1]> cat text                                
Das ist ein Test
Wie man sieht existiert ein versteckter Ordner .zfs, dieser wird nicht von ls -a angezeigt (Es sei denn man setzt ein bestimmtes Attribut) sondern praktisch on-the-fly erstellt wenn man explizit auf ihn zugreift. Mit zfs rollback spulen wir das Filesystem wieder zu dem Zeitpunkt zurück an dem wir den Snapshot kleinertest erstellt haben (der Snapshot selber existiert weiter). Snapshot sind nicht beschreibbar aber es lassen sich mit zfs clone schreibbare Filesysteme aus einem Snapshot erstellen.
Serialisieren
Ein Filesystem läßt sich in eine einzelne Datei ausgeben die sich dann verschicken läßt und woanders wieder in ein Filesystem umwandeln läßt (sehr praktisch für Backups). Dazu brauchen wir erst einmal einen Snapshot, dieser läßt sich mit zfs send serialisieren und mit zfs receive wieder "entpacken".
[root@itzkoatl:user1]> zfs send tank/home/user1@kleinertest > /tank/dump
[root@itzkoatl:user1]> ls -l /tank/dump
-rw-r--r--   1 root     root       15680 Nov  1 17:29 /tank/dump
[root@itzkoatl:user1]> zfs receive tank/home/user2 < /tank/dump
[root@itzkoatl:user1]> cat /tank/home/user2/text 
Das ist ein Test
[root@itzkoatl:user1]> zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank              10.2M   148M  45.6K  /tank
tank/home         10.1M   148M  31.4K  /tank/home
tank/home/user1   29.1K  9.97M  29.1K  /tank/home/user1
tank/home/user2   27.6K   148M  27.6K  /tank/home/user2
Wir haben also nun aus der dump-datei einfach ein neues Userverzeichnis erstellt welches den Zeitpunkt wiederspiegelt an dem wir kleinertest erstellt haben. Snapshots lassen sich auch separat mit zfs list -t snapshot anzeigen
[root@itzkoatl:user1]> zfs list -t snapshot
NAME                          USED  AVAIL  REFER  MOUNTPOINT
tank/home/user1@kleinertest      0      -  29.1K  -
tank/home/user2@kleinertest      0      -  27.6K  -
Wie man sieht waren in unserem dump sogar alle Snapshots des Filesystems erhalten (user2 hat ebenfalls einen Snapshot kleinertest)
Import und Export
Filesysteme müssen manchmal mobil sein, z.b. wenn sie auf USB-Sticks liegen. Hierzu kann man zpools einfach exportieren. Exportierte zpools sind ohne das man sie wieder importiert nicht benutzbar (sie werden auch automatisch ausgehängt etc). Steckt man z.b. einen USB-Stick mit einem zpool in das System ein, reicht unter Solaris ein zpool import und alle exportierten Ports werden angezeigt. Ohne Paramter durchsucht dieser Befehl automatisch alle Datenträger nach exportierten zpools im /dev Filesystem.
Da unsere disk Dateien jetzt aber keine echten Devices sind müssen wir den Ort an dem zpool import suchen soll explizit angeben.
[root@itzkoatl:~]> zpool export tank
[root@itzkoatl:~]> zpool import -d ./zfsdemo
  pool: tank
    id: 14691414290482700440
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
 tank                                    ONLINE
   raidz2                                ONLINE
     /export/home/raichoo/zfsdemo/disk1  ONLINE
     /export/home/raichoo/zfsdemo/disk2  ONLINE
     /export/home/raichoo/zfsdemo/disk3  ONLINE
     /export/home/raichoo/zfsdemo/disk4  ONLINE
[root@itzkoatl:~]> zpool import -d ./zfsdemo tank
Das war ein kleiner aber recht umfangreicher Ausflug in die Welt von ZFS. Und vielen dürfte jetzt klar sein das ZFS mehr ist als nur Volumemanager und Filesystem in einem, es ist ein Storage Verwaltungstools. ZFS ist inzwischen neben Solaris auf FreeBSD, MacOSX und Linux (nur über FUSE) verfügbar. An weiteren Ports wird gearbeitet.
Keine Kommentare:
Kommentar veröffentlichen