nikolausdulgeridis
  FestplattenIdle
 
Linux: inaktive Festplatten in den Ruhestand schicken (Standby)

Das hier vorgestellte Skript überwacht auf Linux Systemen die Plattenaktivität und erzwingt den Standby. Interessant ist die Anwendung vor allem für Computer, die rund um die Uhr laufen müssen (NAS) oder Backup Systeme. SSD Platten profitieren naturgemäß nicht.

Vorbemerkung: Welches Problem wird gelöst

Festplattendienste laufen rund um die Uhr, werden im Mitttel aber nur wenige Stunden am Tag real genutzt. Um bei pausierenden Platten Energie zu sparen gibt es zwei Optionen: 
- Parken der Schreib/Leseköpfe, das verringert den Luftwiderstand (10% Ersparnis)
- Spindown (> 50% Einsparung)

Um eine inaktive Disk in den Spindown zu schicken, gibt es folgende Möglichkeiten

- Aktivieren der APM Funktion der Festplattte
- Das Programm HDIdlie, ein C++ Programm, der Spindown erfolgt über die SCSI Systemschnittstelle
- Das hier anhängende Shell Skript (der Spindown erfolgt mit Hilfe des Programms HD-Parm)

Überwachung via APM:

Jede Festplatte verfügt über einen eigenen Mikrocontroller. Als Schnittstelle nach aussen gibt es Smart, APM und einige lowlevel-Funktionen. Man kann der Festplatte also mitteilen: Schalte nach 30 Minuten ohne Datentransfer in den Standby, der Festplattencontroller übernimmt den Rest. Nur leider funktioniert das nicht immer, eigentlich eher selten. Die Gründe sind: verschiedene Modelle, verschiedene Schnittstellen und das Thema steht in der Agenda der Hersteller auch nicht sehr weit oben. 

Überwachung via PC / NAS Controller: 

Welches System könnte stattdessen die Festplatte herunterfahren? Bei einem Nas, also einem Computer der Festplattendienste zur Verfügung stellt, haben wir rein zufällig einen zweiten Mikrocontroller, der rund um die Uhr läuft und die Festplattenaktivität überwacht. Davon profitieren sowohl HDIdle als auch dieses Skript. Einzige Gegenindikation: Wenn das Nas-Board zur Energieersparnis selber in den Standby geht, dann fällt die Überwachung u.U. aus. (Kurz zur Erläuterung, warum  reden wir hier vorzugsweise über Nas? Weil normale Desktops nach wenigen Stunden Betrieb abgeschaltet werden, da ist das Thema doch eher nebensächlich. Wenn der Computer allerdings rund um die Uhr läuft, dann ist die Sachlage natürlich eine andere).

Welches Risiko besteht?

Das Skript initiiert nach 40 Minuten den Spindown, betroffen sind die Platten sda bis sdz 
Bei SSD ist der Spindown Befehl wirkungslos aber unbedenklich.
Das grösste Risiko besteht darin, dass der spindown zu oft oder gar nicht ausgelöst wird.
zu oft) unwahrscheinlich, im Zweifel das Logfile prüfen (/var/log/disk_spindown.log)
nie) nach 60 Minuten die Festplatte anfassen und auf Laufgeräusche prüfen oder den Stromverbrauch messen.

Ist ein Spindown schädlich für die Festplatte?

Grundsätzlich ja, vor allem der nachfolgende spinup ist eine elektrische und mechanische Belastung, die die Lebensdauer verkürzt. Demgegenüber steht, dass auch ein ununterbrochener Betrieb einen Verschleiss bewirkt, obwohl die modernen gasgefüllten Lager extrem langlebig sind. Die Hersteller geben einen Grenzwert für die maximale Anzahl der zulässigen Spindowns während der Lebensdauer einer Platte an. Hier bitte die Herstellerdokumentation oder den Smartstatus zu Rate ziehen. Nach meiner Einschätzung sollte man versuchen, im Mittel unter 10/Tag zu bleiben.

Deinstallation:

- Eintrag aus der Datei /etc/rc.local entfernen
- prüfen, ob das Skript: noch aktiv ist: ps aux | grep disk_spindown | grep -ivw grep
- Skript von der Festplatte loeschen: /usr/local/bin/disk_spindown.sh

