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>

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_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.