silvesterlangen.de

Seite
Menü

ZFS

ist ein Dateisystem vom Oracle (früher Sun Microsystems) für sein OS-Produkt Solaris, welches unter der CDDL Lizenz steht. Für Linux gibt es das ZFS-Projekt ZoL (ZFS on Linux), welches ZFS unter Linux nutzbar macht. Leider wird mit dem 5.xer Kernel ein wichtiger Bestandteil fehlen, was ZoL möglicherweise nicht mehr realisierbar macht. Wie sich aber das entwickelt werden wir in der nächsten Zeit erfahren. Ich persönlich würde ZoL nicht zwangsläufig für tot erklären.

Um ein langes Geplänkel zu ersparen und gleich zum Kern der Sache zu kommen, hinterlasse ich hier das notwendige Wissen ZFS nutzen zu können. Wichtig ist, dass die offiziellen Quellen für mehr Informationen konsultiert werden sollten, da ich hier nicht alles berücksichtigen möchte.

 

ZFS Einführung

 Problematik herkömmlicher Filesysteme

1. **Problem der fehlenden Flexibilität:** Herkömmliche Filesysteme stehen in einer 1:1-Beziehung zur Partition/Laufwerk. So muss der Administrator im Vorfeld schon abschätzen/wissen wie viel Festplattenkapazität er einer Partition zuweisen muss.
2. **Fehlende Konsistenzprüfung:** Zwar lässt sich im Falle eines Filesystemfehlers im Nachhinein ein `fsck` ausführen, allerdings hat das den Nachteil, dass die betroffene Partition  nicht gemountet sein darf und somit der laufenden Betrieb gestoppt werden muss.
3. **Snapshots:** Möchte man ein Snapshot mit einem herkömmlichen FS, so ist eine Lösung wie LVM notwendig.   

Die häufigsten Ursachen für Integritätsprobleme
Schreibt man Daten auf eine Festplatte, so erwartet man, dass sie später wieder lesbar und unverändert sind. Das ist in der Regel auch so. Allerdings gibt es eine Reihe Ursachen, die dem entgegen stehen. Davon möchte ich die am häufigsten vorkommenden aufzählen.  
1. Bitfäule - Gerade bei älteren Festplatten kann auf grund des Alters dazu kommen, dass Sektoren nicht mehr richtig magnetisiert werden können. Beim späteren Leseoperationen ist es möglich, dass der Sektor dann nicht mehr lesbar ist.
2. Phantomschreiben - Bedeutet, dass bis zum Controller auf der Disk jedes Element im Computer "denkt", dass die Daten geschrieben wurden, aber faktisch kein Schreibvorgang stattgefunden hat. Eine Möglickeit ist, dass der Schreib-/Lesekopf bspw. seine Position nicht erreicht hat und die Bits an die falsche Stelle geschrieben hat. Schlimmer noch: Es lassen sich die geschriebenen Bits nicht nur nicht mehr wiederfinden, es sind im schlechtesten Fall sogar andere Bits überschrieben worden.
3. Bitflip - Bedeutet, dass der Sektor, auf dem ein Bit geschrieben wurde, die Polarisierung ändert. Das geschieht meist, wenn die Festplatte sehr alt ist und die Stelle nicht mehr richtig magnetisiert werden konnte. Aber nicht nur das. Auch Festplatten in der Nähe von Energieleitungen können einen Bitflip erleiden.
4.

Vorteile des ZFS
Die Vorteile eines ZFS sind leicht aufgezählt und sprechen für sich. Die Wahl sollte danach nicht mehr schwer fallen.

