You are not logged in.

Dear visitor, welcome to sourceserver.info. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

  • DeaD_EyE

    Administrator

    You have to register first, to connect to this user.

20

Strom sparen, durch geschicktes scripten

Rating:

by DeaD_EyE, Sunday, June 5th 2011, 8:42pm

Einführung
Viele Admins, die sich ausgiebig mit Servern beschäftigen, haben meistens auch einen (Test-)Server zu Hause stehen.
Meist sollen diese Server im Regelfall zu irgendwelche Uhrzeiten bestimmt Aufgaben erfüllen. Vor diesem Problem stand ich letztens. Mein Server soll um 3 Uhr morgens ein Datenbank-Backup machen und mit apt-mirror meinen Debian.Mirror auffrischen. Die restliche Zeit ist er ungenutzt. Hin und wieder schalte ich den Server für Tests manuell ein, mache ihn aber wieder aus, wenn ich damit fertig bin.

Nun denken viele, dass man so einen Server auch fürs Routing, Fileserver, E-Mail-Server, Fax-Server usw nutzen und deswegen 24/7 laufen lassen. Für Leute wie mich, ist es aber überflüssig. Wenn wir mal davon ausgehen, dass so ein Server 120 Watt Leistungsaufnahme hat, kann man sich leicht ausrechnen, was der 24/7-Betrieb kosten würde. Bei den aktuellen Strompreisen ist es nicht mehr vernachlässigbar. Wenn wir von 24 Cent pro KW/h ausgehen, sind wir für den Betrieb des Servers in einem Monat bei 20,73 €. Auf ein Jahr hochgerechnet, kommen wir auf 252,28€. Immerhin ist das schon bei einem Server mit wenig Stromverbrauch ein recht hoher Preis. Wenn wir davon ausgehen, dass unser Server für die Aufgaben, die er erledigen soll, am Tag nur eine Stunde benötigt, kommen wir auf 86 Cent pro Monat. Hochgerechnet auf ein Jahr sind das 10,51€. Dadurch spart man 241,77€.

Mit geschickter Programmierung und einem halbwegs aktuellen Motherboard kann man den sogenannten acpi-wakeup nutzen. Meist besitzen diese Boards im BIOS die Funktion den PC zu bestimmten Uhrzeiten aufzuwecken. Damit das Setzen der ACPI-Wakeupalert funktioniert, muss die Funktion im BIOS aber deaktiviert sein.

Der einfachere Weg wäre, die Uhrzeit einfach im BIOS einzustellen. Da ich aber zu faul war einen Monitor und eine Tastatur an meinem Server anzuschließen, habe ich mich entschlossen den komplizierten Weg zu gehen.

Der Test
Zuerst habe ich getestet, ob mein Mainboad diese Funktion überhaupt unterstützt.
Dazu kann man bei einem aktuellen Kernel (-> 2.6.32-5-686) das Datum+Uhrzeit im UNIX-TIME-Format setzen. Dabei wird in Sekunden gerechnet und die Zeit fängt um 00:00 Uhr am 01.01.1970 an. Der Befehl Date kann mit diesem Format umgehen und uns dabei behilflich sein, die gewünschte Zeit vom lesbarem Format in UNIX-TIME umzuwandeln.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
# Kontrolle der Uhrzeit
date
# Zeit für heute ausgeben
date -d 17:00
# So 5. Jun 17:00:00 CEST 2011
# jetzt die Zeit für Heute 17:00 in UNIX-TIME ausgeben
date -d 17:00 +%s
# 1307286000

# Jetzt setzen wir die Zeit für den Aufweck-Test
date -d 17:00 +%s > /sys/class/rtc/rtc0/wakealarm
# und jetzt den Server herunterfahren
poweroff


Nach erfolgreichem Test
Wenn der Test erfolgreich verlaufen ist, kann man schonmal erleichtert sein.
Ich möchte ich noch kurz erklären, wie wir dem Server mitteilen, dass er z.B. jeden Morgen um 3:00 Uhr hochfährt. Dabei ist auch wieder der Befehl date behilflich.

Source code

1
2
3
4
5
6
# Datum von morgen (+24 Stunden) ausgeben
date -d tomorrow
# Mo 6. Jun 16:54:07 CEST 2011
# jetzt in UNIX-TIME
date -d tomorrow +%s
# 1307372047


Da wir den Server aber nicht in 24 Stunden nach dem ausführen des Befehls neustarten wollen, sondern selbst eine Uhrzeit für Morgen angeben wollen, müssen wir Jahr, Monat und Tag zwischenspeichern. Das lässt sich z.B. so erledigen:

Source code

