Debian - ACPI Wakeup mit sysvinit oder systemd
Voraussetzungen
Bei Debian basierten VDR-Installationen kann das Shutdownscript von VDR nicht direkt auf die RTC zugreifen. Dies lässt sich durch ein zusätzliches Shutdownscript in den Start- Stopmechanismen von Debian sysvinit (bis wheezy) oder systemd (ab jessie) bewerkstelligen. Für die nachfolgenden scripte wird ein ACPI-fähiges Mainboard und rtcwake (in util-linux enthalten) benötigt. Durch die Verwendung von rtcwake zum Setzen der Aufwachzeit in die RTC muss man (bis auf spezielle Fälle) nicht den Pfad zum Device beachten und braucht sich nicht um die verwendete Systemzeit (UTC, Lokale Zeit) kümmern.
Installation
apt-get install util-linux
- shutdownhook in /usr/share/vdr/shutdown-hooks/S95.acpi-shutdown.sh erstellen
Schreibt die Aufwachzeit in die Datei /var/cache/vdr/acpiwakeup.time
#!/bin/sh # $1 : Next timer seconds from 1970 from 1970/01/01, UTC # $2 : Next timer seconds from now # $3 : Next timer title # $4 : Shutdown forced # read from acpi-rtcwakeup conf file . /etc/vdr/vdr-acpi-acpirtcshutdown.conf WAKEUP_FILE="/var/cache/vdr/acpiwakeup.time" if [ ! -f "$WAKEUP_FILE" ] then touch $WAKEUP_FILE fi # Defaults: [ -z "$ACPI_REGULAR_TIME" ] && export ACPI_REGULAR_TIME="00:00" [ -z "$ACPI_START_AHEAD" ] && export ACPI_START_AHEAD="300" datefixplus=$(date +%s -d 'tomorrow '"$ACPI_REGULAR_TIME"' +1 day') if [ $1 -eq 0 ] || [ $datefixplus -lt $1 ]; then # wakeup time if next timer ahead > 24h to regular wakeup time date +%s -d 'tomorrow '"$ACPI_REGULAR_TIME"'' > $WAKEUP_FILE else # wakeup time for next timer echo $(($1 - $ACPI_START_AHEAD)) > $WAKEUP_FILE fi exit
- conf Datei anlegen in /etc/vdr/vdr-acpi-acpirtcshutdown.conf
# ACPI shutdown enabled ACPI_ENABLED=yes # How many seconds wakeup the machine before timer starts ACPI_START_AHEAD=300 # Start machine at regular time next day if next timer is more than 24 hours ahead ACPI_REGULAR_TIME=03:15 #HH:MM
- Für Distributionen mit sysvinit (bis Debian wheezy) muss ein entsprechendes Initscript in /etc/init.d/ erstellt werden
#! /bin/sh ### BEGIN INIT INFO # Provides: vdr-addon-acpiwakeup # Required-Start: $syslog # Required-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 # X-Stop-After: hwclock # Short-Description: Sets/resets the wakeuptime on shutdown/startup ### END INIT INFO NAME="vdr-acpi-rtcwakeup" WAKEUP_FILE="/var/cache/vdr/acpiwakeup.time" set_wakeup_time() { if [ -e $WAKEUP_FILE ]; then TIME_TO_SET=`cat $WAKEUP_FILE` echo "$NAME: Setting wakeup time to $TIME_TO_SET" rtcwake -m no -a -t $TIME_TO_SET fi } show_help() { N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 } load_configuration() { # read arguments for acpi-wakeup from conf-file . /etc/vdr/vdr-acpi-acpirtcshutdown.conf # Defaults: [ -z "$ACPI_ENABLED" ] && export ACPI_ENABLED="yes" } # # main() # load_configuration if [ ! $ACPI_ENABLED = "yes" ]; then echo "ACPI Wakeup disabled - doing nothing" exit 0 fi case "$1" in start) ;; stop|restart|force-reload) set_wakeup_time ;; status) ;; *) show_help ;; esac
Ausführbar machen:
chmod 755 /etc/init.d/vdr-acpi-rtcwakeup.sh
Aktivieren mit:
update-rc.d vdr-acpi-rtcwakeup.sh defaults
- Für systemd (ab Debian Jessie) muss eine Datei wie folgt in /lib/systemd/system/acpi-rtcwakeup.service angelegt werden. (Ob dies der korrekte Ort für ein eigenes Script ist, wäre zu diskutieren.)
[Unit] Description=write alarm time to rtc Before=ntp.service vdr.service ConditionPathExists=/sys/class/rtc [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/true ExecStop=/bin/bash -c 'TIME_TO_SET=$(</var/cache/vdr/acpiwakeup.time) ; /usr/sbin/rtcwake -m no -a -t $TIME_TO_SET' [Install] RequiredBy=vdr.service
Zu achten ist auf den Punkt "Before=ntp.service". Hier wurde der Service ntp gewählt. Dieser muss natürlich vorhanden sein. Ansonsten sollte man sich eine andere Referenz suchen vor - und damit vor allem nach welcher der Shutdownbefehl ausgeführt wird. Beim Shutdown gilt die umgekehrte Reihenfolge wie beim Start.
Userrechte sollten bei root liegen
Dann ein:
systemctl enable /lib/systemd/system/acpi-rtcwakeup.service
Den Service starten mit:
systemctl start acpi-rtcwakeup.service
- Nun kann man einen ersten Test durchführen
Eine Zeit in /var/cache/vdr/acpiwakeup.time in der Zukunft schreiben:
date +%s -d 'tomorrow 15:30' > /var/cache/vdr/acpiwakeup.time
Den Service stoppen (Nicht vergessen danach wieder zu starten):
systemctl stop acpi-rtcwakeup.service
root@server:# cat /proc/driver/rtc rtc_time : 20:17:28 rtc_date : 2015-03-04 alrm_time : 14:30:00 alrm_date : 2015-03-05 alarm_IRQ : yes alrm_pending : no
(Die Stunde zurück liegt daran dass die Systemzeit in UTC läuft)