staging.inyokaproject.org

Für diese Funktion musst du eingeloggt sein.

Zeitgesteuertes Starten mit verbuggtem Bios

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

g123

Avatar von g123

Anmeldungsdatum:
5. November 2007

Beiträge: 490

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.

Antworten |