Hi,
es gibt die Möglichkeit den Rechner zeitgesteuerte zu Starten. Normalerweise kann man relativ einfach dem Bios per ACPI eine Zeit übergeben, zu dem der Rechner automatisch eingeschaltet werden soll. Das ganze funktioniert leider nicht mit jedem Bios problemlos.
Zusätzlich kann man bei vielen Systemen noch manuell im Bios eine feste Zeit einstellen, zu der der Rechner eingeschaltet werden soll. Wenn diese Funktion zur Verfügung steht, funktioniert sie eigentlich auch problemlos. Da man die Aufweckzeit vom Betriebssystem aus nicht verändern kann, verstellt man einfach die Bios-Uhr, damit der Rechner zur richtigen Zeit startet.
Da das verstellen der Uhrzeit im Laufenden Betrieb einige unschöne Effekte mit sich bringt, habe ich einen kleinen Script für das initrd geschrieben, der die Uhrzeit zurückstellt und den Rechner ausschaltet, bzw. die Uhrzeit vor dem Einhängen der Dateisysteme wieder nach vorne korrigiert.
Die Installation sieht folgendermaßen aus:
/etc/default/grub: Die Zeile
1 | GRUB_CMDLINE_LINUX="" |
muss folgendermaßen geändert werden:
1 | GRUB_CMDLINE_LINUX="\$timediff" |
Das dient zur Übergabe des Zeit-Offsets an den Kernel.
/etc/rc.local: Der folgende Befehl muss vor exit 0 eingefügt werden:
1 | grub-editenv /boot/grub/grubenv unset timediff |
Das dient dazu, dass die Bios-Uhr beim nächsten Start nicht wieder zurückgesetzt wird.
/etc/initramfs-tools/scripts/local-top/clock.sh: Der folgende Code muss in die neu erstellte Datei eingefügt werden:
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 | #!/bin/sh case $1 in prereqs) exit 0 ;; esac for x in $(cat /proc/cmdline); do case $x in timediff=*) diff=${x#timediff=} if [ "`date +%s`" -ge "`date -d "2010-01-01 00:00:00" +%s`" ]; then # Uhrzeit um $diff zurückstellen date -s "+$diff seconds ago" hwclock -w --noadjfile --utc poweroff else # Uhrzeit um $diff vorstellen date -s "+$diff seconds" hwclock -w --noadjfile --utc fi ;; esac done |
Danach muss die Datei noch ausführbar gemacht und der das initrd aktualisiert werden:
1 2 | chmod +x /etc/initramfs-tools/scripts/local-top/clock.sh update-initramfs -u |
beliebige Datei: Der Script zum Einstellen der Weckzeit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash ##### Wakeup=`date -d "$1" +%s` Time=`date +%s` BiosWakeup=`date -u -d "2006-01-01 00:00:00" +%s` BiosTime=`date -u +%s` ##### let Diff=$Wakeup-$Time # Sekunden bis zur Startzeit let NewBiosTime=$BiosWakeup-$Diff # Neue Zeit für Bios-Uhr let BiosDiff=$BiosTime-$NewBiosTime # Differenz um die, die Bios-Uhr verstellt werden soll grub-editenv /boot/grub/grubenv set timediff="timediff=$BiosDiff" |
Der obere Bereich muss an die eigenen Bedürfnisse angepasst werden, jenachdem im welchen Format die Weckzeit an das Script übergeben werden soll und in welcher Zeitzone sich die Bios-Uhr befindet. Für MythTV mit Bios-Uhr in UTC, müsste es z.B. folgendermaßen aussehen:
1 2 3 4 | Wakeup=$1 Time=`date -u +%s` BiosWakeup=`date -u -d "2006-01-01 00:00:00" +%s` BiosTime=`date -u +%s` |
Einstellungen im Bios: Die Weckzeit muss auf die Uhrzeit in der Variable BiosWakeup eingestellt werden, in diesem Fall auf den 01.01.2006 und 00:00:00 Uhr. Unter Umständen kann man die Weckzeit nicht so genau angeben.
Verwendung: Zuerst stellt man mit Hilfe des Scripts eine beliebige Weckzeit ein und startet den Rechner dann neu. Nachdem mit Hilfe des Scripts in der initrd die Uhrzeit zurückgestellt wurde, schaltet sich der Rechner automatisch ab. Alternativ kann man die Uhrzeit über eine kleine Ergänzung im Script auch direkt zurückstellen, dann erspart man sich den Neustart.
Ich habe das ganze für meinen MythTv-Rechner gebastelt, vielleicht kann ja irgendjemand etwas damit anfangen.