Allgemeine Überlegungen zur Planung eines energieeffizienten NAS

Serverdienste laufen rund um die Uhr werden aber nur einen Bruchteil der Zeit genutzt. Durch die ständige Verfügbarkeit konkurrieren sie selbst bei moderatem Energieverbrauch mit der Kochgelegenheit.

Erster Ausweg ist die Wahl der passenden Hardware. Statt eines Desktops reicht ein Minicomputer oder ein dediziertes Nas System. Kleine Armboards sind wegen ihrer genügsamen Prozessoren sehr beliebt, Auch moderne Intelsysteme stehen dank fortgeschrittenem Powermanagement nicht schlechter da. Am Besten schneiden trotzdem einige (nicht alle) kommerzielle NAS Systeme ab. 

Zweitens Festplatten. Eine grosse Festplatte ist im Verbrauch günstiger als mehrere kleine. Das Ausrangieren ineffizienter alter Platten ist daher eine der effektivsten Massnahmen.

Drittens Powermanagement. Eine mechanische.Platte benötigt im Betrieb 4-8 W, im Standby/Spindown <2 W.

Backupstrategie: 

Datenverlust droht immer und jederzeit, der Smartstatus ist nur ein schwaches Indiz für das Ende der Festplatte. Wer Daten verliert, kann nicht den Festplattenhersteller beschuldigen. Datenverlust ist immer eine Folge schlechter Planung.

Prioritäten setzen: für 'normale' Daten reicht ein gelegentlicher sync auf eine zweite Platte. Wichtige Daten (Finanzen, Arbeit, Familie) werden mehrfach an verschiedenen Orten abgelegt. Heutzutage gibt es Clouds, das sollte man auch nutzen. 

Kompatibilität

Grundsätzlich funktioniert das Skript auf allen Computern, auf denen der Befehl hdparm -y  /dev/sd* die Festplatten erfolgreich in den Standby versetzt. HDParm ist ein verbreitetes Tool und wird unter Linux breit unterstützt. Erfolgreich getestet habe ich das Skript mit Raspberry2, Odroid C1, Odroid XU4 zusammen mit externen Festplatten von Seagate, WD, etc.. Bei Odroid N2 gibt es ein Treiberproblem bei externen Festplatten. Der Fehler entsteht vermutlich durch unvollständige Umsetzung der Ata Befehle durch das USB3 Sata Interface und betrifft auch andere Boards mit der selben Konstellation. Das Problem ist zwar lösbar, muss aber für jedes Festplattenmodell wiederholt werden.

Troubleshooting:


Bei Verwendung von externen Platten mit USB3 Schnittstelle, kann es zu Kompatibilitätsproblemen kommen, wenn der UAS Treiber geladen wird. Der Grund ist nach mehreren Quellen möglicherweise die unvollständige Umsetzung der Ata Befehle in der USB Schnittstelle.

Folgende Tests sollte man daher in der Linux Konsole durchführen:
sudo hdparm -I   /dev/sd* # inf 
sudo hdparm -C /dev/sd* # status
sudo hdparm -y  /dev/sd* # Parken und spindown
sudo hdparm -Y /dev/sd* # sleep
sudo cat /proc/diskstats   # Protokoll der Plattenaktivität unter Linux
sudo fstrim -av                # SSD trim

Bei Kommunikationsproblen zwischen hdparm und der Schnittstelle kann es zu einer Fehlermeldung kommen:
root@odroidN2:~# hdparm -C /dev/sdb
/dev/sdb:
SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Trotzdem kann in vielen Fällen der Standbymodus aktiviert werden. Oder man versuchgt eine der Alternativen.

Alternativen:

a) HDIdle ist in C++ geschrieben und muss vor der Verwendung heruntergeladen und kompiliert werden (s. Link). 
b) APM: Ich habe es aufgegeben mit den APM Parametern herumzudoktern. Es ist ein Ratespiel und für jede Festplatte anders. Der einzige Weg APM zuverlässig zu konfigurieren sind die Tools der Hersteller. Will man die Platte mit Linux verwenden, muss man sie erst an einem Windows PC konfigurieren und dann umstecken. 
 

