systemd-sleep

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ systemd

  2. ⚓︎ Schlafender Rechner

  3. ⚓︎ Ein Terminal öffnen

  4. ⚓︎ erweiterte Rechte

  5. ⚓︎ Administrator

Dieser Artikel konkretisiert die Übersicht „Schlafender Rechner“[2] und ergänzt die Artikel Bereitschaft und Ruhezustand um technische Hintergründe und Details.

Inhaltsverzeichnis
  1. Überblick
  2. Ablauf
    1. Aufruf
    2. Einschlafen verhindern
    3. Skripte
    4. Resume
  3. Konfiguration
  4. Besser Schlafen
    1. suspend-then-hibernate
    2. hybrid-sleep
  5. Problemlösungen
    1. Diagnose
    2. Ruhezustand ohne Passwort
  6. Links

Das Subsystem systemd-sleep des Init-Systems[1] ist zuständig für Wechsel des Systems aus dem Arbeitszustand in einen Schlafzustand[2]. Bei einem solchen Wechsel wird im Prozess mit PID 1 das sonst laufende systemd[1] durch systemd-sleep ersetzt.

Überblick

Das Subsystem besteht bei Ubuntu aus

Das Programm verhält sich unterschiedlich, je nachdem, welcher Aufrufname verwendet wird.

Ablauf

Nach einem Aufruf von systemd-sleep wird geprüft,

  1. ob der Bediener für diese Operation berechtigt ist oder sich über PolicyKit als Administrator[5] authentifizieren kann, und

  2. ob für die gewünschte Operation eine Sperre besteht.

  3. Wenn die Ausführung der Operation erlaubt ist, bereitet systemd-sleep das System auf den Schlafzustand vor und

  4. startet die Skripte im Ordner /lib/systemd/system-sleep/.

  5. Danach schreibt das Programm die Werte lt. seiner Konfiguration in Dateien des Kernel-ACPI-API im Ordner /sys/power/ und löst damit den Zustandswechsel aus.

Aufruf

Man sollte dieses Programm weder direkt aufrufen noch die o.g. Systemd-Service-Units selber starten und auch nicht die für diese Units vorgesehenen gleichnamigen Systemd-Targets setzen, sondern die von systemd[1] vorgesehenen Zustandswechsel mit dem Dienstprogramm systemctl auslösen. Das kann erfolgen durch Betätigung von Bedienelementen der GUI (siehe Artikel Bereitschaft und Ruhezustand) oder durch die hier anschließend beschriebenen Befehle auf einer Kommandozeile:

Sofern man die Konfiguration von systemd-sleep nicht allzu wild ändert, landet man

Einschlafen verhindern

Bevor jedoch der Schlafzustand ausgelöst wird, prüft das Programm, ob es Gründe gibt, das Einschlafen zu verzögern oder zu blockieren. Beispielsweise kann vor Beginn einer umfangreichen Berechnung oder beim Abspielen von Medien oder aus anderen Gründen, wenn ein Einschlafen des Systems unerwünscht ist, ein Inhibitor-Lock gesetzt werden. Die Sperren listet dieser Befehl:

systemd-inhibit --list 

Mit dem Programm systemd-inhibit oder über eine D-Bus-Nachricht (dbus) kann man auch Sperren setzen.

Skripte

Unmittelbar bevor systemd-sleep den Zustandswechsel auslöst, werden noch Skripte im Ordner /lib/systemd/system-sleep/ ausgeführt. Diese Skripte werden ebenso beim Erwachen aus einem Schlafzustand ausgeführt und erhalten jeweils zwei Argumente als Aufrufparameter:

Ein solches Skript kann beispielsweise Treiber entladen/neu laden (was aber systemd-sleep eigentlich machen sollte) oder etwas ins Systemlog schreiben:

#! /bin/sh
# (c) 2021, 2025 kB @ ubuntuusers.de
# SPDX-License-Identifier: GLWTPL
# https://spdx.org/licenses/GLWTPL.html

exec 0<&-
case $1 in (pre)	echo "‾‾‾‾‾‾‾‾‾‾‾‾‾‾ $INVOCATION_ID ‾‾‾" ; esac
echo "${0##*/}: $*, SYSTEMD_SLEEP_ACTION=«$SYSTEMD_SLEEP_ACTION»"
case $1 in (post)	echo "___ $INVOCATION_ID ______________" ; esac

Resume

