ubuntuusers.de

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:

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

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

  • vier Systemd-Service-Units

    • systemd-suspend.service,

    • systemd-hibernate.service,

    • systemd-hybrid-sleep.service,

    • systemd-suspend-then-hibernate.service

  • und den entsprechenden Targets.

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:

  • Für einen Übergang in den Modus Bereitschaft (seichter Schlaf, Schlummern) ist der Befehl[3]

    systemctl suspend 

    vorgesehen. In welchem der möglichen Schlafzustände man landet, kann über Konfigurationsdateien bestimmt werden.

  • Für den Übergang in den Ruhezustand ist der Befehl[3][4]

    systemctl hibernate 

    gedacht. Im Gegensatz zu suspend ist dieser Befehl aber bei Ubuntu einem Administrator[5] vorbehalten. (Siehe hier für Abänderung.)

  • Es gibt zusätzlich noch zwei Kombinationen von suspend und hibernate. Diese können ebenfalls nur von einem Administrator benutzt werden. Man landet zunächst in einer Bereitschaft, aus der später ein Ruhezustand werden kann:

    systemctl hybrid-sleep           # erzeugt ein Abbild für den Ruhezustand und versetzt Rechner in Bereitschaft
    systemctl suspend-then-hibernate # versetzt Rechner in Bereitschaft und erst nach Wartezeit in den Ruhezustand 

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

  • mit dem Befehlswort suspend je nach Konfiguration in einem Zustand der Untätigkeit (idle) oder ACPI-Schlafzustand G1/S1 oder G1/S3, wobei der Systemzustand im Arbeitsspeicher aufbewahrt wird,

  • mit dem Befehlswort hibernate im Ruhezustand G1/S4 und dann G2/S5 oder G3, wobei der Systemzustand auf einem Datenspeicher aufbewahrt wird,

  • mit den Befehlsworten hybrid-sleep und suspend-then-hibernate zunächst in Bereitschaft, wobei bei Bedarf später nach G1/S4 gewechselt werden kann. Beim hybrid-sleep wird das Systemabbild sofort erstellt, aber vielleicht nie benötigt, bei suspend-then-hibernate wird der Rechner nach einer Wartezeit wieder aufgeweckt und dann hibernate ausgeführt. Zum Aufwecken benutzt die Software die auch beim ausgeschalteten Rechner dank Bios-Batterie weiterlaufende Uhr (RTC) als Wecker.

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:

  • $1 ist pre vor dem Schlaf oder post nach dem Wecken.

  • $2 ist suspend, hibernate, hybrid-sleep oder syspend-then-hibernate, je nachdem, wie systemd-sleep aufgerufen wurde.

  • Außerdem sind einige Umgebungsvariablen gesetzt:

    • JOURNAL_STREAM= (variiert)

    • PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

    • INVOCATION_ID= (variiert, aber identisch beim Einschlafen und darauf folgendem Aufwachen)

    • LANG=de_DE.UTF-8 (beispielsweise)

    • PWD=/

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:

  • Vor Ablauf der Zeitspanne wird der Rechner schnell aufwachen, aber den Akku leeren.

  • Erst danach wird das Speicherabbild erzeugt und gespeichert sowie der Rechner ausgeschaltet. Aufwachen wird lahm, aber der Akku nicht benutzt.

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:

  • Wenn kein Wert für HibernateDelaySec gesetzt ist, was nun der Vorgabe entspricht, erfolgt der Übergang in Hibernation zum spätest möglichen Zeitpunkt, wenn der Akku bis unter 5% entladen wurde.

  • Wenn man einen Wert für die Variable gesetzt hat, dann ist dies der späteste Zeitpunkt für den Übergang in Hibernation.

Energieverbrauch von suspend-then-hibernate:

  • Vor 24.04 verhält es sich im wesentlichen wie hibernate: Die Ladung des Akkus bleibt – abgesehen von der Anfangsphase – erhalten.

  • Ab 24.04 verhält es sich im wesentlichen wie suspend: Der Akku wird – abgesehen von der Endphase, wenn er fast leer ist – fortlaufend entleert.

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

Diese Revision wurde am 1. Juni 2025 09:15 von kB erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, Hardware, Suspend, Bereitschaft, Ruhezustand, Hibernate