-------------------------------------------------------------------

Skript:

Das folgende Skript überwacht die Festplattenaktivitaet und schaltet nach ca. 40 Minuten die angeschlossen Festplatten in den Standby. Die Vorlage habe ich auf folgender Seite gefunden https://linuxwiki.de/hdparm und ein wenig modifiziert. 

Installation:

a) Installation von Hdparm
Einzige Voraussetzung ist eine installierte Version des Tools hdparm
sudo apt install hdparm

Kontrolle, ob die benötigten Programme vorhanden sind:
sudo which diff
sudo which hdparm

b) prüfen, ob das Laufwerk /run/shm ein Ramdrive ist:
Das Ramdrive dient zum Zwischenspeichern der Laufwerkstabelle
sudo df -h
hier sollte neben dem Laufwerk die Bezeichnung Ramfs oder tmpfs (oder so ähnlich stehen), falls nicht, muss ein anderes Laufwerk gesucht werden (das ist übrigens der einzige Fall, in dem man an das Skript Hand anlegen muss). 

c) Skript speichern
das unten stehende Skript unter
/usr/local/bin/disk_spindown.sh
speichern.

d) Skript ausführbar machen:
sudo chmod +x /usr/local/bin/disk_spindown.sh

e) Test:
Programm starten: (zum Testen kann eine verkürzte Zeit angegeben werden)
sudo /usr/local/bin/disk_spindown.sh 60 3 & # Erlaeuterung: 60 Sekunden, 3 Durchlaeufe, neuer Prozess

Prozess abfragen:
sudo ps -ef | grep -ivw grep | grep -i disk_spindown # Pruefe ob Prozess läuft

Logfile auslesen:
watch "sudo cat /var/log/disk_spindown.log"

Hinweis: Das Logfile gibt nur Aufschluss, ob der Standby eingeleitet wurde. Eine Kontrolle findet nicht statt, da manche Festplatten bei einer Statusabfrage erst wieder hochfahren.

f) Autostart aktivieren
wenn der Test erfolgreich war, muss das Programm noch in der Autostart verankert werden,  dazu in der Datei /etc/rc.local folgende Zeile am Ende einfügen (aber vor exit 0)

/usr/local/bin/disk_spindown.sh & >/dev/null
 
g) Rechner neustarten und evtl. noch einmal testen.
 sudo ps -ef | grep -ivw grep | grep -i disk_spindown # Pruefe ob Prozess läuft
 for disk in {a..f} ; do echo $(hdparm -C /dev/"sd$disk" 2> /dev/null | grep "sd$disk" -A 1) ; done # aktueller Status der Platten
 sudo cat /var/log/disk_spindown.log # Logfile 
 
Nach spätestens 60 Minuten sollte die Festplatte in den Standby gehen. Zur Bestätigung kann man die Festplatte anfassen und auf Laufgeräusche prüfen. Wenn man ein Messgerät hat, kann man ausserdem die Stromaufnahme prüfen.

 

**********
Links:
https://linuxwiki.de/hdparm
https://wiki.debianforum.de/Hdparm
https://wiki.ubuntuusers.de/Notebook-Festplatten-Bug
https://www.pks.mpg.de/~mueller/docs/suse10.3/opensuse-manual_de/manual/sec.pmanage.silenthd.html
https://openmediavault.readthedocs.io/en/latest/administration/storage/disks.html
https://www.technikaffe.de/forum/index.php?thread/741-omv-power-management-festplatten
https://linuxundich.de/hardware/festplatten-automatisch-im-betrieb-in-den-standby-schalten 

https://www.heise.de/ct/ausgabe/2013-1-Energiespareinstellungen-bei-Festplatten-konfigurieren-2331846.html (kostenpflichtiger Artikel auf heise.de, leider etwas alt) 
https://mrattun.de/festplatten_standby.html 
https://forum.openmediavault.org/index.php/Thread/20301-OMV-for-ROCK64-and-other-RK3328-devices-soon/ 
http://www.tacticalcode.de/2013/01/festplatte-automatisch-in-standby-mit-hdparm-und-udev.html 
http://www.gtkdb.de/index_7_243.html
**********

