Linux NAS in Suspend versetzen und wieder Wecken


Mein NAS benötigt im Leerlauf, wenn alle Festplatten schlafen und die CPU nichts zu tun hat, zwischen 28 und 35 Watt. In der Woche dümpelt es zu ¾ des Tags in diesem Zustand herum. Jetzt könnte man anfangen zu rechnen wie viel Geld das ist, aber ich denke es ist einfach zu viel. Der Cubietruck benötigt ca. 4 Watt wärend des Betriebs und mein Intel NUC (mit ATOM 2820 CPU) genemigt sich ca. 6 Watt. Das ist deutlich weniger. Also wäre es sinnvoll das NAS entweder auszuschalten oder in den Suspend (Suspend to RAM) zu versetzten.

Der Plan ist relativ einfach, wenn alle PCs und Fernseher aus sind soll auch das NAS in den Schlafmodus gehen. Damit das ganze funktioniert sind 3 Bindings erforderlich. Das WoL- (Wake on LAN) Binding wird benötigt um das NAS wieder aufzuwecken. Mit dem NetworkHealth-Binding überprüft OpenHAB, ob noch ein Gerät über das Netzwerk erreichbar ist und mit dem Exec-Binding wird das NAS in den Suspend to RAM Modus versetzt.

Installation

apt-get install openhab-addon-binding-wol openhab-addon-binding-networkhealth openhab-addon-binding-exec

Die Installation geht schnell und einfach.

Network Health Binding

Nur für das NetworkHealth Binding gibt es Parameter die in „openhab.cfg“ eingetragen werden können.

networkhealth:timeout=5000
networkhealth:refresh=3000

Da ich eine unverzügliche Reaktion auf das Einschalten der unterschiedlichen Geräte habe möchte, habe ich den Refresh-Wert auf 3 Sekunden gesetzt. Der Timeout liegt bei 5 Sekunde, das ist der Standard-Wert. Nun ist ein Neustart des OpenHAB Dienstes notwendig.

service openhab restart

Ist das erledigt muss, für jedes überwachte Gerät ein Switch-Item angelegt werden. Damit das NetworkHealth-Binding die Geräte überwachen kann, muss nur die IP-Adresse oder der Hostname angegeben werden.

Switch	meinPC	""	{ nh="192.168.0.100" }

Nun kann das Item auf der Sitemap eingebunden werden.

sitemap Test label="Main Menu"
{
	Frame label="Netzwerk" icon="network" {
		Switch item=meinPC label="Mein PC" icon="network"		
	}	
}

Ist das Gerät erreichbar, so wird das Netzwerk-Symbol grün dargestellt.

NetworkHealth onlineWenn es nicht erreichbar ist, so ist das Symbol rot und der Switch auf „0“.

NetworkHealth offlineDurch den niedrigen Refresh-Wert reagiert OpenHAB relativ zügig auf Veränderungen bei den überwachten Geräten.

Exec-Binding

Da nun bekannt is,t ob ein PC oder Fernseher an oder aus ist, soll nun das NAS in den Suspend Modus versetzt werden, wenn keines der überwachten Geräte mehr an ist. Hierfür ist eine SSH Verbindung vom OpenHAB Server zum NAS notwendig. Außerdem lässt sich der Befehl „pm-suspend“ leider nur als root ausführen. Deshalb sind ein paar Vorbereitungen notwendig.

Da sich root nicht über ssh anmelden darf, muss in der Datei „/etc/ssh/sshd_config“ der Eintrag

PermitRootLogin yes

so abgeändert werden. Nun sollte root aber auch ein sicheres Kennwort erhalten. Durch einem Neustart des SSH Dienstes werden die Einstellungen übernommen. Jetzt kann man testen, ob es möglich ist, sich vom OpenHAB-Server per SSH am NAS anzumelden.

sudo -u openhab ssh root@nas