1. **Storage Pools:** Die Trennung von Controller/Raid-System und Filesystem ist aufgehoben und wird als Pool verstanden. Auf dem Pool liegt das Filesystem, was dynamisch in der Größe verändert werden kann. So wird die Flexibilität beibehalten, falls ein FS etwas mehr/weniger Kapazität benötigt als anfangs gedacht. Außerdem ist die Möglichkeit von Quotas gegeben, um Filesystemen ein Limit zuzuweisen, was wiederum Missbrauch vorbeugt. Andersrum lässt sich aber auch eine Reservierung von Speicherplatz zu.
2. **Skalierende Adressierung:** Je nach Bedarf adressiert ZFS selbstständig die Blockgröße, um so mehr Kapazität bereitzustellen.
3. **Transaktions-orientiert:** Das Filesysteme gibt keine ungenauen Zustände an das System zurück, sondern klar definierte Zustände. Die Transaktion ist 100 %ig erfolgreich verlaufen oder 100 %ig fehlgeschlagen. O oder 1. Es gibt keine Zwischenzustände wie bei anderen FS.
4. **Snapshots/Clones:** Es können problemlos und einfach Snapshots angelegt werden, um ein "Websichern" der Daten zu ermöglichen. Der Vorteil hier ist, dass ein Snapshot in einen Clon umgewandelt werden kann. Durch die Deduplizierung wird dabei keine Kopie erstellt, sondern nur Verweise. Das spart Kapazität ein und erleichtert das Administratorleben.
5. **Datenintegrität:** Noch während den Schreib- und Lesevorgängen finden Integritätsprüfungen statt. Im Falle eines "Bitflips" kann ZFS das sofort feststellen und darüber informieren. Somit können Daten, die beschädigt wurden, nicht später bspw. im Backup landen. Die Funktion ist relativ einfach erklärt. Mit jedem Verarbeitungsschritt erhalten die Daten eine 256 Bit große Checksumme, die von Stufe zu Stufe geprüft wird. Begonnen beim ZFS selbst, über die Verarbeitung in der CPU, Mainboard, Controller, Fibre-Channel bis zur eigentlichen Festplatte. Tritt dort irgendwo eine Änderung auf, so gelten die Daten als "corrupted" und müssen neu gesendet werden.
6. **Selbstreparierend:** Im RAID werden defekte Festplatten durch den oben genannten Punkt leichter identifiziert, sodass das RAID darauf reagieren kann.
7. **RAID5/6:** ZFS unterstützt RAID5-, RAID6- und ein Algorithmus mit 3-facher Parität zum Aufbau von entsprechenden RAID-Levels. Ein `mdadm` ist nicht notwendig.
8. **Performance:** ZFS ist in der Lage Daten so auf die physischen Laufwerke zu verteilen, dass eine möglichst hohe Performance zustande kommt. Diese lässt sich weiter steigen, in dem man weitere Festplatte dem Pool hinzufügt.
9. **Metadaten:** Die Metadaten speichern Informationen darüber wo genau die Daten auf dem Pool zu finden sind. Diese sind redundant im Pool gespeichert, sodass bei Verlust (ggf. ein Löschen der ersten Bytes einer Disk) diese wiederhergestellt werden können.
10. **ZFS kann unterscheiden:** ZFS kann zwischen freier Kapazität und belegten Blöcken unterscheiden. Der Vorteil macht sich beim Wiederherstellen eines physical Volumes (HDD) bemerkbar, denn es muss im RAID nur das wiederhergestellt werden, was wirklich belegt wurde.
11. **Copy on Write:** Das Filesystem arbeitet mit "Copy on Write". Das bedeutet, dass eine existierende Datei nicht mit der neuen Version (bspw. überarbeitetes Word Dokument) überschrieben wird, sondern die neuen Version zusätzlich abgelegt wird. Danach wird der Zeiger auf die neue Datei gelegt. Würde während des Schreibvorganges  der Strom ausfallen, so wäre die alte Version der Datei noch vorhanden. Ein Filsystem-Check ist nicht notwendig. Somit gibt es nur den Zustand "geschrieben" oder "nicht geschrieben"
12. **Einfach zu verwalten:**

Nachteile von ZFS

1. Die Lizenz CDDL hat einige komplexe Regelungen, die es inkompatibel mit der GPL machen. Siehe: http://www.gnu.org/philosophy/license-list.html
2. ZFS unterstützt keine "Extended Attributes" und ACLs.
3. Das Oracle (früher Sun-Microsystems) Produkt kann jederzeit zu einer Kostenfalle werden, wenn sie das Lizenzmodell ändern sollten.
4. ... Siehe: https://www.redhat.com/archives/rhl-list/2006-June/msg03623.html

ZFS installieren:
    sed -i 's/main/main contrib non-free/g' /etc/apt/sources.list
    apt-get update

    apt -y install linux-headers-$(uname -r)
    ln -s /bin/rm /usr/bin/rm
    apt-get -y install zfs-dkms

    /sbin/modprobe zfs
    systemctl restart zfs-import-cache
    systemctl restart zfs-import-scan
    systemctl restart zfs-mount
    systemctl restart zfs-share

Pools erstellen:
Einen Pool ist ein logisches Volume, welches aus physischen Volumes gebildet wird. Ihm untergeordnet sind sog. Datasets, die man wie Partitionen verstehen kann.

Mirror
    zpool create zfs_raid6 mirror /dev/vdb /dev/vdc /dev/vdd /dev/vde -f

Einfache Parität
    zpool create zfs_raid5 raidz /dev/vdb /dev/vdc /dev/vdd /dev/vde -f

