ZFS-Konfigurationsleitfaden für optimale Performance
ZFS (Zettabyte File System) ist ein revolutionäres Dateisystem, das die Rollen eines traditionellen Dateisystems und eines Volume-Managers vereint. Dieser Leitfaden behandelt alles, was Sie wissen müssen, um ZFS für optimale Performance in Ihrem Homelab zu konfigurieren.
Why ZFS Hates Hardware RAID
Was macht ZFS besonders?
ZFS bietet einzigartige Features, die es von anderen abheben:
- Datenintegrität: Eingebautes Checksumming erkennt und korrigiert stille Datenkorruption
- Snapshots: Sofortige, speichereffiziente Point-in-Time-Kopien
- RAID-Z: Software-RAID mit besserer Performance als traditionelles Hardware-RAID
- Kompression: Transparente Datenkompression zum Sparen von Speicherplatz
- Deduplizierung: Eliminiert doppelte Datenblöcke
- ARC-Cache: Intelligentes Caching-System für bessere Performance
Systemanforderungen
Mindestanforderungen
- RAM: 8GB (16GB+ empfohlen)
- CPU: Beliebiger 64-Bit-Prozessor
- Laufwerke: Mindestens 2 Laufwerke für Redundanz
Empfohlene Konfiguration
- RAM: 1GB pro TB Speicher (für Deduplizierung: 5GB pro TB)
- CPU: Multi-Core-Prozessor für bessere Performance
- Laufwerke: Enterprise-Grade-Laufwerke mit Power-Loss-Protection
ZFS installieren
Ubuntu/Debian
sudo apt update
sudo apt install zfsutils-linux
Proxmox
ZFS ist standardmäßig enthalten:
zfs version
ZFS-Pools erstellen
Einzelplatte (keine Redundanz)
⚠️ Nicht empfohlen für Produktivdaten
sudo zpool create tank /dev/sdb
Mirror (RAID-1)
Zwei Platten mit vollständiger Redundanz:
sudo zpool create tank mirror /dev/sdb /dev/sdc
RAID-Z1 (ähnlich wie RAID-5)
Mindestens 3 Platten, übersteht 1 Plattenausfall:
sudo zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd
RAID-Z2 (ähnlich wie RAID-6)
Mindestens 4 Platten, übersteht 2 Plattenausfälle:
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
RAID-Z3
Mindestens 5 Platten, übersteht 3 Plattenausfälle:
sudo zpool create tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf
Empfehlungen für ZFS-Pools
Zuhause/Kleinbüro
- 3-4 Laufwerke: RAID-Z1 verwenden
- 5-8 Laufwerke: RAID-Z2 verwenden
- 9+ Laufwerke: RAID-Z3 oder mehrere RAID-Z2-vdevs in Betracht ziehen
Enterprise/kritische Daten
- Immer RAID-Z2 oder RAID-Z3 verwenden
- Hot Spares hinzufügen
- Enterprise-Laufwerke verwenden
ZFS-Performance optimieren
ARC-Cache-Tuning
ARC-Cache-Größe begrenzen (in /etc/modprobe.d/zfs.conf):
# Limit ARC to 8GB
options zfs zfs_arc_max=8589934592
# Minimum ARC size
options zfs zfs_arc_min=4294967296
Änderungen anwenden:
sudo update-initramfs -u
sudo reboot
Kompression aktivieren
LZ4-Kompression ist schnell und spart Speicherplatz:
sudo zfs set compression=lz4 tank
Record-Größe konfigurieren
Für Datenbanken (kleine zufällige I/O):
sudo zfs set recordsize=16K tank/database
Für Mediendateien (große sequenzielle I/O):
sudo zfs set recordsize=1M tank/media
Zugriffszeit-Updates deaktivieren
Verbessert die Performance:
sudo zfs set atime=off tank
ZFS Auto-Trim aktivieren
Für SSDs:
sudo zpool set autotrim=on tank
Mit Datasets arbeiten
Dataset erstellen
sudo zfs create tank/documents
sudo zfs create tank/photos
sudo zfs create tank/videos
Quotas festlegen
sudo zfs set quota=100G tank/documents
Reservierungen festlegen
sudo zfs set reservation=50G tank/database
Datasets auflisten
zfs list
Snapshots
Snapshot erstellen
sudo zfs snapshot tank/documents@backup-2024-01-15
Snapshots auflisten
zfs list -t snapshot
Auf Snapshot zurücksetzen
sudo zfs rollback tank/documents@backup-2024-01-15
Snapshot löschen
sudo zfs destroy tank/documents@backup-2024-01-15
Automatisierte Snapshots
Sanoid für automatisiertes Snapshot-Management installieren:
sudo apt install sanoid
/etc/sanoid/sanoid.conf konfigurieren:
[tank/documents]
use_template = production
recursive = yes
[template_production]
frequently = 0
hourly = 24
daily = 7
monthly = 12
yearly = 0
autosnap = yes
autoprune = yes
Send und Receive (Replikation)
Snapshot in Datei senden
sudo zfs send tank/documents@backup | gzip > backup.gz
Snapshot aus Datei empfangen
gunzip -c backup.gz | sudo zfs receive tank/restore
Inkrementelle Replikation
Initialer vollständiger Send:
sudo zfs send tank/documents@initial | ssh user@backup-server \
sudo zfs receive backup/documents
Nachfolgende inkrementelle Sends:
sudo zfs send -i @initial tank/documents@today | ssh user@backup-server \
sudo zfs receive backup/documents
ZFS überwachen
Pool-Status
sudo zpool status
Pool-I/O-Statistiken
sudo zpool iostat -v 2
ARC-Statistiken
cat /proc/spl/kstat/zfs/arcstats
Oder arc_summary verwenden:
sudo arc_summary
Dataset-Nutzung
zfs list -o name,used,avail,refer,mountpoint
Auf Fehler prüfen
sudo zpool status -v
Wartung
Pool scrubben
Regelmäßige Scrubs verifizieren die Datenintegrität:
sudo zpool scrub tank
Scrub-Fortschritt prüfen:
sudo zpool status
Monatliche Scrubs in crontab planen:
# Run on the first Sunday of each month at 2 AM
0 2 1-7 * * [ "$(date +\%u)" = "7" ] && /sbin/zpool scrub tank
Ausgefallenes Laufwerk ersetzen
sudo zpool replace tank /dev/sdb /dev/sdf
Rebuild überwachen:
watch -n 5 zpool status
Hot Spare hinzufügen
sudo zpool add tank spare /dev/sdg
Fehlerbehebung
Pool lässt sich nicht importieren
Import erzwingen:
sudo zpool import -f tank
Degradierter Pool
Status prüfen:
sudo zpool status -v
Fehler löschen (falls vorübergehend):
sudo zpool clear tank
Speicherplatz voll
Speichernutzung prüfen:
zfs list -o name,used,avail,refer
zfs list -t snapshot
Alte Snapshots löschen:
sudo zfs destroy tank/documents@old-snapshot
Performance-Probleme
ARC-Trefferquote prüfen:
sudo arc_summary | grep "Hit Rate"
Pool-Fragmentierung prüfen:
sudo zpool list -o name,fragmentation
Best Practices
Do's
✅ ECC-RAM für Datenintegrität verwenden ✅ Regelmäßige Scrubs (monatlich) ✅ Kompression aktivieren (lz4) ✅ Häufig Snapshots erstellen ✅ Ihre Backups testen ✅ Pool-Zustand überwachen ✅ Ganze Laufwerke statt Partitionen verwenden
Don'ts
❌ Niemals 80% Pool-Kapazität überschreiten ❌ Kein RAID-Z mit unterschiedlich großen Laufwerken verwenden ❌ Deduplizierung vermeiden, außer Sie haben 5GB RAM pro TB ❌ RAID-Z-vdevs nicht erweitern (nicht unterstützt) ❌ Niemals Consumer-Laufwerke ohne Test verwenden ❌ Scrub-Fehler nicht ignorieren
Erweiterte Features
Verschlüsselung
Verschlüsseltes Dataset erstellen:
sudo zfs create -o encryption=aes-256-gcm \
-o keyformat=passphrase tank/secure
Deduplizierung
⚠️ Erfordert erheblichen RAM
sudo zfs set dedup=on tank/vms
NFS-Freigaben
sudo zfs set sharenfs=on tank/share
sudo zfs set sharenfs="rw=@192.168.1.0/24" tank/share
SMB-Freigaben
sudo zfs set sharesmb=on tank/share
Performance-Benchmarks
Sequenzielles Schreiben testen:
dd if=/dev/zero of=/tank/testfile bs=1M count=10000
Sequenzielles Lesen testen:
dd if=/tank/testfile of=/dev/null bs=1M
fio für umfassendes Testen verwenden:
sudo apt install fio
fio --name=seqwrite --rw=write --bs=1M --size=10G \
--filename=/tank/testfile
Fazit
ZFS bietet Enterprise-Grade-Storage-Features für Ihr Homelab. Mit korrekter Konfiguration und Wartung liefert es außergewöhnliche Datenintegrität und Performance.
Die wichtigsten Erkenntnisse:
- RAID-Z2 für wichtige Daten verwenden
- LZ4-Kompression aktivieren
- Regelmäßige Scrubs planen
- Häufig Snapshots erstellen
- Pool-Zustand überwachen
- Niemals 80% Kapazität überschreiten