Debian ZFS
Einleitung
ZFS ist ein modernes Filesystem, das erheblich mehr Funktionen bietet, als EXT4, das seit vielen Jahren das Standard Filesystem unter Linux ist. Proxmox verwendet per Default ZFS, da dies einige spezielle Funktionen von Proxmox erst möglich macht. Unter Debian kann ZFS ebenfalls relativ einfach verwendet werden. Es bietet z.B. Snapshots, die das aktuelle Filesystem festhält und relativ einfach auf einn anderes ZFS Filesystem gesichert werden kann. Der neue Snapshot belegt dabei nur das Delta zum vorherigen Snapshot auf der Festplatte. Beim Backup auf einen anderen Server können inkrementelle Backups zum Einsatz kommen, bei dem lediglich dieses Delta zum vorherigen Backup übertragen werden muss. ZFS hat builtin Raid Funktionen, die bei EXT4 via mdadm realisiert wird. Einschränkung: Erweiterung eines Raid Verbunds mit weiteren Festplatten zur Vergrüßerunng des Speicherplatzes wird derzeit (noch) nicht unterstützt. Unter BSD ist diese Funktion bereits enthalten, sodass davon auszugehen ist, dass ZFS auch unter Linux diese Funktion früher oder später lernen wird.
Installation
apt-get install zfsutils-linux zfs-zed
ZFS Pool
ZFS Pool Status
check Pool Status
zpool status
Ausgabe z.B.:
pool: rpool state: ONLINE scan: scrub repaired 0B in 00:07:05 with 0 errors on Sun Feb 14 00:31:06 2021 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 nvme-eui.0025385201418a6e-part3 ONLINE 0 0 0 errors: No known data errors
ZFS Pool anlegen
- in denn folgenden Beispielen wird ein neuer Storage Pool (spool) angelegt. Poolname kann beliegig gewählt werden.
- Es empfiehlt sich die Fesplatten per ID zu identifizieren, anstatt mittels /dev/sdx
- es ist jeweils 1 Beispiel mittels /dev/sdx , als auch /dev/desk/by-id/ata-x aufgeführt. Nachdem die Ids sehr lagne sind, sind diese mittels ata-x abgekürzt
Single HD oder Partitionn Pool
zpool create -f -o ashift=12 <pool> <device> z.B. ZFS Pool in Partition einer Festplatte zpool create -f -o ashift=12 spool /dev/sdb2 zpool create -f -o ashift=12 spool /dev/disk/by-id/ata-Samsung_SSD_xyz-part2
ZFS Raid Pool
RAID 0:
minimum 1 Festplatte
zpool create -f -o ashift=12 <pool> <device1> <device2> z.B. zpool create -f -o ashift=12 spool /dev/sdb /dev/sdc zpool create -f -o ashift=12 spool /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c
RAID-1
minimum 2 Festplatten:
zpool create -f -o ashift=12 <pool> mirror <device1> <device2> z.B. zpool create -f -o ashift=12 spool mirror /dev/sdb /dev/sdc zpool create -f -o ashift=12 spool mirror /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c
RAID-10
minimum 4 Festplatten:
zpool create -f -o ashift=12 <pool> mirror <device1> <device2> mirror <device3> <device4> z.B. zpool create -f -o ashift=12 <pool> mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde zpool create -f -o ashift=12 <pool> mirror /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c mirror /dev/disk/by-id/ata-d /dev/disk/by-id/ata-e
RAIDZ-1
vergleichbar Raid 5, minimum 3 Festplatten:
zpool create -f -o ashift=12 <pool> raidz1 <device1> <device2> <device3> z.B. zpool create -f -o ashift=12 <pool> raidz1 /dev/sdb /dev/sdc /dev/sdd zpool create -f -o ashift=12 <pool> raidz1 /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c /dev/disk/by-id/ata-d
RAIDZ-2
vergleichbar Raid 6, minimum 4 Festplatten
zpool create -f -o ashift=12 <pool> raidz2 <device1> <device2> <device3> <device4> z.B. zpool create -f -o ashift=12 <pool> raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde zpool create -f -o ashift=12 <pool> raidz2 /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c /dev/disk/by-id/ata-d /dev/disk/by-id/ata-e
Pool Raid Status
zpool status
Ausgabe z.B.
pool: rpool state: ONLINE scan: scrub repaired 0B in 00:07:05 with 0 errors on Sun Feb 14 00:31:06 2021 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 nvme-eui.0025385201418a6e-part3 ONLINE 0 0 0 errors: No known data errors pool: spool state: ONLINE scan: scrub repaired 0B in 02:23:46 with 0 errors on Sun Feb 14 02:47:48 2021 config: NAME STATE READ WRITE CKSUM spool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ata-b ONLINE 0 0 0 ata-c ONLINE 0 0 0 ata-d ONLINE 0 0 0 errors: No known data errors
Defekte Festplatte in einem Raid ersetzten
zpool replace -f <pool> <old device> <new device> z.B. defekte Platte /dev/sdc durch neue /dev/sdf in Raid-Z1 ersetzen: zpool replace -v spool /dev/sdc /dev/sdf tpool replace -v spool /dev/disk/by-id/ata-c /dev/disk/by-id/ata-f
Status des Rebuild (Resilvering unter ZFS genannt):
zpool status -v
ZFS export / import
um einen ZFS Pool zu exportieren/auszuhägen:
zpool export <pool>
Pool importieren am selben Rechner:
zpool import <pool>
falls dies nicht funktionieren sollte:
zpool import -d /dev/disk/by-id/ata-b -d /dev/disk/by-id/ata-c ... <pool>
Pool an neuem Rechner/neu installiertes Betriebssystem importieren:
zpool import -d /dev/disk/by-id/ata-b -d /dev/disk/by-id/ata-c ... <pool> -f
mit obigen import Möglichkeitenn wird der Pool jeweils unter /<pool> eingehägt um einen anderen Mountpoint zu vergebe:
zpool import -D /mount/point -d /dev/disk/by-id/ata-b -d /dev/disk/by-id/ata-c ... <pool
ZFS Datasets
Dataset anlegen
in einem nackten ZFS Pool können noch keine Daten gespeichert werden. Daten werden in sog. Datasets abgelegt.
zfs create datasetname z.B. zfs create spool/dokumente zfs create spool/filme zfs create spool/samba usw.
Vorteil mehrer Datasets gegenüber nur einem, in dem normale Unterverzeichnisse angelegt werden: Für jedes Dataset können separat snapshots angelegt werdenn. Z.B. um häufig geänndnerte Files häufiger zu sichern, als statische Daten wie z.B. CD-Images.
Datasets werden unter /poolname/dataset gemounted. D.h. obiges dataset spool/dokumente wird unter /spool/dokumente gemouted.
Datasets anzeigen
zfs list Ausgabe z.B. NAME USED AVAIL REFER MOUNTPOINT rpool 280G 619G 221M /rpool rpool/ROOT 4.68G 619G 96K /rpool/ROOT rpool/ROOT/pve-1 4.68G 619G 4.16G / rpool/data 96K 619G 96K /rpool/data
Proxmox PVE ist im Dataset rpool/Root/pve-1 installiert. pve-1 ist dabei ein Sub-Dataset vom Root Dataset. Datasets können also logisch kaskadiert werden.
Dataset umbenennen
zfs rename spool/old spool/new
Dataset zerstören:
zfs destroy /spool/datasetname
ZFS Compression
ZFS bietet die Möglichkeit Daten automatisch zu komprimieren, um Speicherplatz zu sparen:
zfs set compression=<algorithm> <dataset>
oder
zfs set compression=<algorithm> <pool>
Compressionsalgorithmus <algorithm>:
- off: keine Kompression
- lz4 (von Proxmox empfohlen, wenig Rechenleistungsbedarf)
- lzjb
- gzip-1 ... gzip-9 (1=schnellste, 9=beste Kompression)
Die Eistellung wird auf tieferliegende Datasets vererbt. D.h. wenn Compression auf Pool-Ebene eingeschaltet wird, wird sie für jedes Dataset vererbt. für einzelne Datasets kann sie dann bewusst deaktiviert werden. Funktioniert auch umgekehrt. Auf pool-Ebene off und für einzelne Datasets aktivieren.
Im Pool/Dataset bereits vorhandene Daten werden nach dem aktivieren der Compression nicht nachträglich komprimiert. Die Einstellung betrifft immer nur neu geschriebene Daten.
Snapshots
Snapshots anlegen und anzeigen
mittels Sapshots kann der aktuelle Zustand des Filesystems "eingefroren" werden. Diese Snapshots können in andere Pools / andere Pools auf anderen Rechner kopiert werden. Snapshots können auch wieder hergestellt werden, um zum Filesystem Zustand zum Zeitpunkt des Snapshots zurückzukehren.
zfs snapshot dataset@snapshotname z.B. Snapshot sonntag-cw10 vom Dataset spool/dokumente zfs snapshot spool/dokumente@sonntag-cw10
Snapshots anzeigen
zfs list -t snapshot pool/dataset
Snapshot in anderen Pool übertragen
Snapshot snapshot-source in den Pool dest-pool übertragen:
zfs send snapshot-source dest-pool/dest-dataset z.B. zfs send spool/dokumente@sonntag-cw10 backup/dokumente
Snapshot auf anderen PC übertragen
zfs send snapshot-source|ssh dest-pc zfs recv dest-pool/dest-dataset z.B. zfs send spool/dokumente@sonntag-cw10 | ssh backup-pc zfs recv backup/dokumente
Snapshot inkrementell übertragen: Im Gegensatz zu vorherigem Beispiel, muss nur das Delta zum vorherigen Snapshot übertragen werden.
zfs send -i snapshot-source1 snapshot-source2 |ssh dest-pc zfs recv dest-pool/dest-dataset z.B. zfs send spool/dokumente@sonntag-cw10 spool/dokumente@sonntag-cw9 | ssh backup-pc zfs recv backup/dokumente