Hinweise:
  • Anmerkung zu ext4. Bei Schnellformatierung beendet ein daemon (ext4lazyinit) die Formatierung im Hintergrund. Es kann also passieren, dass das Laufwerk in den ersten Stunden nicht in den Standby geht.
  • Tipps für HDparm gibt die Linuxwiki: https://linuxwiki.de/hdparm#.
  • Die Log Datei wird bei jedem Programmstart neu angelegt. 
  • USB Platten mit externem Netzteil wechseln bei abgeschalteter USB Spannung sofort in den Tiefschlaf mit nur noch 0,3W. Leider habe ich bisher keinen Weg gedunden, davon zu profitieren, da nach dem Wiedereinschalten ein remount (mit mount -a) erforderlich wird, selbst bei vorherigem spindown. 
  • USB Platten bleiben wach, solange der Anschluss Spannung erhält. Das gilt insbesondere für Computer im Standby, weil hier die USB Schnittstellen aktiv bleiben. Das ist so beabsichtigt, weil von einer angeschlossen Maus oder Tastatur das Signal zum Aufwachen kommt. 
  • Ein Easteregg leistet sich Seagate mit dem Modell USB plus Hub. Der auf der Platte befindliche Hub kommt dem notorisch knappen Vorrat an USB3 Schnittstellen entgegen. Das ist gut gemeint,. leider bleiben wegen des aktiven Hubs alle nachfolgenden Festplatten am Leben, auch wenn der Computer ausgeschaltet wurde und die erste Platte längst im Tiefschlaf liegt. Über die abgeschaltete USB Schnittstelle kann ein spindown Kommando von aussen nicht mehr erfolgen.
  • Wer eine Anleitung zur Installation von HdIdle sucht, könnte z. Bsp. hier fündig werden: https://www.foxplex.com/sites/festplatten-standby-im-leerlauf-mit-hdparm-und-hd-idle. Der Vollständigkeit halber soll ein kleines Manko nicht unerwaehnt bleiben: Es werden von HD-Idle keine nachgesteckten Platten erkannt.  
  • Der Smartstatus dient vor allem der Herstellerabsicherug in Gewaehrleistungsfragen. Der Status ist zur Prognose von bevorstehenden Ausfaellen nur unzulänglich geeignet, wie Untersuchungen gezeigt haben.
  • Es kann vorkommen, dass Platten laut Werkseinstellung nach 10 Minuten von sich aus in den Standby gehen. Mir ist allerdings aktuell kein Beispiel bekannt.
  • Zuweilen wird die Festplatte nach kurzer Zeit wieder hochgefahren, oft lässt sich der Verursacher schwer ermitteln. Das ist kontraproduktiv und verkürzt die Lebensdauer. Am besten Neuinstallation oder man verwendet SSD.
  • Trim Kommando fuer SSDS hinzugefuegt


### Skript start (das Programm findet man auch im Downloadbereich) ###
#!/bin/bash
# Notes: 
# the original source can be found 
# https://linuxwiki.de/hdparm#disk_spindown.sh
# I felt free to do some minor changes
# - delay is performed before the first check, to avoid unnecessary standby procedure after boot
# - not existent drives are skipped
# - output to logfile /var/log/diskspindown.log
# - ramdrive changed to /var/tmp
# - optional parameter: spindowntime may be overwritten with param 1 (default: 2100) 
# - optional parameter: new maxcount may be set with param 2 (default: 0, respective infinit)
# - contact: nikolausdulgeridis at gmail.com
 
