Festplatten nach Inaktivität in Standby versetzen unter Proxmox/ZFS (Debian)

Festplatten nach Inaktivität in Standby versetzen unter Proxmox/ZFS (Debian)

Festplatten sind nicht unerheblich für den Gesamtverbrauch eines kleinen Server- oder NAS-Systemes verantwortlich. Vor allem wenn das System selbst 24/7 läuft. Es macht daher Sinn, die Festplatten bei nichtverwendung abzuschalten. Dies kann einiges an Strom und damit bares Geld sparen. Außerdem werden Ressourcen und damit auch die Umwelt geschont.

Fallstricke beim Standby-Betrieb von Festplatten

Allerdings sollte man seine Laufwerke nicht einfach unkontrolliert in den Standby schicken. Wer zu euphorisch vorgeht, kann böse Überraschungen erleben: Ist die Zeitspanne zur Abschaltung zu gering gewählt, wird die Festplatte möglicherweise sehr oft ein und ausgeschaltet. Dies stellt eine hohe Belastung für das Laufwerk dar. Die Lebensdauer kann dadurch deutlich sinken.

Dies kann man über den SMART-Parameter 193 (Load Cycle Cound, manchmal auch Load/Unload Cycle Count) prüfen. Der Schreib-Lesekopf wird beim Ausschalten auf einer seitlichen Ruheposition geparkt. Auch beim Standby-Modus geschieht das.

# smartctl -a /dev/sda | egrep "(Power_On_Hours|Load_Cycle_Count)"
  9 Power_On_Hours          0x0012   097   097   000    Old_age   Always       -       22738
193 Load_Cycle_Count        0x0012   100   100   000    Old_age   Always       -       1032

In diesem Beispiel geschah das bei der Platte sda bereits 1032 Mal. Aussagekräftig wird der Wert aber erst in Relation zu den Betriebsstunden.

Es empfiehlt sich, diesen Wert zusammen mit ggf. anderen vorhandenen Protokolldateien über das Standby-Verhalten eine Zeit lang zu beobachten. So sieht man, welche Auswirkungen die Konfigurationsänderungen haben. Falls erforderlich können diese angepasst werden, damit die Lebensdauer nicht leidet.

Standby testen mit hdparm

Mit lsblk erhält man eine Übersicht der vorhandenen Partitionen und Laufwerke. Hier wird das jeweilige Laufwerk gewählt, das in den Standby-Modus versetzt werden soll. Auch wenn das System mehrere Platten besitzt: Für den Anfang würde ich zunächst mit einer Testen und die anderen später. Im Folgenden verwenden wir /dev/sda. Das „a“ muss ggf. durch den jeweils gewünschten Laufwerksbuchstaben ersetzt werden.

Da der Energiesparmodus nicht von allen Festplatten unterstützt wird, empfiehlt sich ein direkter Test zu Beginn. Mit dem Kommandozeilenwerkzeug hdparm können wir das Laufwerk sofort in den Standby versetzen. Es ermöglicht auch eine anschließende Prüfung, ob es sich tatsächlich im Stromsparmodus befindet.

Je nach Verwendungszweck des Systemes sollte man vorher sicherstellen, dass die Platte gerade nicht für wichtige Schreiboperationen benötigt wird. Für die ersten Tests wäre es am besten, wenn keine Last auf dem Laufwerk liegt.

Zunächst den aktuellen Status auslesen:

# hdparm -C /dev/sda

/dev/sda:
 drive state is:  active/idle

In der Regel sollte hier active/idle stehen. Eine Seagate-Festplatte lieferte mir allerdings auch schon unknown zurück. In den Standby-Modus versetzen ließ sie sich trotzdem. Das testen wir anschließend in jedem Falle:

# hdparm -y /dev/sda

/dev/sda:
 issuing standby command

