TL;DR — Kurzzusammenfassung

ZFS-Snapshots bieten sofortigen Datenschutz. Lernen Sie Pools, Datasets, Rollback, Send/Receive-Replikation und sanoid-Automatisierung für Linux-Produktion.

ZFS-Snapshots bieten nahezu sofortigen, platzsparenden Datenschutz, den kein traditionelles Backup-Tool auf Dateisystemebene erreichen kann. Dieser Leitfaden deckt alles von den ZFS-Grundlagen bis zu automatisierten Aufbewahrungsrichtlinien mit sanoid ab.

Voraussetzungen

  • Linux-Server mit Ubuntu 22.04/24.04, Debian 12 oder RHEL 9/Fedora
  • Ein oder mehrere Blockgeräte
  • Root- oder sudo-Zugriff
  • Grundlegende Kenntnisse der Linux-Befehlszeile

ZFS-Grundlagen

Copy-on-Write (CoW): ZFS überschreibt niemals vorhandene Daten. Wenn sich ein Block ändert, schreibt ZFS die neue Version an einen neuen Speicherort und aktualisiert den Zeiger. Der alte Block bleibt bis zur Transaktionsbestätigung erhalten. So sind Snapshots sofort verfügbar.

Pools, vdevs und Datasets:

  • Ein Pool (zpool) ist der übergeordnete Speichercontainer.
  • Ein vdev definiert die Redundanz: Einzeldisk, mirror, raidz, raidz2 oder raidz3.
  • Ein Dataset ist ein montierbares Dateisystem innerhalb des Pools.

Prüfsummen und Selbstheilung: Jeder Block speichert eine Prüfsumme. Beim Lesen überprüft ZFS diese und repariert bei Redundanz automatisch korrupte Blöcke.


ZFS-Pools erstellen

# Ubuntu / Debian
sudo apt install zfsutils-linux -y

# Mirror (RAID-1-Äquivalent)
sudo zpool create tank mirror /dev/sdb /dev/sdc

# RAIDZ2 (RAID-6-Äquivalent) — empfohlen für Produktion
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Status prüfen
zpool status tank

Dataset-Verwaltung

# Dataset mit eigenem Einhängepunkt erstellen
zfs create -o mountpoint=/srv/web tank/web

# LZ4-Kompression (fast immer vorteilhaft)
zfs set compression=lz4 tank/data

# Quota — festes Limit für die Dataset-Größe
zfs set quota=500G tank/data

# Recordsize für Datenbanken anpassen
zfs set recordsize=16K tank/databases

# Eigenschaften auflisten
zfs get compression,quota,recordsize tank/data

Snapshots: Erstellung und Verwaltung

# Snapshot eines Datasets (Konvention: @JJJJ-MM-TT)
zfs snapshot tank/data@2026-03-23

# Rekursiver Snapshot — erfasst Dataset und alle Kinder gleichzeitig
zfs snapshot -r tank@2026-03-23T03:00

# Snapshot mit beschreibendem Label
zfs snapshot tank/data@vor-nginx-update
# Alle Snapshots auflisten
zfs list -t snapshot

# Vom Snapshot genutzten Speicher anzeigen
zfs list -t snapshot -o name,used,referenced,written tank/data

Rollback

# Rollback zum neuesten Snapshot
zfs rollback tank/data@2026-03-23

# Rollback über Zwischen-Snapshots (zerstört alles dazwischen)
zfs rollback -r tank/data@vor-nginx-update

Warnung: zfs rollback -r zerstört ALLE Zwischen-Snapshots zwischen dem Ziel und dem aktuellen Zustand. Erstellen Sie vorher einen Klon des aktuellen Zustands, falls Sie diese Daten benötigen könnten.


Klone: Sichere Alternative zum Rollback

# Klon aus einem Snapshot erstellen
zfs clone tank/data@2026-03-23 tank/data-klon

# Wenn der Klon zum primären werden soll, ihn befördern
zfs promote tank/data-klon

Send und Receive: Replikation

# Vollständiger erster Send zum Remote-Server
zfs send tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data

# Inkrementeller Send (-i: Delta zwischen zwei Snapshots)
zfs send -i tank/data@2026-03-22 tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data

# Komprimierter Send (-c: überträgt bereits komprimierte Blöcke)
zfs send -c -i tank/data@snap1 tank/data@snap2 | ssh user@remote zfs receive backup/data