Doppelte Parität
    zpool create zfs_raid6 raidz2 /dev/vdb /dev/vdc /dev/vdd /dev/vde -f

Dreifache Parität
    zpool create zfs_raidx raidz3 /dev/vdb /dev/vdc /dev/vdd /dev/vde -f

Status anzeigen
    zpool status -v zfs_raid6

Pool mounten:
    zfs set mountpoint=/mnt/ zfs_raid6

Pool löschen
    zpool destroy zfs_raid6

Pool umbenennen
    zfs rename zfs_raid6 zfs_raid5

Datasets anlegen
Ein Dataset innerhalb eines Pools sind Anteile aus dem Pool, die verwendet werden. Ein Dataset ist wie eine Partition zu verstehen. In diesem Beispiel ist rpool als Poolname verwendet!

    zfs create -o mountpoint=/storage rpool/STORAGE
    zfs create -o mountpoint=/storage2 rpool/STORAGE2

Hier sind nun die beiden Datasets nach /storage bzw. /storage2 gemountet. Das mounten wir gleich alles auf einen Schlag nach /mnt/ um.

ZFS Volumes und Mountpunkte auflisten

    zfs list

Gesamten Pool mit Datasets nach /mnt/ rübermounten

    zpool export rpool
    zpool import -R /mnt rpool

Quotas auf ZFS
Damit die Benutzer von "/mnt/Storage" nicht die Kapazität des gesamten Pools verwenden können, kann man Quotas (Kapazitätsgrenzen) einrichten. In diesem Beispiel lege ich für /mnt/storage/ 5 Gb fest.

    root@debian:/mnt# zfs set quota=5G pool1_raid5/STORAGE
    root@debian:/mnt#
    root@debian:/mnt# zfs get quota pool1_raid5/STORAGE
    NAME                 PROPERTY  VALUE  SOURCE
    pool1_raid5/STORAGE  quota     5G     local

Zusätzlich habe ich nachträglich noch 35 Gb für /mnt/storage2/ festgelegt. Ein `zfs list` zeigt dann die verfügbare Kapazität für das Dataset an:

    root@debian:/mnt# zfs list
    NAME                   USED  AVAIL  REFER  MOUNTPOINT
    pool1_raid5            229K  66,9G  27,8K  /mnt/pool1_raid5
    pool1_raid5/STORAGE   27,8K  5,00G  27,8K  /mnt/storage
    pool1_raid5/STORAGE2  27,8K  35,0G  27,8K  /mnt/storage2

Man beachte in der Spalte AVAIL die Kapazitäten für storage und storage2.

Kapazitäts-Reservierungen auf ZFS
Reservierungen sind nützlich, wenn man sicherstellen möchte, dass ein Dataset in jedem Fall die zugesicherte Kapazität erhalten soll. Es ist nicht mit Quotas zu verwechseln, wo festgelegt ist, dass die Benutzer maximal XX Gb verwenden können.

    root@debian:/mnt# zfs set reservation=18G pool1_raid5/STORAGE3
    root@debian:/mnt# zfs get reservation pool1_raid5/STORAGE3
    NAME                  PROPERTY     VALUE   SOURCE
    pool1_raid5/STORAGE3  reservation  18G     local

Snapshots
Ein großes Feature ist die Snapshotfunktion, da bspw. auf diese Weise ein Backup eines laufenden, lebenden Systems erstellt werden kann, ohne den Betrieb zu stören. Dabei ist jede Datei in einem absolut eindeutigen Zustand und konsistent.

Snapshots erstellen

    root@debian:/mnt# zfs snapshot pool1_raid5/STORAGE@freitagabend
    root@debian:/mnt# zfs list -t snapshot
    NAME                               USED  AVAIL  REFER  MOUNTPOINT
    pool1_raid5/STORAGE@freitagabend      0      -  27,8K  -

Snapshots löschen
Das Kommando zum löschen von Datasets ist mit Vorsicht zu genießen, denn ZFS stellt keine Rückfragen bevor es löscht. Hat man das falschen Snapshot erwischt, so ist es unwiederbringlich weg. Ebenso lässt sich auf diesem Wege der gesamte Pool zerstören. Also Achtung!

    zfs destroy pool1_raid5/STORAGE@freitagabend

Snapshots umbenennen
Es ist manchmal sinnvoll und notwendig Snapshots umzubenennen. Das folgende Beispiel benennt einen Snapshot um von "@freitagabend" zu "@freitagmittag".

    zfs rename pool1_raid5/STORAGE@freitagabend \
     pool1_raid5/STORAGE@freitagmittag

