Seit mittlerweile über einem Jahr mit Erscheinen der Release Candidates von TrueNAS 25.10 funktioniert das Versetzen von Festplatten in den Standby nicht mehr. Die Versionen bis 25.04 hatten dieses Problem nicht. Im TrueNAS-Forum findet sich ein langer Thread über dieses Problem und einige Posts waren bei der Lösung des Problems eine große Hilfe. Allerdings sind die vorgeschlagenen Lösungen für mich nicht ganz zufriedenstellend, erwartet man von einer Appliance doch einen möglichst geringen Aufwand bei Betrieb und Wartung.
Die Patchlösung lässt sich spezifisch anwenden und geht bei der Problemlösung gezielt und sauber vor. Bei meinen Tests zeigte sich aber, dass einige der Angriffspunkte zumindest bei Consumer-Platten nicht notwendig sind.
Das Entladen eines Kernelmoduls mitsammt der Deaktivierung des Auslesens aller SMART-Werte kommt ebenfalls nicht in Frage. Jedoch enthält diese Variante einen Hinweis auf eine upgradetaugliche Dauerlösung, indem Post-Init-Skripte vorgeschlagen werden.
In beiden Varianten wird jedoch komplett vernachlässigt, dass der inzwischen standardmäßig aktive Systemd-Service smartmontools.service ebenfalls den Standby der Festplatten verhindert, da regelmäßig der Plattenzustand ausgelesen wird. Meinen Analysen nach handelt es sich um folgende Zugriffe. Der Schlüssel-Sync, welcher alle 24 Stunden durchgeführt wird, führte bei meinen unverschlüsselten ZFS-Pools nicht zum Aufwecken der Platten.
- Polling der Temperatur alle 5 Minuten bei bestimmten Festplattentypen
- smartctl-Call ohne "-n standby" alle 90 Minuten
- Systemd-Service smartmontools.service Polling alle 30 Minuten
Die konkrete Konfiguration sieht z.B. vor, dass die Festplatten nach 30 Minuten in den Standby gehen sollen. Dies wird bei den jeweiligen Disks konfiguriert. Das Advanced Power Management kann deaktiviert bleiben.
Nun ist dafür zu sorgen, dass smartmontools.service in einem größeren Intervall (z.B. 90 Minuten) die Platten scannt. Das kann in den Parametern des Services auf /etc persistent erfolgen. Ob dies nach einem Update zu wiederholen ist, muss sich zeigen.
smartd_cfg_env=/etc/default/smartmontools smartd_opts='smartd_opts="--interval=5400"' if ! grep -Fqx -- "$smartd_opts" "$smartd_cfg_env"; then print -r -- "$smartd_opts" >> "$smartd_cfg_env"; fi
Es muss ebenfalls dafür gesorgt werden, dass, wie bei den vorigen Versionen, der Standby-Parameter bei den Middleware-Calls von smartctl der Standby-Parameter mitverwendet wird. Dies lässt sich mit einem Wrapper lösen, welcher mittels Post-Init-Skript beim Systemstart erzeugt wird.
midclt call initshutdownscript.create '{"type":"COMMAND","when":"POSTINIT","comment":"Wrap smartctl with standby parameter","command":"mkdir -p /run/hdd_standby && mount -t tmpfs -o size=16m,mode=755,exec tmpfs /run/hdd_standby && cp /usr/sbin/smartctl /run/hdd_standby/smartctl.real && printf \"%s\\n\" \"#!/bin/sh\" \"exec /run/hdd_standby/smartctl.real -n standby \\\"\\$@\\\"\" > /run/hdd_standby/smartctl && chmod 755 /run/hdd_standby/smartctl && mount --bind /run/hdd_standby/smartctl /usr/sbin/smartctl"}'
Zuletzt gibt es noch das Problem, dass das Temperaturpolling alle fünf Minuten manche Platten am Standby hindert. Dies lässt sich einfach verhindern, wenn man die Zugriffsrechte auf den Temperaturwert entzieht. Im Idealfall passt man dies lediglich an die Festplattenmodelle an, welche davon betroffen sind. Im Folgenden das Festplattenmodell ST4000DM000. Mehrere Modelle können leerzeichengetrennt angegeben werden.
midclt call initshutdownscript.create '{"type":"COMMAND","when":"POSTINIT","comment":"Block drivetemp on unsupported disks","command":"MODELS=\"ST4000DM000\"; for model in /sys/block/sd*/device/model; do [ -f \"$model\" ] || continue; read -r name < \"$model\"; for unsupported in $MODELS; do case \"$name\" in \"$unsupported\"*) chmod 000 \"${model%/device/model}\"/device/hwmon/hwmon*/temp1_input 2>/dev/null; break ;; esac; done; done"}'
Benötigt man die Temperaturen generell nicht, kann man das Modul beim Systemstart auch komplett entladen.
midclt call initshutdownscript.create '{"type":"COMMAND","when":"POSTINIT","comment":"Unload drivetemp hwmon driver","command":"modprobe -r drivetemp"}'