# Verschlüsselter Raw-Send (für nativ verschlüsselte Datasets)
zfs send -w tank/data@snap1 | ssh user@remote zfs receive backup/data

Native Verschlüsselung

# Verschlüsseltes Dataset erstellen
zfs create -o encryption=aes-256-gcm -o keylocation=prompt -o keyformat=passphrase tank/secrets

Automatisierte Snapshots mit sanoid

# Ubuntu / Debian
sudo apt install sanoid -y

/etc/sanoid/sanoid.conf bearbeiten:

[tank/data]
  use_template = produktion

[tank/databases]
  use_template = produktion
  recursive = yes

[template_produktion]
  hourly = 24
  daily = 30
  weekly = 8
  monthly = 12
  autosnap = yes
  autoprune = yes
# Probelauf
sudo sanoid --cron --verbose --dryrun

# systemd-Timer aktivieren
sudo systemctl enable --now sanoid.timer

Syncoid für Replikation

# tank/data zum Remote-Server replizieren
sudo syncoid tank/data user@backup-server:backup/data

# Rekursive Replikation
sudo syncoid -r tank user@backup-server:backup

Scrub-Planung

# Manueller Scrub
sudo zpool scrub tank

# Monatlichen Scrub via systemd planen
sudo systemctl enable --now zfs-scrub-monthly@tank.timer

# Oder via Cron
0 2 1 * * zpool scrub tank

ZFS vs. Alternative Snapshot-Technologien

MerkmalZFSBtrfsLVM Snapshotsext4+LVMXFS
Sofortige SnapshotsJaJaJaJa (via LVM)Kein nativ
Rekursive SnapshotsJa (-r)Nur SubvolumesNeinNeinNein
Send/Receive-ReplikationJa (nativ)Ja (btrfs send)NeinNeinNein
Selbstheilende PrüfsummenJaJaNeinNeinNein
Native VerschlüsselungJa (ZoL 0.8+)NeinVia dm-cryptVia dm-cryptVia dm-crypt
Integriertes RAIDJa (raidz)Ja (raid1/5/6)NeinNeinNein
DeduplizierungJa (viel RAM)Ja (begrenzt)NeinNeinNein

Produktions-Backup-Strategie mit sanoid + syncoid

Ebene 1 — Lokale Snapshots (sanoid): Stündlich für 24 Stunden, täglich für 30 Tage, wöchentlich für 8 Wochen.

Ebene 2 — Replikation zum Backup-Server (syncoid): Tägliche Synchronisation zu einem Backup-Server im selben Netzwerk. Schnelle Wiederherstellung bei Hardware-Ausfall.

Ebene 3 — Offsite-Replikation (syncoid via SSH): Wöchentlicher verschlüsselter Send zu einem Cloud-Server. Schutz vor Katastrophen auf Standortebene.


Besondere Fälle und häufige Fehler

RAM-Anforderung für Deduplizierung: ZFS-Dedup benötigt ~5 GB RAM pro TB deduplizierter Daten. Ohne ausreichend RAM entsteht intensives Swapping. Verwenden Sie Dedup nur für Repositories mit hoher Redundanz.

Snapshot-Anhäufung: Vergessene Snapshots halten Blöcke zurück, die ZFS nicht freigeben kann. Ein Pool, der “voll” erscheint aber wenig referenzierte Daten hat, hat meist Snapshots mit hohem used. Verwenden Sie immer sanoid oder explizites zfs destroy.

ARC-Größe: ZFS verwendet einen adaptiven Cache (ARC), der fast den gesamten RAM verbrauchen kann. Begrenzen in /etc/modprobe.d/zfs.conf: options zfs zfs_arc_max=4294967296 (4 GB).


Zusammenfassung

  • ZFS Copy-on-Write macht Snapshots sofort und kostenlos bis Daten divergieren.
  • Verwenden Sie raidz2 für Produktions-Pools; mirror für zwei Disks.
  • Passen Sie recordsize und compression=lz4 pro Dataset an die Workload an.
  • zfs snapshot -r für atomare rekursive Snapshots; bevorzugen Sie Klone für sicheres Testen.
  • zfs send | zfs receive über SSH bietet native, verschlüsselte, inkrementelle Replikation.
  • sanoid + syncoid ist der Produktionsstandard für automatisierte Aufbewahrung und Replikation.

Verwandte Artikel