# Purpose of this script: 
# Check for disk data transfer and spin them down after approx. 20 min
# explanation: often harddrive firmware fails to spindwon with hdparm -B oder -S settings.
# but the hdparm -y command works directly with (nearly) every disk. 
# So that is a script for monitoring that harddrives.and spin them down after a given time
# documentation: http://linuxwiki.de/hdparm
#
# Installation:
# ---------------
# For this script hdparm must be installed, but not configured!
# Only a apm=255 is maybe needed in the hdparm.conf for the Drive.
#
# - Put it to /usr/local/bin/disk_spindown.sh
# - Set the Permissons sudo chmod 744 /usr/local/bin/disk_spindown.sh
# - Startup: we put a new line in /etc/rc.local for systemwide start.
# /usr/local/bin/disk_spindown.sh & >/dev/null
# exit 0
#
# Now you can reboot the pc, for activate or to activate a change.
#
# #
# # *** some information for older disks ***
# # 
# # Western Digital Green Harddrives (mostly not suitable with hdparm -S or -B)
# # ---------------------------------------------------------------------------
# # Modern Western Digital "Green" Drives include the Intellipark feature that stops the disk when not in use.
# # Unfortunately, the default timer setting is not perfect on linux/unix systems, including many NAS,
# # and leads to a dramatic increase of the Load Cycle Count value (SMART attribute #193).
# # Please deactivat it with http://idle3-tools.sourceforge.net/ (normally in the Distro)
#
# # get the Info: idle3ctl -g /dev/sd(x)
# # disabling :   idle3ctl -d /dev/sd(x)
# # The idle3 timer seems to be a power on only setting. 
# # That means that the drive needs to be powered OFF and then ON to use the new setting.
# # I turn off the Computer, plug the power off and push the start button, for a short while the fan go's on. 
# # All power it out. 
# # Or turn off for few minutes to take the effect.
# # **************************************************
 
##################################################
### troubleshooting ###
# please check your PATH settings if you run into problems, also make sure your script is executing with root permissions
# especially when using crontab, it may happen, that the path settings differ from what you expect. 
# so you should  test under real conditions, to be sure its working 
# typical paths
# which diff
#    /usr/bin/diff
# which hdparm
#    /sbin/hdparm
# which cat
#    /bin/cat
### logfile watching 
# watch "cat /var/log/disk_spindown.log && echo --- && ps -ef | grep spindown | grep -vw grep"
##################################################
 
### Logfile:
diskspindownlog="/var/log/disk_spindown.log"
 
# Where is your Ramdrive? 
# Check it out with  df -h or mount command.
# Possible Values Examples: /dev/shm , /run/shm 
#ramdrive=/run/shm
ramdrive=/var/tmp
 
# The Spindwon Time in Seconds
# The Raktion done in $spindowntime maximum of 2 times. Depending build by the script. Protects for the cpu load. 
spindowntime=2100; 
if [ $1 ] ; then let spindowntime="$1"; fi
 
# Counter
# counter, 0 means infinite  
let counter=0;
if [ $2 ] ; then let counter="$2"; fi
 
# Log 
# appendlog= append log, newlog=new log (default), nolog= no output to logfile 
logmode="newlog"; 
if [ $3 ] ; then logmode="$3"; fi
if [ "$logmode" == "nolog" ]; then diskspindownlog="/dev/null"; fi #!!caution!! stringcompare spaces: if_[_$1_==_$2_]; then usw.
if [ "$logmode" == "newlog" ]; then rm $diskspindownlog; fi
 
# Wich disks are handled 
diskvolumes="a b c d e f g h i j k l m n o p q r s t u v w x y z"
#watch "date && cat /proc/diskstats | grep sd"
 
# Build onece the tempfiles 
if [ ! -f $ramdrive/diskstate1 ]; then touch $ramdrive/diskstate1;fi 
if [ ! -f $ramdrive/diskstate2 ]; then touch $ramdrive/diskstate2;fi
 
### 
#Wait before 1st run and initialize file diskstate1
#Start logging
echo '***'
echo start disk monitoring: disk_spindown.sh - harddrive standby after inactivity
echo start disk monitoring: disk_spindown.sh - harddrive standby after inactivity >> $diskspindownlog
echo "date: $(date)  --- settings: "seconds:$spindowntime repeat:$counter "
echo "date: $(date)  --- settings: "seconds:$spindowntime repeat:$counter "  >> $diskspindownlog
echo '************************************************************************ '
echo '* usage:   [/bin/bash] disk_spindown.sh [ <delay> [ <count> [ [newlog|appendlog|nolog] ] ] ] '
echo '* example: /usr/local/bin/disk_spindown.sh 600 0 >/dev/null & # stby after approx.10 min, infinite'
echo "* view log:  cat /var/log/disk_spindown.log"
echo '************************************************************************ '
echo '*** ps -ef | grep spindown | grep -vw grep ***'
ps -ef | grep spindown | grep -vw grep 
echo '*** ps -ef | grep spindown | grep -vw grep ***'  >> $diskspindownlog
ps -ef | grep spindown | grep -vw grep                 >> $diskspindownlog
echo '****************************************************************'
cat /proc/diskstats > $ramdrive/diskstate1
sleep $spindowntime
 
