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)
└── Snapshot
Vorteile
| 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-linux
CentOS/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 zfs
Modul laden
modprobe zfs
lsmod | grep zfs
Pool erstellen
Einfacher Pool
# Einzelne Disk
zpool create tank /dev/sdb
# Ohne Partition
zpool create -f tank /dev/sdb
Mirror (RAID 1)
zpool create tank mirror /dev/sdb /dev/sdc
RAID-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/sdf
Striped Mirror (RAID 10)
zpool create tank \
mirror /dev/sdb /dev/sdc \
mirror /dev/sdd /dev/sde
Mit Cache und Log
zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd \
cache /dev/nvme0n1p1 \
log mirror /dev/nvme0n1p2 /dev/nvme1n1p2
Pool-Verwaltung
Status anzeigen
# Pools auflisten
zpool list
# Pool-Status
zpool status
zpool status -v tank
# I/O-Statistiken
zpool iostat
zpool iostat -v tank 1
Pool 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/sdf
Pool exportieren/importieren
# Export
zpool export tank
# Import
zpool import tank
# Alle verfügbaren Pools
zpool import
Datasets
Dataset erstellen
# Filesystem
zfs create tank/data
zfs create tank/data/documents
# Mit Mountpoint
zfs create -o mountpoint=/srv/data tank/data
Dataset-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 compression
Wichtige 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/vms
Snapshots
Snapshot erstellen
# Einfacher Snapshot
zfs snapshot tank/data@backup-2026-01-26
# Rekursiv (alle Datasets)
zfs snapshot -r tank@weekly
Snapshots 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,snap3
Rollback
# 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-26
Daten 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/backup
Remote-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
fi
Scrub und Wartung
Scrub
# Scrub starten (Datenintegrität prüfen)
zpool scrub tank
# Status
zpool status tank
# Scrub stoppen
zpool scrub -s tank
Automatischer Scrub
# /etc/cron.d/zfs-scrub
0 2 * * 0 root /sbin/zpool scrub tank
Disk ersetzen
# Defekte Disk ersetzen
zpool replace tank /dev/sdb /dev/sdf
# Status überwachen
zpool status tank
ZVOLs (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-disk
Fü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>
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_max
L2ARC (SSD Cache)
# Cache-Device hinzufügen
zpool add tank cache /dev/nvme0n1p1
SLOG (Separate Log)
# Log-Device für sync writes
zpool add tank log mirror /dev/nvme0n1p2 /dev/nvme1n1p2
Monitoring
Speichernutzung
# Pool-Nutzung
zpool list -o name,size,alloc,free,cap,health
# Dataset-Nutzung
zfs list -o name,used,avail,refer,mountpoint
Ereignisse
# ZFS-Events
zpool events
zpool events -v
Prometheus
# zfs_exporter
docker run -d -p 9134:9134 \
-v /dev/zfs:/dev/zfs \
--privileged \
pdf/zfs_exporter
Zusammenfassung
| 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.