Inhaltsverzeichnis

  • Demo Aufbau
    • VirtualBox virtuelle Maschine
  • Installation
    • ZFS installieren
    • Ram begrenzen
    • Email Benachrichtigung
  • ZFS pools
    • raid-volumes vs zfs-pools
  • Datasets (Dateisysteme) erstellen
    • Berechtigungen vergeben
  • zVols (Blockdevices) erstellen
  • ZFS kaputt machen
    • Arbeitslast auf dem pool simulieren
    • Ausfall einer Platte simulieren
    • Festplatte ersetzen
    • Holzhammer gegen zfs - don’t try this at home !
  • Bonus
    • Exportieren/Importieren
  • zfs-auto-snapshot Standardeinstellungen
  • Nützliche zfs/zpool Befehle

Demo Aufbau

VirtualBox virtuelle Maschine

  • Debian basiertes Betriebssytem (z.B. pop-os)
  • extra Festplatten für den zfs pool sind schon “verbaut”

Infos zu den Festplatten

root@pop-os:~# lsblk --ascii -o PATH,SERIAL,PARTUUID,SIZE
PATH                  SERIAL  PARTUUID                              SIZE
/dev/sda              VB17a11                                        20G
/dev/sda1                     76be3bee-01                            16G
/dev/sda2                     76be3bee-02                             4G
/dev/sdb              VB95810                                        25G
/dev/sdc              VB7caf3                                        50G
/dev/sdd              VBb71f2                                       100G
/dev/sde              VB534c8                                       100G
/dev/sdf              VBe5cc5                                       100G
/dev/sdg              VBd6af0                                       100G
/dev/sr0              VB2-017                                      58,3M
/dev/mapper/cryptswap                                                 4G

Installation

ZFS installieren

root@pop-os:~# apt install zfsutils-linux zfs-auto-snapshot

Ram begrenzen

arc = adaptive replacement cache

Den benutzt ZFS zum zwischenspeichern von Daten (Cache im Arbeitsspeicher)

Zum Beispiel arc auf 1GB begrenzen:

root@pop-os:~# echo "options zfs zfs_arc_max=$[1*1024*1024*1024]" > /etc/modprobe.d/zfs.conf
root@pop-os:~# echo "$[1*1024*1024*1024]" > /sys/module/zfs/parameters/zfs_arc_max

Email Benachrichtigung

  1. “mail” installieren
apt install mailutils
  1. Editiere "/etc/zfs/zed.d/zed.rc"
  • ZED_EMAIL_ADDR="deine email-adresse"
  • ZED_EMAIL_PROG=“mail”
  • ZED_NOTIFY_VERBOSE=1
  1. zed Daemon neustarten
systemctl restart zed

ZFS pools

raid-volumes vs zfs-pools

herkömmliches Speicher Design ZFS Speicher design

zpool create

zpool create -o zpool-property=value -O zfs-property=value name vdev

Alle sieben VDEVs in ZFS:
  • disk (default) - The physical hard drives in your system.
  • file - The absolute path of pre-allocated files/images.
  • mirror - Standard software RAID-1 mirror.
  • raidz1/2/3 - Non-standard distributed parity-based software RAID levels.
  • spare - Hard drives marked as a “hot spare” for ZFS software RAID.
  • cache - Device used for a level 2 adaptive read cache (L2ARC). (read cache)
  • log - A separate log (SLOG) called the “ZFS Intent Log” or ZIL. (write cache)
Gespiegelten Pool und verschlüsseltes root-filesystem erstellen
root@pop-os:~# zpool create \
-o autoexpand=on \
-o autoreplace=on \
-o autotrim=on \
-O sync=disabled \
-O compression=lz4 \
-O encryption=on \
-O keylocation=prompt \
-O keyformat=passphrase \
pool \
mirror /dev/sdb /dev/sdc -f

Datasets (Dateisysteme) erstellen

root@pop-os:~# zfs create pool/datasets
root@pop-os:~# zfs create pool/datasets/Backup
root@pop-os:~# zfs create -o quota=50GB pool/datasets/Daten
root@pop-os:~# zfs create -o quota=50GB pool/datasets/Images
root@pop-os:~# zfs create -o quota=100GB pool/datasets/Media
root@pop-os:~# zfs create -o quota=100GB pool/datasets/docker
root@pop-os:~# zfs create -o quota=500GB pool/datasets/home
root@pop-os:~# zfs create -o quota=200GB pool/datasets/home/mk
root@pop-os:~# zfs create -o quota=100GB pool/datasets/nextcloud
root@pop-os:~# zfs create -o quota=100GB pool/datasets/steam
root@pop-os:~# zfs create -o quota=200GB pool/datasets/virtualbox
root@pop-os:~# zfs create pool/datasets/nfs
root@pop-os:~# zfs create -o quota=200GB -o sharenfs='maproot=root -alldirs -network 192.168.1.0 -mask 255.255.255.0' pool/datasets/nfs/Backup
root@pop-os:~# zfs create -o quota=200GB -o sharenfs='maproot=root -alldirs -network 192.168.1.0 -mask 255.255.255.0' pool/datasets/nfs/Restore