1
2
3
4
5
6
7
Y=`date -d tomorrow +%Y`
M=`date -d tomorrow +%m`
D=`date -d tomorrow +%d`
TIME="3:00"
date -d "$Y-$M-$D $TIME"
# das wieder in UNIX-TIME
date -d "$Y-$M-$D $TIME" +%s


Das Init-Script
Also halten wir Fest: Wir müssen die Uhrzeit für das Aufwecken für jeden Tag neu setzen. Der Wert wird in /sys/class/rtc/rtc0/wakealarm als UNIX-TIME geschrieben.
Für diese Aufgabe habe ich mir ein init-script geschrieben.

Spoiler Spoiler

/etc/init.d/wakeup

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#! /bin/sh
### BEGIN INIT INFO
# Provides:          set wakeupalarm
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Set the acpi-wakeupalarm
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: DeaD_EyE <deadeye@sourceserver.info>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="wakeupalarm"
NAME="wakeup"
SCRIPTNAME=/etc/init.d/$NAME

. /lib/init/vars.sh
. /lib/lsb/init-functions

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

do_stop()
{
        Y=`date -d tomorrow +%Y`
        M=`date -d tomorrow +%m`
        D=`date -d tomorrow +%d`
        log_begin_msg "Setze Aufweckzeit auf $Y-$M-$D $TIME"
        date -d "$Y-$M-$D $TIME" +%s > /sys/class/rtc/rtc0/wakealarm
        # fuer Testzwecke Aufweckzeit am gleichen Tag einstellen
        # dazu die oberen beiden Zeilen auskommentieren
        # und den Kommentar bei den beiden folgenden Zeilen entfernen
        # log_begin_msg "$TIME"
        # date -d "$TIME" +%s > /sys/class/rtc/rtc0/wakealarm
        log_end_msg $?
        return 0
}

do_start()
{
        #Setzt wakeupalarm auf 0
        log_begin_msg "Loesche Aufweckzeit"
        echo 0 > /sys/class/rtc/rtc0/wakealarm
        log_end_msg $?
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop}" >&2
        exit 3
        ;;
esac

:


Die Datei /etc/init.d/wakeup ausführbar machen:

Source code

1
chmod u+x /etc/init.d/wakeup


Zusätzlich muss in /etc/default/ die Datei wakeup angelegt werden.

Source code

1
2
#/etc/default/wakeup
TIME=3:00


Danach nur noch das Init-Script einrichten:

Source code

1
update-rc.d wakeup defaults


Sobald wir das System herunterfahren, wird das die Stop-Funktion des Init-Scripts aufgerufen und somit die neue Aufweck-Zeit gesetzt


Das Script, welches die Aufgaben erledigt
So könnte das eigentliche Script aussehen, welches nach 3:00 Uhr ausgeführt wird:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# Uptime in Minuten auslesen und bei einer laengeren Uptime von 30 Minuten den Befehl poweroff nicht ausführen
if [ $(echo "$(cat /proc/uptime | cut -d ' ' -f 1) / 60" | bc) -lt 30 ]; then
        # nur einen Restart machen,
        # wenn der PC nicht laenger als 30 Minuten an ist
        poweroff=1
else
        # keinen restart machen
        poweroff=0
fi

# Backupscripts und andere Dienste ausfuehren
# Hier koennt ihr eure eigenen Scripts verwenden
su - -c "apt-mirror > /mnt/raid1/apt-mirror/mirror.log" apt-mirror
su - -c "./backup.sh --sql" sosi

# PC herunterfahren, wenn poweroff == 1
[[ $poweroff == 1 ]] && /sbin/poweroff


Ich habe das Script work.sh genannt und in /root gespeichert. Wichtig ist, dass nur root den PC wieder herunterfahren kann, wenn man an der Konfiguration nichts ändert.

Der Cronjob
Als nächstes kann man das Script als Cronjob einrichten. Ich nutze dafür den Befehl crontab -e. Sollte euch der Editor missfallen, könnt ihr den Befehl auch so aufrufen:

Source code

1
EDITOR="nano -w" crontab -e


Jetzt den Crontab einrichten, dabei ist zu beachten, dass der PC etwas Zeit zum hochfahren benötigt und auch ggf. noch die Festplatten überprüft werden. Deswegen starte ich den Cronjob z.B. erst um 3:15 Uhr:

Source code

1
15 03 * * * /root/work.sh


Das Format steht in den Kommentaren. Hierbei ist zu beachten, dass zuerst die Minute kommt und dann die Stunde. Die Sterne legen fest, dass jeder Tag, Monat und Woche gemeint ist. Nachdem der Crontab eingreichtet ist, kann man bis zum nächsten Start überprüfen, ob alles funktioniert hat.

