Für Massenspeicher — VOD-Bibliotheken, Catch-up-Puffer, Backup-Ziele — ist ZFS RAID-Z2 die ideale Lösung: Es übersteht zwei gleichzeitige Festplattenausfälle, bietet hervorragende Datenintegrität durch Prüfsummen und skaliert auf Petabytes. Diese Anleitung richtet einen RAID-Z2 Pool auf Ubuntu für einen Speicherserver ein.

Voraussetzungen

  • Ubuntu 22.04 mit Root-Zugriff
  • Mehrere identische Laufwerke (mindestens 4 für RAID-Z2; 6-12 ist typisch)
  • Mindestens 8 GB RAM (ZFS mag RAM — 1 GB pro TB ist ein grober Richtwert für dedup, deutlich weniger ohne)

Schritt 1 — ZFS installieren

apt update
apt install -y zfsutils-linux
modprobe zfs
zfs version

Schritt 2 — Ihre Laufwerke identifizieren

Verwenden Sie niemals `/dev/sdX`-Namen für ZFS — diese können sich beim Neustart ändern. Verwenden Sie /dev/disk/by-id/, die stabil sind:

ls -l /dev/disk/by-id/ | grep -v part

Sie sehen Einträge wie ata-WDC_WD180EDGZ_XXXXXXX oder nvme-Samsung_SSD_.... Notieren Sie sich die für Ihre Datenlaufwerke (nicht das OS-Laufwerk).

Schritt 3 — Den RAID-Z2 Pool erstellen

RAID-Z2 verwendet die Kapazität von 2 Laufwerken für Parität und übersteht 2 beliebige Ausfälle. Mit 8× 18 TB Laufwerken erhalten Sie ~108 TB nutzbar (6 × 18 TB):

zpool create -f -o ashift=12 tank raidz2 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE1 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE2 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE3 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE4 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE5 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE6 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE7 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE8

ashift=12 erzwingt eine 4K-Sektorausrichtung — korrekt für alle modernen Laufwerke, und ein späterer Fehler bedeutet den Neuaufbau des Pools. Überprüfen Sie den Pool:

zpool status tank
zpool list

Schritt 4 — Optimierung für eine Medien-/Speicher-Workload

Legen Sie eine größere Record-Größe für große sequentielle Dateien (Video) fest, aktivieren Sie die Komprimierung (nahezu kostenlos, hilft auch bei Video-Metadaten) und deaktivieren Sie atime (sinnlose Schreibverstärkung):

zfs set recordsize=1M tank
zfs set compression=lz4 tank
zfs set atime=off tank
zfs set xattr=sa tank

recordsize=1M ist ideal für das Streaming großer Dateien. Wenn dieser Pool auch eine Datenbank oder viele kleine Dateien enthalten soll, erstellen Sie dafür ein separates Dataset mit recordsize=16k.

Schritt 5 — Datasets erstellen

Datasets sind wie Ordner mit eigenen Eigenschaften. Organisieren Sie nach Workload:

zfs create tank/vod
zfs create tank/catchup
zfs create tank/backups

# Backups komprimieren besser mit gzip
zfs set compression=gzip-6 tank/backups

Sie werden automatisch unter /tank/vod, /tank/catchup usw. gemountet.

Schritt 6 — Einen NVMe-Cache (L2ARC) für Hot Reads hinzufügen

Wenn Ihre Workload heiße Inhalte (Top-Kanäle im Catch-up, beliebte VODs) enthält, reduziert ein NVMe-Lese-Cache die HDD-Last drastisch. Fügen Sie eine freie NVMe als L2ARC hinzu:

zpool add tank cache /dev/disk/by-id/nvme-Samsung_SSD_980_CACHE
zpool status tank

Dimensionieren Sie L2ARC auf ~5-10% der Poolgröße. Für schreibintensive Workloads hilft ein separates SLOG-Gerät (Spiegelung von zwei kleinen schnellen SSDs) bei synchronen Schreibvorgängen, aber reines Media Serving benötigt dies selten.

Schritt 7 — Automatische Scrubs einrichten

Scrubs lesen jeden Block und überprüfen Prüfsummen, um stille Korruption zu erkennen, bevor sie sich ausbreitet. Monatlich planen:

# ZFS auf Ubuntu liefert einen systemd-Timer mit — aktivieren Sie ihn
systemctl enable zfs-scrub-monthly@tank.timer
systemctl start zfs-scrub-monthly@tank.timer

# Führen Sie jetzt einen aus, um eine Basislinie zu erstellen
zpool scrub tank
zpool status tank   # Fortschritt beobachten

Schritt 8 — Laufwerkszustand überwachen

Richten Sie E-Mail-Benachrichtigungen für Pool-Degradation ein. Bearbeiten Sie /etc/zfs/zed.d/zed.rc:

ZED_EMAIL_ADDR="you@yourdomain.com"
ZED_NOTIFY_INTERVAL_SECS=3600
ZED_NOTIFY_VERBOSE=1
systemctl restart zfs-zed

Wenn nun ein Laufwerk ausfällt, sendet ZED Ihnen sofort eine E-Mail. Mit RAID-Z2 haben Sie einen Puffer für 2 Ausfälle, aber Sie sollten das erste ausgefallene Laufwerk ersetzen, bevor ein zweites ausfällt.

Schritt 9 — Ein ausgefallenes Laufwerk ersetzen

Wenn ein Laufwerk ausfällt, zeigt zpool status es als DEGRADED an. Ersetzen Sie es:

# Das defekte Laufwerk offline nehmen
zpool offline tank ata-WDC_WD180EDGZ_DEADDRIVE

# Die Festplatte physisch austauschen, dann im Pool ersetzen
zpool replace tank ata-WDC_WD180EDGZ_DEADDRIVE /dev/disk/by-id/ata-WDC_WD180EDGZ_NEWDRIVE

# Resilver-Fortschritt beobachten
zpool status tank

Das Resilver auf einem 18 TB Laufwerk dauert 24-48 Stunden. Der Pool bleibt währenddessen online und lesbar — RAID-Z2 bedeutet, dass Sie sogar ein weiteres Laufwerk während des Resilvers verlieren und überleben können.

Referenz zur Kapazitätsplanung

KonfigurationRohNutzbar (RAID-Z2)Übersteht
6× 18 TB108 TB72 TB2 Ausfälle
8× 18 TB144 TB108 TB2 Ausfälle
12× 18 TB216 TB180 TB2 Ausfälle

Bei mehr als 12 Laufwerken in einem einzelnen vdev sollten Sie in mehrere vdevs aufteilen oder RAID-Z3 verwenden — Resilver-Fenster bei sehr breiten vdevs werden zu einem eigenen Risiko. Sehen Sie sich unseren vollständigen Leitfaden zur Speicherdimensionierung an.

Wie geht es weiter?

Kombinieren Sie dies mit einem NVMe Hot Tier für aktive Daten, oder dimensionieren Sie einen dedizierten Speicherserver mit uns. Für die vollständige Speicherberechnung — Catch-up-Wachstum, Lesebudgets, Cache-Hit-Raten — lesen Sie unseren Beitrag zur Speicherdimensionierung.