Berechtigungen vergeben

root@pop-os:~# chown -R cipherpunk:cipherpunk /pool

zVols (Blockdevices) erstellen

root@pop-os:~# zfs create pool/zvols
root@pop-os:~# zfs create -V 5GB -o com.sun:auto-snapshot=false -o primarycache=metadata -o secondarycache=metadata pool/zvols/swap
root@pop-os:~# zfs create -V 10GB pool/zvols/Games

ZFS kaputt machen

Arbeitslast auf dem pool simulieren

fio installieren

root@pop-os:~# apt install -y fio

mit fio eine Datei im pool erstellen und konstant 1MB/s in die Datei schreiben

root@pop-os:~# fio \
--filename=/pool/fiotest \
--sync=1 \
--rw=write \
--name=journal-test \
--size=10000m \
--rate=1m,1m

Ausfall einer Platte simulieren

Im Gegensatz zu herkömmlichen Raidcontrollern weiß ZFS welche Bits auf den Platten “relevant” sind für das Dateisystem und welche nicht. Wenn eine Platte nur kurz ausfällt, muss deshalb nicht ein rebuild über die gesamte Festplatte passieren, sondern nur über die Bits, die sich seit dem Ausfall verändert haben.

root@pop-os:~# zpool offline pool /dev/sdb
root@pop-os:~# zpool online pool /dev/sdb
root@pop-os:~# zpool offline pool /dev/sdb
root@pop-os:~# zpool online pool /dev/sdb

Festplatte ersetzen

root@pop-os:~# zpool replace pool /dev/sdb /dev/sdd

Holzhammer gegen zfs - don’t try this at home !

Im laufenden Betrieb eine Platte mit Zufall zerschreddern

root@pop-os:~# dd if=/dev/urandom of=/dev/sdb1

zfs zwingen alle Daten zu lesen und zu prüfen

root@pop-os:~# zpool scrub pool

Self healing filesystem

Was passiert, wenn Prüfsumme nicht passt?
  1. zfs will Daten lesen und die Prüfsumme passt nicht.
  2. zfs ließt Daten vom gespiegelten Baum und die Prüfsumme passt
  3. zfs kopiert gute Daten über schlechte Daten

Bonus

Pool sperren - Schlüssel entfernen (rekursiv)

root@pop-os:/pool# zfs unmount pool
root@pop-os:/pool# zfs unload-key -r pool

Pool entsperren - Schlüssel laden (rekursiv)

root@pop-os:/pool# zfs load-key -r pool
Enter passphrase for 'pool':
1 / 1 key(s) successfully loaded

root@pop-os:/pool# zfs mount pool

Exportieren/Importieren

Macht man eigentlich eher selten. Ist vielleicht interessant, wenn man zfs auf externen Festplatten nutzen möchte.

Pool exportieren

root@pop-os:~# zpool export pool

Pool importieren

root@pop-os:~# zpool import pool

Dieser Befehl importiert die Platten nicht anhand von “variablen Pfaden” (/dev/sda), sondern automatisch anhand der eindeutigen Partitions-UUID (b7b587bc-622f-5840-b9b7-2b1094e2a99e)

root@pop-os:~# zpool import -d /dev/disk/by-partuuid -aN pool

zfs-auto-snapshot Standardeinstellungen

  • 79 Snapshots pro dataset/zvol
  • Daten aus den letzten 12 Monaten lassen sich wiederherstellen
Skriptpfad Ausführungsfrequenz Anzahl Snapshots Hält Daten vor der letzten
/etc/cron.d/zfs-auto-snapshot 15 minütlich 4 60 Minuten
/etc/cron.hourly/zfs-auto-snapshot stündlich 24 24 Stunden
/etc/cron.daily/zfs-auto-snapshot täglich 31 31 Tage
/etc/cron.weekly/zfs-auto-snapshot wöchentlich 8 8 Wochen
/etc/cron.monthly/zfs-auto-snapshot monatlich 12 12 Monate

Nützliche zfs/zpool Befehle

Alle pools auflisten

root@pop-os:~# zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pool   992G   130K   992G        -         -     0%     0%  1.00x    ONLINE  -

Status aller pools abfragen

root@pop-os:~# zpool status
  pool: pool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool        ONLINE       0     0     0
          sdb       ONLINE       0     0     0

Performance aller pools abfragen

root@pop-os:~# zpool iostat -v
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write- -- -- -- -- -- --
pool         165K  1,95T      0      8  5,17K  32,9K
  mirror     165K  1,95T      0      8  5,55K  35,3K
    sdd         -      -      0      6  4,16K  23,6K
    sde         -      -      0      3  1,85K  14,7K- -- -- -- -- -- --

Größe des ARCs (adaptive replacement cache) anzeigen

arcsz = Größe des arc im Arbeitsspeicher

root@pop-os:~# arcstat 1
    time  read  miss  miss%  dmis  dm%  pmis  pm%  mmis  mm%  arcsz     c
12:20:47     0     0      0     0    0     0    0     0    0   1.0G  1.0G