Der elegenate Weg mit anacron
Ein anderer Weg wäre anacron einzusetzen. Dieser Dienst führt Cronjobs nach aufruf von anacron verzögert aus. Beim Systemstart wird der Dienst einmal gestartet, dann arbeitet er die Jobs ab, die noch abgearbeitet werden müssen und beendet sich danach wieder.

Zuerst installieren wir den Dienst:

Source code

1
apt-get install anacron


Danach müssen wir dann die Datei /etc/anacrontab bearbeiten:

Source code

1
1          1          work          /root/work.sh

Dadurch wird das Script jeden Tag einmal um eine minute verzögert nach dem Start von anacron ausgeführt. Anacron speichert nach der Ausführung des Cronjobs diese Information, damit der Dienst beim nächsten Start nicht noch einmal ausgeführt wird.

Was man noch machen kann - Wake-On-LAN
Jeder Admin ist faul. Das ist eine Gegebenheit, die man einfach hinnehmen muss. Masse in Bewegung zu versetzen benötigt Energie. Da der Server jetzt die meiste Zeit aus ist, wäre es ziemlich blöd jedesmal zum Server laufen zu müssen, der höchstwahrscheinlich weiter als 5 Meter entfernt ist. Durch Wake-On-LAN kann man den PC auch wieder ferngesteuert über ein Magic-Paket per Broadcast auf Port 9 mit der MAC-Adresse des NIC den PC wieder hochfahren. Diese Option lässt sich per meist per BIOS einschalten. Fast alle Onboard-NICs unterstützen den Modus g, welcher das zuvor angesprochene Magic-Paket ist. Mein BIOS vom Server hat so eine Einstellung noch nicht. Das ist aber kein Grund aufzugeben. Um den Modus zu setzen, benötigt man das Programm ethtool. Dieses lässt sich unter Debian wie gewohnt installieren:

Source code

1
apt-get install ethtool


Wer zuvor das Bonding ausprobiert hat, wird sicherlich ethtool schon installiert haben. Der Nachteil bei dieser Methode ist, dass nach dem Neustart die Einstellungen verloren gehen. Macht aber nix, auch hier kann per Init-Sctipt der Modus g nach jedem Start des Servers gesetzt werden.

Zuerst muss überprüft werden, ob die Netzwerkkarte Wake-On-LAN unterstützt. Das Programm ethtool, kann die unterstützten Modi und den aktuellen Modus anzeigen:

Source code

1
ethtool eth0


Die Ausgabe könnte so aussehen:

Spoiler Spoiler

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Half 1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Half 1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: Unknown!
        Duplex: Unknown! (255)
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: Unknown
        Supports Wake-on: pg
        Wake-on: d
        Current message level: 0x000000ff (255)
        Link detected: no

Dieses Beispiel habe ich jetzt absichtlich genommen, um noch direkt zu zeigen, dass diese Netzwerkkarte nicht angeschlossen ist. Das sieht man bei Link detected. Diese Netzwerkkarte ist eine Intel Pro 1000 MT und unterstützt die Modi p und g. Der Modus p bedeutet, dass die Netzwerkkarte den PC bei Physikalischer Aktivität einschaltet. Da es sich um eine PCI-Erweiterungskarte handelt, muss man zusätzlich das Kabel für WOL anschließen. Ansonsten passiert überhaupt nichts, wenn man den PC mit dem Magic-Paket einschalten will. Da ich das Kabel nicht angeschlossen habe und die Netzwerkarte eh schon älter ist als das Motherboard, habe ich mich entschieden die Onboard-Variante zu verwenden. Dort muss nichts verkabelt werden und es funktioniert meist problemlos.


So setzt man den WOL-Modus für das Magic-Paket:

Source code

1
2
ethtool -s eth2 wol g
#passende Netzwerkkarte angeben! eth2 ist es in meinem Fall


Nachdem der Modus gesetzt worden ist, kontrollieren wir die Einstellung:

Source code

1
ethtool eth2 | grep Wake-on


Dann sollte diese Ausgabe erscheinen:

Source code

1
2
        Supports Wake-on: g
        Wake-on: g


Da die Netzwerkkarte nun im WOL-Modus versetzt ist, muss die MAC-Adresse notiert werden. Die Mac-Adresse lässt sich mit ifconfig anzeigen.

Source code

1
ifconfig eth2 | head -n1


Ausgabe:

Source code

1
eth2      Link encap:Ethernet  Hardware Adresse 00:13:d3:a3:86:1f


Nun den PC einmal mit poweroff ausschalten und warten, bis er heruntergefahren ist...
Danach dieses Tool installieren: http://sourceforge.net/projects/wol2/
Anmerkung: Bei mir funktioniert auf meinem Win7-System zur Zeit kein einziges WOL-Tool. Microsoft legt den Benutzern gern mal paar Steine in den Weg. Ich denke mal, dass die Firewall einen Strich durch die Rechnung zieht. Wenn ich später weiß woran es lag, werde ich den Artikel nochmal bearbeiten.