Alternativ kann man mit -Y (großes Y statt y) eine schärfere Form wählen, falls -y nicht funktioniert. Über den -S Schalter zeigt uns das Tool im Anschluss, ob die Platte sich wirklich im Standby befindet:

# hdparm -C /dev/sda

/dev/sda:
 drive state is:  standby

In diesem Beispiel hat es funktioniert. Würde dort der gleiche Status wie zu Beginn stehen, gibt es zwei Möglichkeiten: Entweder hat es nicht funktioniert oder in der Zwischenzeit fand bereits wieder ein Zugriff auf die Platte statt.

Alternative: Manchmal weckt hdparm die Festplatte durch die Statusabfrage auf. Um das zu verhindern, kann smartctl genutzt werden. Es bietet einen speziellen Modus, bei dem Laufwerke im Standby nicht aufgeweckt werden.

smartctl -i -n standby /dev/sda | grep '^Power mode'

Dass sich die Festplatte im Standby befindet, sollte je nach Umgebungsgeräuschen auch hörbar sein. Im Leerlauf kann man den geringeren Stromverbrauch auch mit einem Energiekostenmessgerät erfassen. Wenn wir mit den obigen Befehlen das Laufwerk erfolgreich in den Energiesparmodus versetzen konnten, ist diese Funktionalität gegeben und wir können einen Zeitplan anlegen.

Zeitplan für den Energiesparmodus

Es gibt verschiedene Möglichkeiten um festzulegen, nach welcher Zeitspanne der Energiesparmodus einsetzt. Die einfachste ist mittels hdparm.

Energiesparmodus mit hdparm

Über den Schalter -S kann ein Wert für die Inaktitätsspanne angegeben werden. Dies ist jedoch keine direkte Zeitangabe in Minuten oder Sekunden, sondern ein Faktor. Je nach Wert variiert dieser: Zwischen 1 und 240 wird der Faktor mit 5 Multipliziert in der Einheit Sekunden. Mit dem Wert 240 legt man somit 20 Minuten fest. Weitere Unterteilungen findet man in der Manpage, meist wird man sich wohl im genannten Bereich befinden.

Um dies zu testen, empfehle ich einen geringen Wert zu wählen. Nach der Ausführung zeigt einem hdparm den tatsächlich gesetzten Wert auch in lesbarer Form an. Rechenfehler werden also spätestens dann bemerkt.

# hdparm -S 60 /dev/sda

/dev/sda:
 setting standby to 60 (5 minutes)

Nun kann man warten und anschließend wie oben beschrieben prüfen, ob sich das Laufwerk im Energiesparmodus befindet. Hat es funktioniert, sollte man sich hier einen realistischen Wert überlegen. Pauschale Empfehlungen sind hier schwierig. Es hängt stark davon ab, wofür das System genutzt wird und wie/wie oft auf das betroffene Laufwerk zugegriffen wird. Am besten probiert man einen Wert für einige Tage aus. Parallel sollten der Load_Cycle_Count SMART-Wert beobachtet werden.

Hinweis: Die per hdparm-Aufruf gesetzten Einstellungen sind flüchtig und werden nach dem nächsten Neustart wieder zurückgesetzt! Sollen sie (final) dauerhaft erhalten bleiben, müssen sie in der Konfigurationsdatei /etc/hdparm.conf gesetzt werden.

Energiesparmodus mit hd-idle

Eine bessere Alternative ist hd-idle. Wird ein Laufwerk aus dem Standby geholt, protokolliert es dies mit Zeitstempel. Auch wenn hierbei eine Einrichtung notwendig wird, ist dies gerade für den Anfang ein wichtiges Hilfsmittel. Über den SMART-Parameter Load_Cycle_Count sehen wir nämlich nur die Gesamtsume. Für eine optimale Konfiguration ist aber wichtig zu wissen, wann dies geschieht. Mithilfe der Zeitabstände zwischen den Aufwachvorgängen kann die Konfiguration optimiert werden. Darüber hinaus funktioniert hd-idle auch mit Festplatten, die unter hdparm Probleme bereiten. Dies trifft z.B. auf 4TB-Modelle der WD Red Serie zu.