Aus dem Schlaf erwacht der Rechner wieder durch einen Bedieneingriff wie Aufklappen des Laptops oder Drücken des Einschalttasters und es wir schließlich wieder dieselbe Instanz von systemd-sleep wie beim Einschlafen gestartet. Die Skripte werden erneut gestartet, und alle Prozesse mit allen Fenstern werden wieder hergestellt.

Konfiguration

Letztendlich benutzt systemd-sleep das Kernel-ACPI-API im Verzeichnis /sys/power/. Was es genau dem Kernel sagt, kann man in seinen Konfigurationsdateien nachlesen und auch selbst definieren:

/etc/systemd/sleep.conf Die Hauptkonfigurationsdatei dokumentiert die Vorgabewerte in Kommentaren; diese werden wirksam, wenn man für die jeweilige Einstellung selber nichts definiert. Man kann in dieser Datei eigene Angaben eintragen, sollte aber besser dafür eine der folgenden Dateien verwenden.
/usr/lib/systemd/sleep.conf.d/*.conf Vorgesehen für Änderungen seitens der Distribution.
/run/systemd/sleep.conf.d/*.conf Vorgesehen für Änderungen durch Systemprozesse. Dateien werden beim nächsten Boot gelöscht.
/etc/systemd/sleep.conf.d/*.conf Dieses Verzeichnis muss ggf. selbst angelegt werden und ist vorgesehen für den Administrator[5] des Systems.

Die Dateien sind Textdateien im INI-Format und werden in der gezeigten Reihenfolge ausgewertet; dabei überschreiben spätere Einstellungen frühere Werte, wenn nur ein Wert möglich ist, bzw. erweitern diese, wenn für die jeweilige Option eine Liste zulässig ist. Im Gegensatz zu anderen Programmen maskieren sich gleichnamige Dateien aber nicht. Zur Sicherstellung einer bestimmten Ausführungsreihenfolge verwende man Dateinamen, welche mit zwei Ziffern beginnen. Für Details lese man die Manpages:

man systemd-sleep
man systemd-sleep.conf 
Tabelle 1: Einstellungen für systemd-sleep
Schlüsselwort Wert Wirkung
[Sleep] In jeder Datei muss einmal diese Kapitelüberschrift stehen. Davor sind nur mit # beginnende Kommentarzeilen zulässig.
SuspendState freeze
standby
mem
In dieser Liste ist jede Kombination in jeder Reihenfolge der genannten Werte zulässig. Die Schlüsselworte werden einzeln in der definierten Reihenfolge in die Datei /sys/power/state geschrieben, um einen Zustandswechsel auszulösen bis eines funktioniert. Diese Einstellung gilt für die drei Befehlsworte, welche den Schlafmodus Bereitschaft anfordern.
HibernateMode platform
shutdown
In dieser Liste ist jede Kombination in jeder Reihenfolge der genannten Werte zulässig. Die Schlüsselworte werden einzeln in der definierten Reihenfolge in die Datei /sys/power/disk geschrieben, um eine Methode für den Übergang in Suspend-to-Disk auszuwählen bis eines funktioniert. Diese Einstellung gilt für die drei Befehlsworte, welche den Schlafmodus Ruhezustand anfordern.
Einstellungen für systemctl suspend
AllowSuspend no systemctl suspend deaktiviert.
systemctl hybrid-sleep deaktiviert.
systemctl suspend-then-hibernate deaktiviert.
yes systemctl suspend aktiviert.
Einstellungen für systemctl hibernate
AllowHibernation no systemctl hibernate deaktiviert.
systemctl hybrid-sleep deaktiviert.
systemctl suspend-then-hibernate deaktiviert.
yes systemctl hibernate aktiviert.
Einstellungen für systemctl hybrid-sleep
AllowHybridSleep no systemctl hybrid-sleep deaktiviert.
yes systemctl hybrid-sleep aktiviert.
Einstellungen für systemctl suspend-then-hibernate
AllowSuspendThenHibernate no systemctl suspend-then-hibernate deaktiviert.
yes systemctl suspend-then-hibernate aktiviert.
HibernateDelaySec natürliche Zahl Diese beiden Parameter steuern das Zeitverhalten für den Übergang aus Bereitschaft nach Ruhezustand. Zulässig ist jeweils eine positive ganze Zahl (dann als Sekunden verstanden) oder eine solche mit angehängter Maßeinheit s für Sekunden, min für Minuten oder h für Stunden.
SuspendEstimationSec

Die Tabelle 1 entspricht dem Stand ab Ubuntu 24.04 mit systemd Version 255. Bei früheren Versionen von Ubuntu mit früheren Versionen von systemd[1] gab es noch einige weitere Schlüsselworte (SuspendMode, HibernateState, HybridSleepMode, HybridSleepState), diese werden nun mit Fehlermeldung ignoriert und sollen nicht mehr verwendet werden.

Einen Überblick über alle Konfigurationen erhält man mit diesen Befehlen:

systemd-analyze cat-config systemd/sleep.conf
systemd-analyze cat-config systemd/sleep.conf | grep -v -e ^# -e ^$ -e ]   # ohne Kommentare 

Praxistaugliche Beispiele für Konfigurationsdateien findet man im Anhang dieses Artikels.

Besser Schlafen

Die beiden Grundmethoden suspend und hibernate haben unterschiedliches Zeitverhalten und unterschiedliches Risiko in Bezug auf Datenverlust. Die Kombinationen hybrid-sleep und suspend-then-hibernate streben an, die negativen Eigenschaften der beiden Grundmethoden abzumildern:

Tabelle 2: Eigenschaften
Befehlswort Einschlafen Aufwachen Risiko Datenverlust Energie-
verbrauch
hibernate lahm lahm nein 0
hybrid-sleep lahm meistens schnell nein ja, wie bei suspend
suspend-then-hibernate ab 24.04 schnell meistens schnell nein ja, wie bei suspend
suspend-then-hibernate vor 24.04 schnell meistens lahm nein fast 0
suspend schnell schnell Ja, wenn während des Schlafes
Energieversorgung ausfällt oder
Akku vollständig entleert wird.
ja

Ein Vorgang gilt als lahm, wenn er Lebenszeit des Bedieners bindet und dies ist immer der Fall, wenn ein Speicherabbild für den Ruhezustand erzeugt werden muss, ausgenommen beim Befehlswort suspend-then-hibernate. Nur bei diesem wird das für die Datensicherheit erforderliche Speicherabbild erst während des Schlafes erstellt, also zu einer Zeit, in der der Bediener den Rechner nicht benutzen will.

Die Angabe „meistens“ schnell bedeutet, dass beim hybrid-sleep meistens das erzeugte Speicherabbild erst benutzt wird, nachdem der Akku vollständig entleert wurde.

Dagegen kann man beim Befehlswort suspend-then-hibernate über die Variable HibernateDelaySec selbst steuern:

suspend-then-hibernate

Diese Methode arbeitet unterschiedlich, je nachdem, ob der Rechner an einem externen Stromnetz angeschlossen ist oder nicht und über einen internen Akku verfügt. Das Verhalten hinsichtlich des Energieverbrauchs bzw. Leerung des Akkus unterscheidet sich bei Ubuntu Versionen vor und ab 24.04:

Tabelle 3: Verhalten von suspend-then-hibernate
extern intern Verhalten
ja
nein
ja Ab Ubuntu 24.04 wacht das System nach einer Wartezeit (s.u.) aus der Bereitschaft auf und prüft den Ladezustand des Akkus. Wenn dieser (nicht einstellbar) 5% unterschreitet, wird ein Speicherabbild erzeugt und gespeichert, sowie der Rechner ausgeschaltet; im anderen Fall wird eine neue Wartezeit berechnet und das System verbleibt in der Bereitschaft.
ja
nein
ja Bei Ubuntu 22.04 und früheren Versionen wacht das System nach HibernateDelaySec (Vorgabe: 3h) aus der Bereitschaft auf, erzeugt ein Speicherabbild, speichert dieses und schaltet den Rechner aus.
ja nein Das System wacht aus der Bereitschaft auf nach HibernateDelaySec (Vorgabe: 2h), erzeugt ein Speicherabbild, speichert dieses und schaltet den Rechner aus.

⚓︎ Die Wartezeit entspricht HibernateDelaySec, sofern ein Wert gesetzt ist; im anderen Fall wird entweder gewartet, bis vom Akku ein Ereignis ACPI _BTP (low-battery alarm) gemeldet wird, sofern die Hardware das beherrscht, oder es wird ein regulärer Wecker in der Firmware gestellt oder es wird der Wert von SuspendEstimationSec (Vorgabe 1h) verwendet. Im Ergebnis verhält sich ab 24.04 das System nun drastisch unterschiedlich zu früheren Versionen:

Energieverbrauch von suspend-then-hibernate:

hybrid-sleep

Es wird vorsorglich ein Speicherabbild erzeugt und gespeichert, daher ist das Einschlafen genauso lahm wie beim Befehlswort hibernate. Danach schläft das System wie beim Befehlswort suspend ein, verbraucht weiter Energie und entleert den Akku ggf. hemmungslos bis zur Tiefentladung. Damit ist aber im Gegensatz zum reinen suspend kein Datenverlust verbunden. Beim Aufwecken erfolgt entweder, wenn es noch einen im RAM gespeicherten Altzustand gibt, ein schnelles Erwachen wie bei suspend, oder eine lang dauernde Restaurierung aus dem auf dem Massenspeicher abgelegten Speicherabbild wie bei hibernate.

Problemlösungen

Diagnose

Einschlafen und Aufwachen kann man im Systemlog nachvollziehen. Eine hierfür zweckmäßige Filterung liefert dieser Befehl:

journalctl -b | grep -e systemd-sleep -e PM: 

Vorstehendes gilt, sofern der Rechner problemlos aufwacht. Wenn man allerdings statt Erwachen einen neuen Bootvorgang durchführen musste, stehen die Meldungen zum Einschlafen im Systemlog des vorherigen statt des aktuellen Systemstarts und können so abgefragt werden:

journalctl -b -1 | grep -e systemd-sleep -e PM: 

Ruhezustand ohne Passwort

Manche Desktops (z.B. Gnome) blenden die Worte Ruhezustand bzw. Bereitschaft aus oder stellen sie grau für „nicht auswählbar“ dar, wenn die entsprechenden Vorgänge hibernate bzw. suspend durch den Benutzer nicht ausführbar sind. Dies betrifft sowohl Bedienelemente wie auch Auswahlmöglichkeiten z.B. für den Ein-/Austaster.

Der Grund für die fehlende Ausführbarkeit kann sowohl eine explizite Sperre in einer Konfigurationsdatei für systemd-sleep sein oder von PolicyKit verweigerte Berechtigungen. Im Standard trifft letzter Fall z.B. für hibernate zu, welches bei Ubuntu über diesen Mechanismus deaktiviert ist und nur für einen Administrator[5] nach Authentifizierung freigegeben wird.

Vielfach besteht insbesondere für Arbeitsstationen, die nur einem Benutzer persönlich zugeordnet sind, der Wunsch, Schlafzustände ohne Mausklickorgien und ohne Passworteingabe benutzen zu können. Hierfür sind diese Voraussetzungen erforderlich:

  1. Für Bereitschaft (suspend):

    • In der Konfiguration für systemd-sleep muss die Einstellung AllowSuspend=yes wirksam sein.

    • PolicyKit muss es erlauben; Test auf der Kommandozeile[3] ohne erweiterte Rechte[4]:

      pkcheck --action-id org.freedesktop.login1.suspend -p $$ ; echo $? 

      muss das Ergebnis 0 liefern.

  2. Für Ruhezustand (hibernate):

    • In der Konfiguration für systemd-sleep muss die Einstellung AllowHibernation=yes wirksam sein.

    • PolicyKit muss es erlauben; Test auf der Kommandozeile[3] ohne erweiterte Rechte[4]:

      pkcheck --action-id org.freedesktop.login1.hibernate -p $$ ; echo $? 

      muss das Ergebnis 0 liefern. Im Auslieferungszustand von Ubuntu ist das nicht der Fall.

Wenn der Befehl mit pkcheck eine Sperre der Aktion vermeldet, muss man zur Abhilfe eine Regel für Policykit erstellen und dabei sorgfältig vermeiden, die Absicherung seines Systems zu beschädigen oder gar zu vernichten. Siehe Artikel PolicyKit und dort verlinktes Howto für konkretes Vorgehen.

Wenn die Voraussetzungen erfüllt sind, erscheinen im Systemmenü oben rechts unter den Ausschaltmöglichkeiten die Bereitschaft und (leider nur manchmal, offenbar gibt es noch eine weitere unbekannte Bedingung) der Ruhezustand als Bedienelemente und man kann dann auch in den Einstellungen für Energie dem Einschaltknopf diese Wirkungen zuordnen.

Anhang (Konfigurationsdatei für systemd-sleep mit Anleitung)

Interne Verweise

Externe Artikel