Unter Linux kann man sich das Tool wakeonlan installieren. Damit klappte bei mir der Test auch direkt.
Mit "apt-get install wakeonlan" lässt sich das Tool installieren.

So lässt sich mein System wieder Hochfahren:

Source code

1
wakeonlan 00:13:d3:a3:86:1f


Nachdem der Versuch erfolgreich verlief, wenn auch nur von einem Linux-Rechner aus, kann das Init-Script zum Setzen des WOL-Mouds erstellt werden.
Hier eine fertige Version:

Spoiler Spoiler

/etc/init.d/wol

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#! /bin/sh
### BEGIN INIT INFO
# Provides:          wakeonlan
# Required-Start:    $local_fs $all
# Required-Stop:
# Default-Start:     2 3
# Default-Stop:
# Short-Description: Start WOL
# Description:       Starts WOL on some interfaces
### END INIT INFO

NAME=wol
PATH=/bin:/usr/bin:/sbin:/usr/sbin
. /lib/lsb/init-functions

test -x /sbin/ethtool || exit 0

case "$1" in
  start)
        log_begin_msg "Aktiviere Wake-On-LAN auf eth0"
        ethtool -s eth0 wol g
        # BITTE DAS RICHTIGE INTERFACE ANGEBEN
        # Ich setze in einem Zug meine 3 NICs auf den WOL-Modus g
        # ethtool -s eth1 wol g
        # ethtool -s eth2 wol g
        log_end_msg $?
        ;;
  stop|restart|force-reload)
        # No-op
        ;;
  *)
        echo "Usage: $NAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

:


Das Script ausführbar machen und zum Runlevel hinzufügen:

Source code

1
2
3
chmod u+x /etc/init.d/wol
update-rc.d wol defaults
#die Fehlermeldung kann ignoriert werden


Dann das Script einmal ausführen und dann das System wieder herunterfahren:

Source code

1
2
/etc/init.d/wol start
poweroff


Dann den PC wieder mit dem Tool hochfahren und dann nochmals mit poweroff ausschalten. Sollte sich der PC danach wieder aufwecken lassen ist alles in Ordnung und man muss sich nicht viel bewegen, wenn man den Server zwischendurch mal doch braucht.

WOL über das Internet
Sofern der Router das unterstützt, kann man den Server auch über das Internet hochfahren. Der Router muss UDP auf Port 9 an das lokale Netzwerk weiterleiten (Portforwarding oder auch fälschlicherweise Portweiterleitung). Handelt es sich z.B. um das Netzwerk 192.168.0.0, muss die Broadcast-Adresse angegeben werden. In einem Klasse-C-Netz ist das IP 192.168.0.255. Mehr Infos bekommt man hier: http://stephan.mestrona.net/wol/hilfe.php

Bei dem gleichen Dienstleister kann man auch über seine Seite das Magic-Paket versenden. Dazu muss man die öffentliche IP und die MAC-Adresse wissen. Da die meisten Provider alle 24 Stunden eine neue IP zuweisen, ist es recht nützlich sich bei einem Dyndns-Dienst eine DNS zuweisen zu lassen. Viele Router unterstützen die Auffrischung der IP auch. Bei dem D-Link DI524 heißt das z.B. DDNS.

Quellen
Da ich selbst auch viel googlen musste, ist es fair, wenn ich hier in einem Zug alle Quellen nenne, die ich verwendet habe.
Unter anderem waren einige Quellen recht hilfreich. Besonders das vdr-wiki hat mir weitergeholfen. Unter anderem werden hier auch sehr detailiert die Eigenrarten mancher Mainboards beschrieben und wie man ggf. Probleme umgehen kann. Es werden dort unter anderem noch andere Lösungsansätze genannt, wenn es z.B. Probleme mit dem Setzen der Uhrzeit gibt. Manche Boards vergessen dadurch die Einstellung und es muss dann an der Config etwas geändert werden, damit hwclock die Uhrzeit vor dem Shutdown anders setzt.

ACPI-Wakeup


WOL

This article has been read 3,720 times.

Tags: ACPI, Aufwecken, Geld sparen, Magic Paket, Wakeup, WOL

Categories: Allgemein


Comments (1)

Blog navigation

Next article

VPN Passthrough über ein DI-524 mit Debian Squeeze

by DeaD_EyE (Friday, June 17th 2011, 11:43pm)

Previous article

Bonding-Test

by DeaD_EyE (Sunday, May 29th 2011, 5:37pm)