zfs in der praxis
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
- “mail” installieren
apt install mailutils
- Editiere "/etc/zfs/zed.d/zed.rc"
- ZED_EMAIL_ADDR="deine email-adresse"
- ZED_EMAIL_PROG=“mail”
- ZED_NOTIFY_VERBOSE=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?
- zfs will Daten lesen und die Prüfsumme passt nicht.
- zfs ließt Daten vom gespiegelten Baum und die Prüfsumme passt
- 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