Debian - ACPI Wakeup mit sysvinit oder systemd

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Installation)
K
 
(4 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt)
Zeile 4: Zeile 4:
 
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.
 
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.
 
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.
+
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. Mehr dazu hier im VDR-Wiki [[ACPI_Wakeup]].
  
 
== Installation ==
 
== Installation ==
Zeile 10: Zeile 10:
 
  apt-get install util-linux
 
  apt-get install util-linux
  
 
+
=== VDR Shutdown Script ===
 
* shutdownhook in '''/usr/share/vdr/shutdown-hooks/S95.acpi-shutdown.sh''' erstellen
 
* shutdownhook in '''/usr/share/vdr/shutdown-hooks/S95.acpi-shutdown.sh''' erstellen
  
Zeile 30: Zeile 30:
  
 
# Defaults:
 
# Defaults:
[ -z "$ACPI_ENABLED" ]      && export ACPI_ENABLED="yes"
 
 
[ -z "$ACPI_REGULAR_TIME" ]  && export ACPI_REGULAR_TIME="00:00"
 
[ -z "$ACPI_REGULAR_TIME" ]  && export ACPI_REGULAR_TIME="00:00"
 
[ -z "$ACPI_START_AHEAD" ]  && export ACPI_START_AHEAD="300"
 
[ -z "$ACPI_START_AHEAD" ]  && export ACPI_START_AHEAD="300"
Zeile 60: Zeile 59:
 
}}
 
}}
  
 +
=== Shutdownscript Debian mit sysvinit ===
 
* Für Distributionen mit sysvinit (bis Debian wheezy) muss ein entsprechendes Initscript in '''/etc/init.d/''' erstellt werden
 
* Für Distributionen mit sysvinit (bis Debian wheezy) muss ein entsprechendes Initscript in '''/etc/init.d/''' erstellt werden
  
Zeile 137: Zeile 137:
 
  update-rc.d vdr-acpi-rtcwakeup.sh defaults
 
  update-rc.d vdr-acpi-rtcwakeup.sh defaults
  
''Fortsetzung folgt...''
+
 
 +
=== Shutdownscript Debian mit systemd ===
 +
* 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.)
 +
 
 +
{{Box Datei|acpi-rtcwakeup.service|<pre>
 +
[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
 +
 
 +
</pre>
 +
}}
 +
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 den Service aktivieren mit:
 +
systemctl enable /lib/systemd/system/acpi-rtcwakeup.service
 +
 
 +
Den Service starten mit:
 +
systemctl start acpi-rtcwakeup.service
 +
 
 +
Den Status des Service kann man hiermit überprüfen:
 +
systemctl status acpi-rtcwakeup.service
 +
 
 +
=== Test ===
 +
* 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)
 +
 
 +
 
 +
[[Kategorie:Debian]]
 +
[[Kategorie:Wakeup]]

Aktuelle Version vom 5. Juli 2015, 20:55 Uhr

Inhaltsverzeichnis

[Bearbeiten] 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. Mehr dazu hier im VDR-Wiki ACPI_Wakeup.

[Bearbeiten] Installation

apt-get install util-linux

[Bearbeiten] VDR Shutdown Script

  • shutdownhook in /usr/share/vdr/shutdown-hooks/S95.acpi-shutdown.sh erstellen

Schreibt die Aufwachzeit in die Datei /var/cache/vdr/acpiwakeup.time

Datei
S95.acpi-shutdown.sh
#!/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
Datei
vdr-acpi-rtcwakeup.sh
# 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


[Bearbeiten] Shutdownscript Debian mit sysvinit

  • Für Distributionen mit sysvinit (bis Debian wheezy) muss ein entsprechendes Initscript in /etc/init.d/ erstellt werden
Datei
vdr-acpi-rtcwakeup.sh
#! /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


[Bearbeiten] Shutdownscript Debian mit systemd

  • 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.)
Datei
acpi-rtcwakeup.service
[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 den Service aktivieren mit:

systemctl enable /lib/systemd/system/acpi-rtcwakeup.service

Den Service starten mit:

systemctl start acpi-rtcwakeup.service

Den Status des Service kann man hiermit überprüfen:

systemctl status acpi-rtcwakeup.service

[Bearbeiten] Test

  • 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)