Parken verboten! - Schutz vor dem "grünen Festplattentod" und etwas "systemd-Magic"
In der Folge dieses kleinen HowTos will ich die Einrichtung des Dienstes "parkverbot" mittels systemd unter openSUSE >= 12.2 beschreiben.
Die Einschränkung bezüglich der Version begründet sich darin, daß ältere Versionen von openSUSE zumindest per default keine Unterstützung für systemd als init-System besitzen. Für openSUSE 12.1 findet sich noch kein fertiges RPM in den offiziellen Repos, wer sein Glück mit einem Rebuild aus dem src.rpm probieren will, der kann ja über Erfolg/Mißerfolg berichten.
Zunächst natürlich die Antwort auf die Frage
"Was soll das Ganze überhaupt?"
Hierzu kann sich der geneigte Leser diesen Thread in linuxforen.de ansehen.
Der grüne Festplattentod - Load Cycle Count - Liste anfälliger Festplatten - linuxforen.de -- User helfen Usern
Die dort gegebenen Tipps mittels hdparm-Befehlen das "Parken" der Festplatte zu verhindern funktionieren leider nicht immer zuverlässig, auch mein kleines Netbook will trotz der entsprechenden Einträge noch immer viel zu häufig den Kopf der Platte parken und wieder aufwecken.
Enter "parkverbot" ...
Die Aktivierung und Einrichtung erfordert allerdings ein wenig Handarbeit und bietet zusätzlich noch die Möglichkeit ein wenig über die Möglichkeiten von "systemd" zu lernen, denn das Paket liefert zwei unterschiedliche ".service"-files mit.
Zunächst kurz zu den Optionen von parkverbot:
Für den normalen Anwender dürfte hier vor allem die Option "-t" von Interesse sein, der default von 4 Sekunden ist doch recht kurz geraten und anhand der Funktionsweise macht es Sinn das Intervall so lange wie möglich zu wählen um (Akku)Strom zu sparen, aber dazu später mehr.
Schauen wir uns zunächst die Datei /usr/lib/systemd/system/parkverbot.service etwas genauer an.
Die Datei enthält zwei für uns wichtige Details:
1)
Aus dieser Datei werden für den Dienst benötigte Variablen ausgelesen, namentlich
2)
die Variable "$PARKVERBOT_DISKS",
Da diese Datei noch nicht exisitiert, müssen wir sie zunächst anlegen, wir gehen dabei davon aus, daß nur eine Festplatte vorhanden ist, welche /dev/sda heisst.
Also legen wir als root eine Datei "/etc/sysconfig/parkverbot" mit folgendem Inhalt an.
Nun kann der Dienst als root mittels
aktiviert und gestartet werden.
Nachprüfen erfolgt mit
So weit, so gut, aber alle 4 Sekunden ein kurzes Aufwachen der Festplatte erschien mir dann doch zu viel des Guten, aber auch hier gibt es einen einfachen Weg.
Das .service file liest die Variable "$PARKVERBOT_DISKS" und übergibt deren Wert an das Programm "parkverbot" und nur weil die Variable "DISKS" heisst, verbietet sie es mir nicht auch andere Parameter mitzugeben.
Ändert man nun die Datei /etc/sysconfig/parkverbot ein wenig ab
und startet den Service neu, dann
erfolgt das Aufwecken nur noch alle 60 Sekunden. Welcher Wert zur eigenen Hardware passt muss man durch Ausprobieren herausfinden, je länger das Intervall gemacht werden kann, ohne daß die Platte "geparkt" wird, desto besser für den Akku, die 60 Sekunden sind aber nur ein Vorschlag, der nicht ganz unsinnig erscheint bei mir klappt das ganz gut mit diesem Wert.
So weit so gut, aber was macht man bei einer Kiste mit mehr als einer Festplatte?
Nun, genau für dieses Szenario kann man die zweite service-Datei "/usr/lib/systemd/system/parkverbot@.service" im Paket verwenden, schauen wir sie uns einmal genauer an.
Diese Datei enthält einige spezielle Variablen, deren Bedeutung man unter
genauer nachlesen kann.
Für dieses kleine HowTo soll nur erwähnt werden, daß solche services mit einem "@" im Namen mittels entsprechender "Zusatzinformation" aufgerufen werden können und damit einem bestimmten Gerät zugeordnet sind.
Will man z.B. diesen Service für die Platte /dev/sda starten, dann erreicht man dies mit
Wer mehrere Festplatten hat, kann also mehrfach den Service aktivieren und gibt dabei jeweils den passenden Namen mit, für 2 Platten /dev/sda und /dev/sdb sähe das dann so aus.
Haken an der Sache, hier fehlt die Möglichkeit einen Wert für "-t" oder andere Parameter mitzugeben, dazu benötigt man noch etwas weitere Handarbeit.
Weiter geht es in Beitrag 2 dieses Threads.
In der Folge dieses kleinen HowTos will ich die Einrichtung des Dienstes "parkverbot" mittels systemd unter openSUSE >= 12.2 beschreiben.
Die Einschränkung bezüglich der Version begründet sich darin, daß ältere Versionen von openSUSE zumindest per default keine Unterstützung für systemd als init-System besitzen. Für openSUSE 12.1 findet sich noch kein fertiges RPM in den offiziellen Repos, wer sein Glück mit einem Rebuild aus dem src.rpm probieren will, der kann ja über Erfolg/Mißerfolg berichten.
Zunächst natürlich die Antwort auf die Frage
"Was soll das Ganze überhaupt?"
Hierzu kann sich der geneigte Leser diesen Thread in linuxforen.de ansehen.
Der grüne Festplattentod - Load Cycle Count - Liste anfälliger Festplatten - linuxforen.de -- User helfen Usern
Die dort gegebenen Tipps mittels hdparm-Befehlen das "Parken" der Festplatte zu verhindern funktionieren leider nicht immer zuverlässig, auch mein kleines Netbook will trotz der entsprechenden Einträge noch immer viel zu häufig den Kopf der Platte parken und wieder aufwecken.
Enter "parkverbot" ...
Die Installation ist unter 12.2/12.3 schnell erledigtman parkverbot schrieb:Introduction
Modern rotational hard disks have a misfeature involving the regular automatic unloading of the heads, measurable by the S.M.A.R.T. attribute no. 193/225
"Load_Cycle_Count". While we do not know for sure, it is thinkable that manufacturers attempt to save power, or at least sell it that way.
The downside of this is significant latency on wakeup, and the constant hard retraction of the head is believed to reduce the disk's life. It is also not
reliably deactivatable: `hdparm -B` can yield "APM_level = not supported", in other cases, setting APM is supported, but has no effect. Furthermore, hdparm(8)
does not work with SCSI/SAS disks or disks behind protocol translation bridges (most USB enclosures). Using a DOS utility disk just is not realistic. (In
short, you suck, dear manufacturers.)
Description
The "parkverbot" daemon will issue small read requests periodically to a random location on disk in an effort to reset the inactivity timer in the hardware
and so prevent the dreaded head unloading.
The current algorithms are not fully proof, but it works reasonably well in practice for the amount of code it is composed of. The statistical success/failure
rate with disks in the original author's environment has been observed to be 0.4 unloads/day.
parkverbot obsoletes the earlier "thkd" package.
The name stems from German and indicates parking prohibited (you probably already guessed that), or more commonly known as a "no parking" zone.
Code:
# zypper in parkverbot
Code:
rpm -ql parkverbot | grep systemd
/usr/lib/systemd/system/parkverbot.service
/usr/lib/systemd/system/parkverbot@.service
Code:
parkverbot --help
Usage: parkverbot [-b kbytes] [-r kbytes] [-t sec] [-?|--help] [--usage]
-b kbytes Buffer size, in KB (default: 64)
-r kbytes Guard window size, in KB (default: 16384)
-t sec Interval between requests, in s (default: 4.0)
-?, --help Show this help message
--usage Display brief usage message
Schauen wir uns zunächst die Datei /usr/lib/systemd/system/parkverbot.service etwas genauer an.
Code:
[Unit]
Description=Hard disk head parking inhibitor
[Service]
EnvironmentFile=/etc/sysconfig/parkverbot
ExecStart=/usr/sbin/parkverbot $PARKVERBOT_DISKS
Restart=on-abort
RestartSec=3
Nice=-5
[Install]
WantedBy=basic.target
1)
Code:
EnvironmentFile=/etc/sysconfig/parkverbot
2)
Code:
ExecStart=/usr/sbin/parkverbot $PARKVERBOT_DISKS
Da diese Datei noch nicht exisitiert, müssen wir sie zunächst anlegen, wir gehen dabei davon aus, daß nur eine Festplatte vorhanden ist, welche /dev/sda heisst.
Also legen wir als root eine Datei "/etc/sysconfig/parkverbot" mit folgendem Inhalt an.
Code:
PARKVERBOT_DISKS="/dev/sda"
Code:
# systemctl enable parkverbot.service && systemctl start parkverbot.service
Nachprüfen erfolgt mit
Code:
systemctl status parkverbot.service
parkverbot.service - Hard disk head parking inhibitor
Loaded: loaded (/usr/lib/systemd/system/parkverbot.service; enabled)
Active: active (running) since Mon, 2013-06-10 20:58:13 CEST; 9s ago
Main PID: 3849 (parkverbot)
CGroup: name=systemd:/system/parkverbot.service
└ 3849 /usr/sbin/parkverbot /dev/sda
Das .service file liest die Variable "$PARKVERBOT_DISKS" und übergibt deren Wert an das Programm "parkverbot" und nur weil die Variable "DISKS" heisst, verbietet sie es mir nicht auch andere Parameter mitzugeben.
Ändert man nun die Datei /etc/sysconfig/parkverbot ein wenig ab
Code:
PARKVERBOT_DISKS="/dev/sda -t 60"
Code:
# systemctl restart parkverbot.service && systemctl status parkverbot.service
parkverbot.service - Hard disk head parking inhibitor
Loaded: loaded (/usr/lib/systemd/system/parkverbot.service; disabled)
Active: active (running) since Mon, 2013-06-10 21:04:34 CEST; 15ms ago
Main PID: 3902 (parkverbot)
CGroup: name=systemd:/system/parkverbot.service
└ 3902 /usr/sbin/parkverbot /dev/sda -t 60
So weit so gut, aber was macht man bei einer Kiste mit mehr als einer Festplatte?
Nun, genau für dieses Szenario kann man die zweite service-Datei "/usr/lib/systemd/system/parkverbot@.service" im Paket verwenden, schauen wir sie uns einmal genauer an.
Code:
[Unit]
Description=Run parkverbot daemon on %I
BindTo=%i.device
[Service]
ExecStart=/usr/sbin/parkverbot %f
Restart=on-abort
RestartSec=3
Nice=-5
[Install]
WantedBy=basic.target
Code:
man systemd.unit
Für dieses kleine HowTo soll nur erwähnt werden, daß solche services mit einem "@" im Namen mittels entsprechender "Zusatzinformation" aufgerufen werden können und damit einem bestimmten Gerät zugeordnet sind.
Will man z.B. diesen Service für die Platte /dev/sda starten, dann erreicht man dies mit
Code:
# systemctl start parkverbot@[B]dev-sda[/B].service
Code:
# systemctl enable parkverbot@dev-sda.service && systemctl start parkverbot@dev-sda.service
# systemctl enable parkverbot@dev-sdb.service && systemctl start parkverbot@dev-sdb.service
Weiter geht es in Beitrag 2 dieses Threads.