Das Setup

HP MicroServer Gen8, 4x WD Red 4TB im ZFS RAIDZ2-Pool tank. Dazu ein SSD-Mirror als Special VDEV (Metadaten) und zwei SSDs als L2ARC (Read-Cache). Proxmox VE als Hypervisor, Plex in einem LXC-Container, PBS lokal für Backups.

tank
  raidz2-0          (4x WD Red 4TB — die sollen schlafen)
  special mirror-1  (2x Samsung SSD — Metadaten + kleine Dateien)
  cache             (2x Samsung SSD — L2ARC)

Ziel: Die vier HDDs sollen nach 5 Minuten Inaktivität in den Standby gehen und dort bleiben, bis jemand tatsächlich einen Film abspielt oder ein Backup läuft.

Warum ein Special VDEV der Schlüssel ist

ZFS lagert mit einem Special VDEV automatisch alle Metadaten auf die SSDs aus — Verzeichnisbäume, Dateinamen, Berechtigungen, Dateigrößen. Zusätzlich landen Dateien unter special_small_blocks (hier: 512K) ebenfalls dort.

Das heißt: Wenn du mit Kodi durch /tank/Filme/ browsst, liest ZFS den Verzeichnisbaum von den SSDs. Die HDDs schlafen weiter. Erst wenn du einen Film abspielst, müssen die Spindeln anlaufen.

# Prüfen ob special_small_blocks gesetzt ist
zfs get special_small_blocks tank

Ohne Special VDEV liegen Metadaten auf den HDDs, und jedes ls weckt alle Platten auf. Mit Special VDEV ist Browsen kostenlos.

hdparm -S: Spindown konfigurieren

hdparm -S 60 /dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-XXXXXXXXXXXXX

-S 60 bedeutet 60 × 5 Sekunden = 5 Minuten bis zum Standby. Nicht 60 Sekunden — die hdparm-Zeiteinheiten sind gewöhnungsbedürftig.

Erste Falle: /dev/sd* ist nicht stabil

Device-Buchstaben können sich nach jedem Reboot verschieben. Was heute /dev/sda ist, kann morgen /dev/sdf sein. Wenn dein Crontab hdparm -S 60 /dev/sdb sagt und nach einem Reboot /dev/sdb plötzlich eine SSD ist, hast du wirkungslose Spindown-Regeln auf Geräten ohne Spindeln.

Immer /dev/disk/by-id/ verwenden:

# Stabile Pfade finden
ls -l /dev/disk/by-id/ | grep -v wwn | grep ata-WDC

# Crontab mit by-id Pfaden
@reboot hdparm -S 60 /dev/disk/by-id/ata-WDC_WD40EFRX-..._WD-SERIAL1
@reboot hdparm -S 60 /dev/disk/by-id/ata-WDC_WD40EFRX-..._WD-SERIAL2
# usw.

Zweite Falle: hdparm -C weckt WD Red auf

Das war der eigentliche Showstopper. hdparm -C soll den Drive-State lesen — active/idle oder standby. Klingt harmlos. Auf bestimmten WD Red Firmware-Versionen weckt der Befehl die Platte aber auf.

In meinem Fall lief ein selbstgeschriebenes Monitor-Script als systemd-Service, das alle 10 Sekunden hdparm -C auf allen vier Drives ausführte. Gedacht als Überwachung, wann die Platten schlafen. In Wirklichkeit hat es sie permanent wachgehalten — ein endloser Aufweck-Loop.

# /var/log/drive-wakeups.log — alle 10 Sekunden
2026-06-02 05:13:39 - /dev/sdh woke up
2026-06-02 05:13:49 - /dev/sdh woke up
2026-06-02 05:13:59 - /dev/sdh woke up

Das Script hat seinen eigenen Wakeup als “unerwartetes Aufwachen” geloggt. Perfekte Ironie.

Lösung: Monitor-Script deaktiviert, Standby-Monitoring über Zabbix mit 5-Minuten-Intervall. Ein Wakeup alle 5 Minuten ist akzeptabel — alle 10 Sekunden ist destruktiv.

Die versteckten Weckquellen

Nachdem hdparm fixiert war, schliefen die Platten — aber nicht durchgängig. Ein Blick auf die Zabbix-Daten zeigte nachts stundenlange Wachphasen. Die Ursachen:

Plex Media Server

Plex scannt per Default stündlich die Bibliothek und führt nachts Deep Media Analysis durch. Beides liest Dateiinhalte von den HDDs.

<!-- In Preferences.xml -->
ScheduledLibraryUpdatesEnabled="0"
ButlerStartHour="1"
ButlerEndHour="4"
ButlerTaskDeepMediaAnalysis="0"

Automatischen Scan deaktivieren, Butler in ein Zeitfenster legen, manuellen Scan per Cron:

# Plex Container Crontab
45 1 * * * curl -s http://localhost:32400/library/sections/1/refresh \
  -H "X-Plex-Token: <token>" && \
  curl -s http://localhost:32400/library/sections/2/refresh \
  -H "X-Plex-Token: <token>"

PBS Prune (stündlich!)

Der PBS-Prune-Job auf dem Backup-Datastore war auf stündlich konfiguriert — und der Datastore liegt auf den HDDs. Jede Stunde Spinup für ein paar Sekunden Prune-Arbeit. Auf täglich geändert.

Backup-Chaos: Fünf Jobs über die Nacht verteilt

Verschiedene Backups liefen zu verschiedenen Zeiten:

  • 00:01 — Remote vzdump Push vom Haupthost
  • 01:30 — Nextcloud PBS-Backup (1,5 Stunden!)
  • 03:00 — Lokales vzdump
  • 03:15 — PBS Sync Pull

Jeder Job weckt die Platten auf, und bevor sie nach 5 Minuten einschlafen können, kommt der nächste. Ergebnis: HDDs die ganze Nacht aktiv.

Das perfekte Backup-Fenster

Alles in ein Zeitfenster konsolidiert:

01:00 ├─ Lokales vzdump (3 min)
01:00 ├─ Remote Push ───────────────────┤ ~01:39
01:15 ├─ PBS Sync Pull
01:45 ├─ Nextcloud-Backup ──────────────────────────────────┤ ~03:15
01:45 ├─ Plex Scan
01:00 ──────────────── Plex Butler ─────────────────────┤ 04:00

Platten wach von 01:00 bis ~03:15, danach Standby bis zum nächsten Abend.

Monitoring mit Zabbix

UserParameter für den Drive-State:

# /etc/zabbix/zabbix_agent2.d/hdd-standby.conf
UserParameter=hdd.standby[*],sudo /usr/sbin/hdparm -C /dev/disk/by-id/$1 \
  2>/dev/null | grep -q standby && echo 1 || echo 0
UserParameter=hdd.standby.count,for d in ata-WDC_WD40EFRX-...; do \
  sudo /usr/sbin/hdparm -C /dev/disk/by-id/$d 2>/dev/null | \
  grep -q standby && echo 1 || echo 0; done | awk '{s+=$1} END {print s}'

hdparm braucht root — der Zabbix-Agent läuft als zabbix:

# /etc/sudoers.d/zabbix-hdparm
zabbix ALL=(root) NOPASSWD: /usr/sbin/hdparm -C /dev/disk/by-id/*

Trigger wenn in 6 Stunden keine Platte geschlafen hat — dann stimmt was nicht.

Ergebnis

Vorher: HDDs 24/7 aktiv, unnötiger Stromverbrauch rund um die Uhr. Nachher: HDDs schlafen ~21 Stunden pro Tag. Aufwachzeit bei Film-Start: wenige Sekunden.

Die Kombination aus ZFS Special VDEV (Metadaten auf SSDs), konsolidiertem Backup-Fenster und korrektem Monitoring macht den Unterschied. Der größte Zeitfresser war die Diagnose — nicht die eigentliche Konfiguration.

Checkliste: HDD Standby auf ZFS

  • Special VDEV für Metadaten eingerichtet
  • special_small_blocks gesetzt (512K empfohlen)
  • hdparm -S mit /dev/disk/by-id/ Pfaden
  • SMART-Daemon: -n standby gesetzt (weckt schlafende Platten nicht)
  • Plex: Automatischer Scan deaktiviert, Butler-Fenster gesetzt
  • PBS Prune: Nicht stündlich (täglich reicht)
  • Alle Backups in ein Zeitfenster konsolidiert
  • Kein hochfrequentes hdparm -C Polling
  • Zabbix-Monitoring für Drive-State eingerichtet