Zu einem Snapshot zurückkehren
Was bringt das beste Snapshot, wenn man im Zweifelsfall nicht darauf zurückkehren kann. Die folgende Zeile brigt den Zustand des Snapshots "@freitagabend" zurück. Möglicherweise war das bspw. der Zustand bevor der Cryptotrojaner zuschlug.

    zfs rollback pool1_raid5/STORAGE@freitagmittag

Clones
Clones bieten die Möglichkeit mit einem bestehenden Datenbestand zu Testzwecken zu arbeiten ohne den Produktivdatenbestand zu gefährden. Clones basieren auf Snapshots und sind beschreibbar. Klone basieren auf Snapshots. Diese lassen sich nur löschen, wenn die auf ihnen basierenden Klone vorher gelöscht wurden.

Clones erstellen

    zfs clone pool1_raid5/STORAGE@freitagmittag \
     pool1_raid5/CLONE123

    root@debian:/mnt/storage# zfs list
    NAME                   USED  AVAIL  REFER  MOUNTPOINT
    pool1_raid5           18,0G  48,9G  27,8K  /mnt/pool1_raid5
    pool1_raid5/CLONE123  1,74K  48,9G  27,8K  /mnt/pool1_raid5/CLONE123
    pool1_raid5/STORAGE   43,5K  5,00G  27,8K  /mnt/storage
    pool1_raid5/STORAGE2  27,8K  35,0G  27,8K  /mnt/storage2
    pool1_raid5/STORAGE3  27,8K  66,9G  27,8K  /mnt/mnt/storage3

Clones löschen
Hier ist wieder der gefährliche Befehl. Bitte vorsichtig und mit Bedacht ausführen. Lieber zwei mal gucken. ;-)

    zfs destroy pool1_raid5/CLONE123

ZFS Replikation
Die Basis der ZFS-Replikation ist der Snapshot. Das bedeutet, dass es keine Synchronisation zwischen zwei Servern ist, sondern eine Replikation zwischen zwei Pools.

Verfügt man also über einen zweiten Pool, der für Backups genutzt werden soll, so überträgt man einfach den Snapshot des einen Polls auf den Backup-Pool.

Die folgende Zeile überträgt den Snapshot @freitagmittag mittels SSH-Tunnel auf einen anderen Server. Natürlich kann es auch auf dem gleichen Server sein. Dann ist der SSH-Anteil des Kommandos zu entfernen.

    zfs snapshot pool1_raid5/STORAGE@freitagmittag
  zfs send pool1_raid5/STORAGE@freitagmittag | ssh \
   user@server.example.com "zfs receive pool/test"

Disk austauschen

Und jetzt kommt der beinahe wichtigste Teil: Der Austausch einer defekten Disk. Stellt man fest, dass eine Disk nicht mehr okay ist, so muss sie natürlich ausgetauscht werden. Sinnvollerweise sollte es dann eine gleichwertige Disk sein, aber in jedem Fall nicht kleiner, langsamer oder sonst irgendwie "schlechter".

Der Austausch funktioniert wie folgt: Zunächst stellt man fest, dass eine Disk nicht mehr okay ist. Das erfährt man beispielsweise mit:

     zpool status [poolname]

In der Spalte STATE steht dann in der Zeile der Festplatte "Offline" oder "UNAVAIL". Der Pool selbst wird als "DEGRADED" markiert. Es ist quasi unübersehbar, dass hier eine Disk das Zeitliche gesegnet hat.

Nun wirft man die Platte einfach mit folgendem Befehl aus:

     zpool detach sde

Die alte Platte kann nun herausgezogen werden. Die neue Platte dann an dessen Stelle einschieben, mit lsblk anzeigen lassen, welche das ist (hier die Annahme, dass sie sdf ist und sdd ist die noch heile zweite Platte aus dem Mirror-Set) und sie (die Neue) kann mit folgendem Befehl hinzugefügt werden:

     zpool attach -f [poolname] [noch_heile_Disk] [neue_Disk]

   zpool attach -f zfsmirror /dev/sdd /dev/sdf

Danach kann man sich anschauen, ob sie wiederhergestellt wird:

     zpool status zfsmirror

 

Quellen

Erstellen: https://docs.oracle.com/cd/E19253-01/820-2313/gaynr/index.html

Löschen: https://docs.oracle.com/cd/E19253-01/820-2313/gammq/index.html

Quotas & Reservations: https://docs.oracle.com/cd/E23823_01/html/819-5461/gazvb.html

« vorige Seite Seitenanfang nächste Seite »
Seite
Menü
Earned Certificates:
LPIC-1 LPIC-1 LPIC-1
Powered by CMSimple | Template by CMSimple | Login