TrueNAS SCALE: HDD Standby

Seit mitt­ler­wei­le über einem Jahr mit Erschei­nen der Release Can­di­da­tes von True­NAS 25.10 funk­tio­niert das Ver­set­zen von Fest­plat­ten in den Stand­by nicht mehr. Die Ver­sio­nen bis 25.04 hat­ten die­ses Pro­blem nicht. Im True­NAS-Forum fin­det sich ein lan­ger Thread über die­ses Pro­blem und eini­ge Posts waren bei der Lösung des Pro­blems eine gro­ße Hil­fe. Aller­dings sind die vor­ge­schla­ge­nen Lösun­gen für mich nicht ganz zufrie­den­stel­lend, erwar­tet man von einer Appli­ance doch einen mög­lichst gerin­gen Auf­wand bei Betrieb und Wartung.

Die Patch­lö­sung lässt sich spe­zi­fisch anwen­den und geht bei der Pro­blem­lö­sung gezielt und sau­ber vor. Bei mei­nen Tests zeig­te sich aber, dass eini­ge der Angriffs­punk­te zumin­dest bei Con­su­mer-Plat­ten nicht not­wen­dig sind.
Das Ent­la­den eines Ker­nel­mo­duls mit­sammt der Deak­ti­vie­rung des Aus­le­sens aller SMART-Wer­te kommt eben­falls nicht in Fra­ge. Jedoch ent­hält die­se Vari­an­te einen Hin­weis auf eine upgrade­taug­li­che Dau­er­lö­sung, indem Post-Init-Skrip­te vor­ge­schla­gen werden.

In bei­den Vari­an­ten wird jedoch kom­plett ver­nach­läs­sigt, dass der inzwi­schen stan­dard­mä­ßig akti­ve Sys­temd-Ser­vice smartmontools.service eben­falls den Stand­by der Fest­plat­ten ver­hin­dert, da regel­mä­ßig der Plat­ten­zu­stand aus­ge­le­sen wird. Mei­nen Ana­ly­sen nach han­delt es sich um fol­gen­de Zugrif­fe. Der Schlüs­sel-Sync, wel­cher alle 24 Stun­den durch­ge­führt wird, führ­te bei mei­nen unver­schlüs­sel­ten ZFS-Pools nicht zum Auf­we­cken der Platten.

  • Pol­ling der Tem­pe­ra­tur alle 5 Minu­ten bei bestimm­ten Festplattentypen
  • smartctl-Call ohne "-n stand­by" alle 90 Minuten
  • Sys­temd-Ser­vice smartmontools.service Pol­ling alle 30 Minuten

Die kon­kre­te Kon­fi­gu­ra­ti­on sieht z.B. vor, dass die Fest­plat­ten nach 30 Minu­ten in den Stand­by gehen sol­len. Dies wird bei den jewei­li­gen Disks kon­fi­gu­riert. Das Advanced Power Management kann deak­ti­viert blei­ben.
Nun ist dafür zu sor­gen, dass smartmontools.service in einem grö­ße­ren Inter­vall (z.B. 90 Minu­ten) die Plat­ten scannt. Das kann in den Para­me­tern des Ser­vices auf /etc per­sis­tent erfol­gen. Ob dies nach einem Update zu wie­der­ho­len 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 eben­falls dafür gesorgt wer­den, dass, wie bei den vori­gen Ver­sio­nen, der Stand­by-Para­me­ter bei den Midd­le­wa­re-Calls von smartctl der Stand­by-Para­me­ter mit­ver­wen­det wird. Dies lässt sich mit einem Wrap­per lösen, wel­cher mit­tels Post-Init-Skript beim Sys­tem­start 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 Pro­blem, dass das Tem­pe­ra­tur­pol­ling alle fünf Minu­ten man­che Plat­ten am Stand­by hin­dert. Dies lässt sich ein­fach ver­hin­dern, wenn man die Zugriffs­rech­te auf den Tem­pe­ra­tur­wert ent­zieht. Im Ide­al­fall passt man dies ledig­lich an die Fest­plat­ten­mo­del­le an, wel­che davon betrof­fen sind. Im Fol­gen­den das Fest­plat­ten­mo­dell ST4000DM000. Meh­re­re Model­le kön­nen leer­zei­chen­ge­trennt ange­ge­ben 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 Tem­pe­ra­tu­ren gene­rell nicht, kann man das Modul beim Sys­tem­start auch kom­plett entladen.

midclt call initshutdownscript.create '{"type":"COMMAND","when":"POSTINIT","comment":"Unload drivetemp hwmon driver","command":"modprobe -r drivetemp"}'