ZFS ist ein fortschrittliches Dateisystem mit integriertem Volume-Management. Es bietet Datenintegrität, Snapshots, Kompression und RAID-Funktionalität in einem System.
ZFS-Konzepte
Hierarchie
ZFS-Pool (zpool)
│
├── vdev (Virtual Device)
│ ├── Disk 1
│ ├── Disk 2
│ └── Disk 3
│
└── Dataset
├── Filesystem
├── Volume (zvol)
└── SnapshotVorteile
| Feature | Beschreibung | |---------|--------------| | Copy-on-Write | Keine Datenkorruption bei Crashes | | Checksums | Automatische Fehlererkennung | | Snapshots | Sofortige Sicherungspunkte | | RAID-Z | Integriertes Software-RAID | | Kompression | Transparente Datenkompression | | Deduplication | Optional: Doppelte Blöcke eliminieren |
Installation
Debian/Ubuntu
apt install zfsutils-linuxCentOS/RHEL
dnf install epel-release
dnf install kernel-devel
dnf install https://zfsonlinux.org/epel/zfs-release-2-2.el9.noarch.rpm
dnf install zfs
modprobe zfsModul laden
modprobe zfs
lsmod | grep zfsPool erstellen
Einfacher Pool
# Einzelne Disk
zpool create tank /dev/sdb
# Ohne Partition
zpool create -f tank /dev/sdbMirror (RAID 1)
zpool create tank mirror /dev/sdb /dev/sdcRAID-Z (RAID 5 äquivalent)
# RAID-Z1 (1 Parity)
zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd
# RAID-Z2 (2 Parity)
zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# RAID-Z3 (3 Parity)
zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdfStriped Mirror (RAID 10)
zpool create tank \
mirror /dev/sdb /dev/sdc \
mirror /dev/sdd /dev/sdeMit Cache und Log
zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd \
cache /dev/nvme0n1p1 \
log mirror /dev/nvme0n1p2 /dev/nvme1n1p2Pool-Verwaltung
Status anzeigen
# Pools auflisten
zpool list
# Pool-Status
zpool status
zpool status -v tank
# I/O-Statistiken
zpool iostat
zpool iostat -v tank 1Pool erweitern
# Disk zu bestehendem vdev (nur bei Mirror)
zpool attach tank /dev/sdb /dev/sdd
# Neues vdev hinzufügen
zpool add tank mirror /dev/sde /dev/sdfPool exportieren/importieren
# Export
zpool export tank
# Import
zpool import tank
# Alle verfügbaren Pools
zpool importDatasets
Dataset erstellen
# Filesystem
zfs create tank/data
zfs create tank/data/documents
# Mit Mountpoint
zfs create -o mountpoint=/srv/data tank/dataDataset-Eigenschaften
# Eigenschaften anzeigen
zfs get all tank/data
# Eigenschaft setzen
zfs set compression=lz4 tank/data
zfs set quota=100G tank/data
zfs set reservation=50G tank/data
# Vererbte Eigenschaften
zfs set compression=lz4 tank
# Alle Datasets unter tank erben compressionWichtige Eigenschaften
| Eigenschaft | Beschreibung | |-------------|--------------| | compression | lz4, zstd, gzip, off | | quota | Maximale Größe | | reservation | Garantierter Speicher | | recordsize | Blockgröße | | atime | Access Time | | sync | Sync-Verhalten | | dedup | Deduplizierung |
Empfohlene Einstellungen
# Kompression (fast immer sinnvoll)
zfs set compression=lz4 tank
# Kein Access Time Update
zfs set atime=off tank
# Für Datenbanken
zfs set recordsize=16K tank/mysql
zfs set logbias=throughput tank/mysql
# Für VMs
zfs set recordsize=64K tank/vmsSnapshots
Snapshot erstellen
# Einfacher Snapshot
zfs snapshot tank/data@backup-2026-01-26
# Rekursiv (alle Datasets)
zfs snapshot -r tank@weeklySnapshots verwalten
# Snapshots auflisten
zfs list -t snapshot
zfs list -t snapshot -r tank
# Snapshot löschen
zfs destroy tank/data@old-snapshot
# Mehrere löschen
zfs destroy tank/data@snap1,snap2,snap3Rollback
# Zum Snapshot zurückkehren
zfs rollback tank/data@backup-2026-01-26
# Force (löscht neuere Snapshots)
zfs rollback -r tank/data@backup-2026-01-26Daten aus Snapshot wiederherstellen
# Snapshots sind unter .zfs/snapshot erreichbar
ls /tank/data/.zfs/snapshot/backup-2026-01-26/
# Einzelne Datei wiederherstellen
cp /tank/data/.zfs/snapshot/backup-2026-01-26/wichtig.txt /tank/data/Send/Receive
Lokal kopieren
# Dataset kopieren
zfs send tank/data@snap1 | zfs receive tank/backup
# Inkrementell
zfs send -i tank/data@snap1 tank/data@snap2 | zfs receive tank/backupRemote-Replikation
# Initial
zfs send tank/data@snap1 | ssh remote zfs receive backup/data
# Inkrementell
zfs send -i tank/data@snap1 tank/data@snap2 | ssh remote zfs receive backup/data
# Komprimiert
zfs send tank/data@snap1 | gzip | ssh remote "gunzip | zfs receive backup/data"Automatische Replikation
#!/bin/bash
# /usr/local/bin/zfs-replicate.sh
DATASET="tank/data"
REMOTE="backup-server"
REMOTE_POOL="backup"
# Neuen Snapshot
SNAP=$(date +%Y-%m-%d_%H-%M)
zfs snapshot ${DATASET}@${SNAP}
# Letzten replizierten Snapshot finden
LAST=$(ssh ${REMOTE} "zfs list -H -o name -t snapshot ${REMOTE_POOL}/data" | tail -1 | cut -d@ -f2)
if [ -z "$LAST" ]; then
# Initial
zfs send ${DATASET}@${SNAP} | ssh ${REMOTE} zfs receive ${REMOTE_POOL}/data
else
# Inkrementell
zfs send -i ${DATASET}@${LAST} ${DATASET}@${SNAP} | ssh ${REMOTE} zfs receive ${REMOTE_POOL}/data
fiScrub und Wartung
Scrub
# Scrub starten (Datenintegrität prüfen)
zpool scrub tank
# Status
zpool status tank
# Scrub stoppen
zpool scrub -s tankAutomatischer Scrub
# /etc/cron.d/zfs-scrub
0 2 * * 0 root /sbin/zpool scrub tankDisk ersetzen
# Defekte Disk ersetzen
zpool replace tank /dev/sdb /dev/sdf
# Status überwachen
zpool status tankZVOLs (Block Devices)
ZVOL erstellen
# 100GB Block Device
zfs create -V 100G tank/vm-disk
# Mit Thin Provisioning
zfs create -s -V 100G tank/vm-disk
# Verwendung
ls -la /dev/zvol/tank/vm-diskFür VMs
# KVM/QEMU
zfs create -V 50G -o volblocksize=64K tank/vms/vm1-disk
# In VM-Config
# <disk type='block' device='disk'>
# <source dev='/dev/zvol/tank/vms/vm1-disk'/>
# </disk>Performance-Tuning
ARC (Adaptive Replacement Cache)
# ARC-Größe begrenzen
echo "options zfs zfs_arc_max=8589934592" > /etc/modprobe.d/zfs.conf
# Sofort anpassen
echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_maxL2ARC (SSD Cache)
# Cache-Device hinzufügen
zpool add tank cache /dev/nvme0n1p1SLOG (Separate Log)
# Log-Device für sync writes
zpool add tank log mirror /dev/nvme0n1p2 /dev/nvme1n1p2Monitoring
Speichernutzung
# Pool-Nutzung
zpool list -o name,size,alloc,free,cap,health
# Dataset-Nutzung
zfs list -o name,used,avail,refer,mountpointEreignisse
# ZFS-Events
zpool events
zpool events -vPrometheus
# zfs_exporter
docker run -d -p 9134:9134 \
-v /dev/zfs:/dev/zfs \
--privileged \
pdf/zfs_exporterZusammenfassung
| Befehl | Funktion | |--------|----------| | zpool create | Pool erstellen | | zpool status | Pool-Status | | zfs create | Dataset erstellen | | zfs snapshot | Snapshot erstellen | | zfs rollback | Zum Snapshot zurück | | zfs send/receive | Replikation | | zpool scrub | Datenintegrität prüfen |
| RAID-Level | Parity | Min. Disks | |------------|--------|------------| | Mirror | 1 | 2 | | RAID-Z1 | 1 | 3 | | RAID-Z2 | 2 | 4 | | RAID-Z3 | 3 | 5 |
| Datei/Pfad | Funktion | |------------|----------| | /etc/modprobe.d/zfs.conf | Modul-Parameter | | .zfs/snapshot/ | Snapshot-Zugriff | | /dev/zvol/ | Block Devices |
Fazit
ZFS ist die erste Wahl für Datenspeicherung mit hohen Anforderungen an Integrität und Flexibilität. Copy-on-Write und Checksums schützen vor Datenkorruption. Snapshots ermöglichen schnelle Backups ohne Ausfallzeit. RAID-Z bietet Redundanz ohne Hardware-Controller. Die Kombination aus Dateisystem und Volume-Manager vereinfacht die Administration erheblich.