systemd-sleep
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 24.04 Noble Numbat
Ubuntu 22.04 Jammy Jellyfish
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,
ob der Bediener für diese Operation berechtigt ist oder sich über PolicyKit als Administrator[5] authentifizieren kann, und
ob für die gewünschte Operation eine Sperre besteht.
Wenn die Ausführung der Operation erlaubt ist, bereitet systemd-sleep das System auf den Schlafzustand vor und
startet die Skripte im Ordner /lib/systemd/system-sleep/.
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
undhibernate
. 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
undsuspend-then-hibernate
zunächst in Bereitschaft, wobei bei Bedarf später nach G1/S4 gewechselt werden kann. Beimhybrid-sleep
wird das Systemabbild sofort erstellt, aber vielleicht nie benötigt, beisuspend-then-hibernate
wird der Rechner nach einer Wartezeit wieder aufgeweckt und dannhibernate
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
istpre
vor dem Schlaf oderpost
nach dem Wecken.$2
istsuspend
,hibernate
,hybrid-sleep
odersyspend-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:
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.
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.
Links¶
Anhang (Konfigurationsdatei für systemd-sleep mit Anleitung)
00-UU-default.conf ⮷ – direkter Download
Interne Verweise
Externe Artikel
System Sleep States 🇬🇧 in der Kernel Dokumentation