Festplatten-APM überlisten

Nachdem ich ja leider feststellen musste, dass das Standard-APM von Ubuntu bzw. meinen Festplatten selbst sehr Fehlerhaft implementiert ist, hab ich nach Alternativen gesucht. Da meine Linux und auch C Kentnisse nicht sonderlich weit her geholt sind, hab ich ein einfaches Perl-Script geschrieben, was genau diese Aufgabe auf einfache und nachvollziehbare Weise übernimmt.

Die Funktionsweise des Scriptes:

Das Kernel-Flag setzen
Das Script arbeitet mit dem Kernelflag zum Überwachen der IO-Aktivitäten. Dadurch wird bei jeder IO-Operation in die syslog eine Zeile geschrieben, was diese bei zu viel Aktivität extrem anschwellen lässt. D.h. es ist überhaupt nur Sinnvoll, wenn wenig bis kein IO-Verkehr auf den Platten unterwegs ist.
/var/log/syslog auslesen
Zum Ermitteln, wann der letzte Zugriff auf eine HD erfolgte, wird die syslog gelesen. Das würde im Zweifel ja wiederum Zugriffe auf die HD erzeugen und die Platten währen für immer mit sich selber beschäftigt. Deswegen muss mindestens /var/log komplett in einer Ramdisk liegen, wie eben bei der Minimierung der Zugriffe beschrieben ist.
Kernel-IO-Stat auslesen
Aus der Kernel-IO-Statistik wird für jede der angegebenen Platten ermittelt, ob Lese oder Schreibzugriffe erfolgt sind. Im grunde wird die gesamte Zeile der Statistik als Schküssel benutzt. Sobald sich dort etwas ändert, wird der der Platten-Status auf “aktiv” gesetzt und der Timeout neu begonnen. Da immer nur dann eine Aktivität festgestellt werden kann, wennd as Script läuft, sollte es in kürzeren Intervallen laufen. Bei mir sind 5 Minuten ganz ok. Das hängt aber auch stark vom kleinsten, eingestellten Timeout ab.
Timout berechnen und Disk-Status setzen
Aufgrund der angegebenen Timeouts, der aktuellen Zeit und der letzten Disk-Aktivität wird die Disk in “standby” bzw. in “sleep” versetzt. Dafür muss der Script in kürzeren Abständen laufen.

Installation (als root):

  • hdparm installieren, ggf per apt-get install hdparm
  • Das Script [FEHLT] disk_lullaby.pl (Version 2) in /var ablegen [FEHLt] disk_lullaby_old script (alte Version 1)
  • Die Dateirechte ggf. mit chown root:root disk_lullaby.pl setzen.
  • Die config [FEHLT] disk_lullaby.cron für den Cron in /etc/cron.d ablegen
  • Den Cron mit /etc/init.d/cron restart neustarten

Benutzung
In der Cron-Datei ist der Aufruf komplett konfigurierbar. Hier das verwendete Beispiel (meine Einstellung):
0-59/5 * * * * root perl /var/disk_lullaby.pl sda=600,900 sdb=300,450
Das Script wird alle 5 Minuten vom Cron ausgeführt. Da das Setzen des Disk-Status root-Rechte erfordert, muss das Script auch als Root laufen. Die Parameter für das Script sind:
DISK=STANDBY_TIMEOUT,SLEEP_TIMEOUT
wobei mehrere Disks angegeben werden können. Bei mir geht also /dev/sda nach 600 Sekunden Inaktivität in “standby” (weniger Umdrehungen) und nach 900 Sekunden Inaktivität in “sleep” (ganz aus). Bei sdb sind die Zeiten etwas kürzer eigestellt, da es sich hier nur um eine Backup-Platte handelt, die normalerweise nicht verwendet wird.

Was das Script wann mit den Platten gemacht hat lässt sich einfach in der /var/log/disk_lullaby.log nachverfolgen. Für jeden Durchlauf wird dort unter anderem vermerkt, in welchen Zustand welche Disk gerade ist. Dafür werde ich später noch ein Auswertungsscript erstellen, damit man die Aktivitäten immer gut im Auge behalten kann.

Da das Script selber seine Status- bzw. seine Log-Datei in /var/log schreibt, sollte sich mindestens das in einer Ramdisk befinden (wie z.B. hier beschrieben) bzw. auf einer Platte, die nicht mit diesem APM-Script verwaltet wird. Da ja dort ständig IO-Verkehr durch das Script selber erzeugt wird, würde diese Platte sonst nie zur Ruhe kommen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert