S2RAM-Probleme bei schlafender Festplatte

Seit geraumer Zeit hatte ich das Problem, dass mein ThinkPad sporadisch nicht korrekt in den S3 Modus (s2ram / suspend) wechseln konnte und sich stattdessen mit blinkender Status-LED aufgehangen hat. Nach einer Menge Trial and Error wurde mir letztlich klar, dass die schlafende HDD das Problem ist. Ohne mir die Funktionsweise von Linux‘ s2ram genauer angeschaut zu haben, gehe ich davon aus, dass der Kernel versucht, den vorhandenen Festplatten die Anweisung zu geben, in den Standby zu wechseln. Da sich die HDD allerdings zu dem Zeitpunkt schon im Standby befindet, scheitert der Versuch und der Kernel verabschiedet sich.

Aber wie kann man das Problem zumindest temporär beheben? Dazu habe ich mir für Systemd einen wirklich simplen Sleep Hook gebaut, der lediglich die Aufgabe hat, die HDD vorübergehend aufzuwecken, damit der Kernel sie korrekt ansprechen kann.

Es wird lediglich überprüft, ob der Hook vor dem Suspend aufgerufen wird und ob das Blockdevice /dev/sdb existiert. Falls dem so ist, wird von einer zufälligen Position auf der Platte 1MB Daten gelesen. Die Position muss zufällig gewählt werden, da man sonst Gefahr laufen könnte, dass sich die abgefragten Daten bereits im Cache befinden und die HDD somit nicht aufgeweckt wird.

$ cat /usr/lib/systemd/system-sleep/sdb_spindown_fix
#!/bin/sh

if [ "$1" = "pre" ] && [ -b /dev/sdb ]; then
  dd if=/dev/sdb of=/dev/null bs=1M count=1 skip=$(( ( RANDOM % 1337 )  + 42 ))
fi

Simpel, oder?