# Here we go... 
let count=0;
let shutdown=0;
while [ true ] ; do
echo '('"$count"')' $(date)
echo '('"$count"')' $(date) >> $diskspindownlog
 
# cycle it to test for activity 
mv $ramdrive/diskstate1 $ramdrive/diskstate2 
cat /proc/diskstats > $ramdrive/diskstate1
 
# Loop through all array disks and spin down idle disks. 
let allidle=1;
for disk in $diskvolumes 
do
   if [ "$(diff $ramdrive/diskstate1 $ramdrive/diskstate2 | grep -w sd$disk )" =  "" ] ; then 
# skip drive letters that are currently not used
if [ $(cat $ramdrive/diskstate1 | grep -cw -m 1 sd$disk ) != "0" ] ; then 
  sudo hdparm -y /dev/sd$disk >/dev/null 2>&1; 
  #echo hdparm -y /dev/sd$disk  
  #echo hdparm -C /dev/"sd$disk" 
  # removed: echo $(hdparm -C /dev/"sd$disk" 2> /dev/null | grep "sd$disk" -A 1)   
  # removed: echo $(hdparm -C /dev/"sd$disk" 2> /dev/null| grep "sd$disk" -A 1) >> $diskspindownlog
  echo spindown "sd$disk"  
  echo spindown "sd$disk"  >> $diskspindownlog 
fi;
   else
let allidle=0;
   fi;
done 
 
let count+=1; if [ "$counter" -eq "$count" ]; then break; fi   
if [ $((count % 999)) -eq 0 ]; then rm $diskspindownlog; echo remove; fi  # simple logfile size limit
 
if [ $allidle -eq 1 ] ; then
  let allidlecount=$allidlecount+1;
else
  let allidlecount=0;
fi;
 
if [ $allidle -eq 1 ] ; then
  sudo fstrim -av
fi;
 
  #echo allidle $allidle; echo allidle $allidle >> $diskspindownlog
  #echo allidlecount $allidlecount;  echo allidlecount $allidlecount >> $diskspindownlog  
  ##check networkactivity 1 sec
  #nwstat=($(dstat -n --bw 1 1 | grep -v e));  let nwaktiv=0; for ele in "${nwstat[@]}"; do if [ $ele != "0" ]; then let nwaktiv+=1 ;fi ; done ; 
  #for ele in "${nwstat[@]}"; do echo $i $ele; let i+=1; done
  #echo nwaktiv $nwaktiv
  #if [ $nwaktiv -ge 1 ] ; then 
  #  allidlecount=0;
  #fi
 
#Wait
sleep $spindowntime
 
done
 
exit 0
 
#changes 11.1.2020 
# removed status check hdparm -C and replaced with following lines, reason is some drives wake up when receiving status quests  
#   # removed: echo $(hdparm -C /dev/"sd$disk" 2> /dev/null | grep "sd$disk" -A 1)   
#   # removed: echo $(hdparm -C /dev/"sd$disk" 2> /dev/null| grep "sd$disk" -A 1) >> $diskspindownlog
#   echo spindown "sd$disk"  
#   echo spindown "sd$disk"  >> $diskspindownlog 
# remarks:
# - allidle, allidlecount: not used, the idea was to detect inactivity and power down after some time 
# - i tested also with -Y (sleep) instead of -y (spindown), but with seagate i got n advantage, quite the contrary
#   same power consumption but long spinup time (5 seconds) 
#changes 2.2.2020 
#added trim command for ssds
#if [ $allidle -eq 1 ] ; then
#  sudo fstrim -av
#fi;
#changes 8.2.2020 
#line added:
#if [ $((count % 999)) -eq 0 ]; then rm $diskspindownlog; echo remove; fi  # simple logfile size limit
 

last update: 28.2.2019
last update: 10.7.2019
last update: 11.1.2020
last update: 2.2.2020

 
  5 Besucher