Zunächst müssen wir drei Abhängigkeiten installieren:

sudo apt install debhelper fakeroot build-essential

Das Tool selbst kann von Sourceforge geladen werden. Anschließend muss man es kompilieren und ein paar Konfigurationsdateien kopieren:

wget https://netcologne.dl.sourceforge.net/project/hd-idle/hd-idle-1.05.tgz
tar xfvz hd-idle-1.05.tgz && cd hd-idle
make && make install

cp debian/hd-idle.default /etc/default/hd-idle
cp debian/hd-idle.init /etc/init.d/hd-idle

Unter Debian musste ich noch den Pfad zu hd-idle anpassen. Er ist in der Variable DAEMON hinterlegt. Hierzu öffnet man die Datei /etc/init.d/hd-idle mit einem Texteditor (z.B.) vim und ersetzt

DAEMON=/usr/sbin/hd-idle

durch

DAEMON=/usr/local/sbin/hd-idle

Schlussendlich geschieht die eigentliche Konfiguration in /etc/default/hd-idle. Hier ist START_HD_IDLE auf true zu setzen. Dabei geht es nicht nur um den Autostart. Steht die Variable auf false, unternimmt auch das Init-Skript nichts.

HD_IDLE_OPTS muss auskommentiert werden. Hier kann man mit -i die Leerlaufdauer in Sekunden setzen, nach der alle Festplatten in den Standby-Modus versetzt werden. Mit -l lässt sich eine Logdatei über die Aufwachvorgänge anlegen.

HD_IDLE_OPTS="-i 600 -l /var/log/hd-idle.log"

Wichtig ist, dass die Logdatei NICHT auf einer anderen Festplatte liegen sollte! Ansonsten wird eine weitere Festplatte durch das Schreiben in die Datei aufgeweckt. Am besten legt man sie auf ein Laufwerk, dass immer läuft wie die Systemplatte. Hier hat man in der Regel auch eine SSD, die nicht im Standby ist.

Es ist auch möglich, einzelne Laufwerke zu konfigurieren. Hierzu fügt man -a /dev/sda -i 600 ein. Die 600 Sekunden sind dann nur für das Laufwerk gültig, welches zuvor mit -a festgelegt wurde. Wie immer ist für die finale Version /dev/disk/by-uuid zu empfehlen, damit auch beim Ändern des SATA-Anschlusses die Platte korrekt zugeordnet wird.

Schlussendlich kann man das Tool via init.d Skript starten (Debian generiert automatisch einen Systemd-Service, der dann auch genutzt werden kann):

/etc/init.d/hd-idle start

Proxmox weckt die Festplatten auf

Wird Proxmox verwendet, kommt noch eine weitere Besonderheit dazu: Der Dienst pvestatd sammelt alle paar Sekunden Systeminfos. Diese werden in der Webschnittstelle dargestellt. Hierzu gehören auch die Infos der Laufwerke (freier Speicher etc). Wenn das Laufwerk in /etc/pve/storage.cfg als Proxmox-Speicher konfiguriert ist, findet dieser Scan definitiv statt.

Auf anderen Laufwerken soll er nicht durchgeführt werden. Allerdings habe ich schon erlebt, dass dies dennoch geschieht. In beiden Fällen kann man die Platten in der Datei /etc/lvm/lvm.conf ausschließen. Hierzu sucht man nach der Zeile global_filter und fügt für jedes Laufwerk folgende Zeichenkette in den Array ein:

"r|/dev/sda"

sda ist jeweils durch den Laufwerksnamen zu ersetzen. Anschließend das gesamte System neu starten und die Festplatte(n) wird/werden nicht mehr von Proxmox im Standby gestört.

Leave a Reply