Beim Verbindungsaufbau wird man gefragt, ob der angezeigt Fingerprint auch dem des angewählten Servers entspricht. Ist man sich sicher, tippt man „yes“ (das ganze Wort) ein. Nach erfolgreicher Eingabe des Passworts ist man nun als root auf dem Zielserver eingeloggt. Der Test muss aus zweierlei Gründen durchgeführt werden. Als erstes muss man nachsehen ob man sich als root anmelden kann. Der zweite Grund ist aber nicht unwichtiger, ohne den gespeicherten Fingerprint kann man sich nicht über das Exec-Binding am entfernten Server anmelden. Da die SSH-Verbindung ein Passwort erfordert, die Eingabe aber nicht manuell erfolgen kann, benötigt man ein Tool das diese Aufgabe übernimmt. SSHpass ist ein solches Tool.

apt-get install sshpass

Ist alles erfolgreich verlaufen, so kann ein Switch-Item eingerichtet werden, das beim Einschalten ein Script aufruft, in dem die SSH-Verbindung hergestellt und das NAS schlafen gelegt wird.

Switch	NASsleep	""	{ exec=">[ON:/home/openhab/nas-suspend.sh]" }

Dies soll nun automatisch erfolgen. Es muss geprüft werden ob alle Geräte nicht mehr erreichbar sind, ist das der Fall muss der Switch auf „ON“ gestellt werden und ein paar Sekunden später wieder auf „OFF“. Dafür habe ich eine Rule geschrieben, die jede Minuten diese Aufgabe übernimmt.

rule "NAS Sleep when no clients running"
when
  Time cron "0 * * * * ?"
then
  if(meinPC.state==OFF && Fernseher.state==OFF ) {
        if(NAS.state==ON) { 
              sendCommand(Sleep_NAS,ON)
        }
  }
end

Jetzt sind schon 2 von 3 Funktionen fertig, aber die dritte fehlt noch.

WoL-Binding

Auch hier ist auf meinen Linux NAS eine kleine Vorbereitung notwendig. Im BIOS des Server muss Wake on LAN aktiviert werden. Außerdem muss das Netzwerk Interface so aktiviert werden, dass die WoL-Pakete das System wieder aufwecken dürfen. Dafür muss in der Datei „/etc/network/interfaces“ diese Zeile in der Konfiguration der LAN Schnittstelle hinzugefügt werden.

pre-down /usr/sbin/ethtool -s eth0 wol g

Diese Einstellung wirkt aber erst nach einem Neustart des Betriebssystems. Damit sind die Vorbereitungen abgeschlossen. Damit das NAS aufgeweckt werden kann, wird ein Switch-Item erstellt.

Switch	NAS_WakeUP	"NAS_WakeUP"	<network>	{ wol="192.168.0.255#AA:BB:CC:DD:EE:FF" }

Das Binding erwartet die Broadcast-Adresse des Netzwerkes und die MAC-Adresse des zu weckenden Gerätes. Wird der Switch auf „ON“ geschalten sendet das Binding das WoL-Paket aus und das NAS erwacht. Auch hier gibt es eine Rule, um den Switch automatisch wieder auf „OFF“ zu stellen.

rule "NAS_WakeUP OFF "
when
  Item NAS_WakeUP changed from OFF to ON
then
  postUpdate(NAS_WakeUP,OFF)
end

Wer möchte, kann sich den WoL-Switch auch in die Sitemap mit einbauen, dann kann man das NAS auch manuell wieder aufwecken.

Nun benötigt man noch für jedes überwachte Netzwerkgerät eine Rule zum Aufwecken des NAS.

rule "Wake NAS meinPC ON"
when
  Item meinPC changed from OFF to ON
then
  if(NAS.state==OFF) {
           sendCommand(NAS_WakeUP,ON)
  }
end

Hier wird noch abgefragt, ob das NAS nicht doch schon ON ist. Sollte es so sein, wird das WoL Paket nicht gesendet.

Links:

OpenHAB Exec Binding
OpenHAB WoL Binding

OpenHAB NetworkHealth Binding


Schreibe einen Kommentar