[[Vorlage(Getestet, noble, jammy)]] {{{#!vorlage Wissen [:systemd:] {Übersicht} [:Schlafender Rechner:] {Übersicht} [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:erweiterte Rechte] [:Administrator:] }}} Dieser Artikel konkretisiert die Übersicht „Schlafender Rechner“[2] und ergänzt die Artikel [:Bereitschaft:] und [:Ruhezustand:] um technische Hintergründe und Details. [[Inhaltsverzeichnis()]] 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 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 1. ob für die gewünschte Operation eine [#Einschlafen-verhindern Sperre] besteht. 1. Wenn die Ausführung der Operation erlaubt ist, bereitet systemd-sleep das System auf den Schlafzustand vor und 1. startet die [#Skripte Skripte] im Ordner '''/lib/systemd/system-sleep/'''. 1. Danach schreibt das Programm die Werte lt. seiner [#Konfiguration 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] [[Vorlage(Befehl, "systemctl suspend" ) ]] vorgesehen. In welchem der möglichen Schlafzustände man landet, kann über [#Konfiguration Konfigurationsdateien] bestimmt werden. * Für den Übergang in den Ruhezustand ist der Befehl[3][4] [[Vorlage(Befehl, "systemctl hibernate" ) ]] gedacht. Im Gegensatz zu `suspend` ist dieser Befehl aber bei Ubuntu einem Administrator[5] vorbehalten. (Siehe [#Ruhezustand-ohne-Passwort hier] für Abänderung.) * Es gibt zusätzlich noch zwei [#Besser-Schlafen 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: \\ {{{#!vorlage Befehl 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 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 [#Links 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 `hybrid-sleep`] und [#suspend-then-hibernate `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 [#Links Inhibitor-Lock] gesetzt werden. Die Sperren listet dieser Befehl: {{{#!vorlage Befehl systemd-inhibit --list }}} Mit dem Programm [:systemd/systemd-inhibit: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 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 [:Manpage:Manpages]: {{{#!vorlage Befehl man systemd-sleep man systemd-sleep.conf }}} {{{#!vorlage Tabelle Tabelle 1: Einstellungen für systemd-sleep +++ Schlüsselwort Wert Wirkung +++ <-2(>[Sleep] In jeder Datei muss einmal diese Kapitelüberschrift stehen. Davor sind nur mit `#` beginnende Kommentarzeilen zulässig. +++ SuspendState freeze [[BR]] standby [[BR]] 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 [[BR]] 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. +++ <-3:>Einstellungen für `systemctl suspend` +++ <|2>AllowSuspend no `systemctl suspend` deaktiviert. [[BR]] `systemctl hybrid-sleep` deaktiviert. [[BR]] `systemctl suspend-then-hibernate` deaktiviert. +++ yes `systemctl suspend` aktiviert. +++ <-3:>Einstellungen für `systemctl hibernate` +++ <|2>AllowHibernation no `systemctl hibernate` deaktiviert. [[BR]] `systemctl hybrid-sleep` deaktiviert. [[BR]] `systemctl suspend-then-hibernate` deaktiviert. +++ yes `systemctl hibernate` aktiviert. +++ <-3:>Einstellungen für `systemctl hybrid-sleep` +++ <|2>AllowHybridSleep no `systemctl hybrid-sleep` deaktiviert. +++ yes `systemctl hybrid-sleep` aktiviert. +++ <-3:>Einstellungen für `systemctl suspend-then-hibernate` +++ <|2>AllowSuspendThenHibernate no `systemctl suspend-then-hibernate` deaktiviert. +++ yes `systemctl suspend-then-hibernate` aktiviert. +++ HibernateDelaySec <|2> natürliche Zahl <|2>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: {{{#!vorlage Befehl 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 [#Links 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-[[BR]]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 [[BR]]Energieversorgung ausfällt oder [[BR]]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[[BR]]nein || <:>ja || Ab Ubuntu [:24.04:] wacht das System nach einer [#Wartezeit 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[[BR]]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.|| [[Anker(Wartezeit) ]] 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 [:rtcwake: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: [[Vorlage(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: [[Vorlage(Befehl, "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 [#Konfiguration 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 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]: [[Vorlage(Befehl, "pkcheck --action-id org.freedesktop.login1.suspend -p $$ ; echo $?" ) ]] muss das Ergebnis `0` liefern. 1. Für Ruhezustand (hibernate): * In der [#Konfiguration 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]: [[Vorlage(Befehl, "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) [[Anhänge(systemd-sleep, 1 ) ]] * [[Anhang(00-UU-default.conf) ]] {dl} – direkter Download Interne Verweise * [:Schlafender Rechner:] {Übersicht} * [:Bereitschaft:] * [:Ruhezustand:] * [:Herunterfahren:] * [:rtcwake:] Externe Artikel * [https://docs.kernel.org/admin-guide/pm/sleep-states.html System Sleep States] {en} in der Kernel Dokumentation * [wikipedia:Advanced_Configuration_and_Power_Interface#Ruhezustände_(Sleep-States):ACPI Schlafzustände] #tag: Hardware, System, Bereitschaft, Ruhezustand, Suspend, Hibernate