Linux Mint Ruhezustand / Hibernation aktivieren

© Ehlertronic

Linux Mint 19 Tara (Ubuntu 18.04 Bionic), Linux Mint 19.1 Tessa (Ubuntu 18.04 Bionic), Linux Mint 19.2 Tina (Ubuntu 18.04 Bionic), Linux Mint 19.3 Tricia (Ubuntu 18.04 Bionic), Linux Mint 20 Ulyana (Ubuntu 20.04 Focal), Linux Mint 20.1 Ulyssa (Ubuntu 20.04 Focal), Linux Mint 20.2 Uma (Ubuntu 20.04 Focal), Linux Mint 20.3 Una (Ubuntu 20.04 Focal), Linux Mint 21 Vanessa (Ubuntu 22.04 Jammy), Linux Mint 21.1 Vera (Ubuntu 22.04 Jammy), Linux Mint 21.2 Victoria (Ubuntu 22.04 Jammy), Linux Mint 21.3 Virginia (Ubuntu 22.04 Jammy)


Wenn man bei der Installation die Grösse der Swap Partition etwas grösser als die Grösse seines im Rechner verbauten Haupspeichers angelegt hat, (RAM +10%) kann man evtl. sein System in den Ruhezustand versetzen. Das bedeutet der gesammt Ist-Zustand des Rechners, wird auf die Festplatte geschrieben und der Rechner wird ausgeschaltet. (Hibernation). Es wird kein Strom mehr verbraucht, der Rechner ist Aus.

Anders als beim Breitschafts Modus (Standby) bei dem der Prozessor herunter getaktet wird, und der Speicher und andere Komponenten noch mit Strom versorgt werden.

Der Vorteil ist ein schnelleres Starten des Rechners und man findet sein System so wieder vor, wie man es verlassen hat.

Wenn nach Rückkehr aus Ruhezustand / Bereitschaft nur ein schwarzer Bildschirm mit Maus Cursor erscheint, kann es möglich sein, durch die blinde Eingabe des System Passwortes, wieder auf den Desktop zu kommen.

Ebenso kann auch ein Voll-Level Update des Systems helfen. Siehe LinkUp to date

Auch ein Kernel update bringt häufig ein funktionierendes Bereitschaft und Ruhezustand. Siehe LinkKleine Tipps.
Sollte es weitere Probleme mit Bereitschaft / Ruhezustand geben, hilft oft ein BIOS / Firmware update des Rechners.


Unter Linux Mint ab 19.x (Tara, Tessa / Ubuntu 18.04) und folgende ist der Ruhezustand nicht immer aktiviert, da es leider Rechner gibt, bei denen es nicht funktioniert bzw. keine Swap Partition angelegt wurde.

Es muss eine eigene Swap Partition vorhanden sein. Mit der ab Linux Mint 19 (Tara) und folgende, automatisch angelegten Swapfile funktioniert es nicht und diese muss nach Erstellung einer Swap Partition aus der /etc/fstab entfernt werden.

Wie man eine Partition einfach in die fstab einbindet, findet sich unter LinkLaufwerks-Mount.

Um zu Testen ob sich die eigene Hardware in den Ruhezustand versetzen lässt, gibt man im Terminal ein

Unter Mint ab 18.x (Systemd)

 

systemctl hibernate


und startet nach dem automatischen abschalten des Rechners wieder neu. Wenn alles nach dem aufwachen funktioniert, kann man die Funktion in das System integrieren.

Dazu öffnet man den Ordner /etc/polkit-1/localauthority/ als Sytemverwalter / Admin und öffnet den Unterordner 50-local.d/
und legt eine Datei mit folgendem Namen an, falls sie noch nicht vorhanden ist.

com.ubuntu.enable-hibernate.pkla


Dort fügt man folgenden Code ein und speichert die Datei.

[Re-enable hibernate by default]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate
ResultActive=yes


Nach anschliessendem Reboot, sollte Ruhezustand (Hibernation) im Beenden Dialog auftauchen.


 

Sollte das System ab Linux Mint 19.x (Tara, Tessa / Ubuntu 18.04) und folgende nicht aufwachen (kein resume aus hibernate) und stattdessen wird neu gebootet, muss die Swap Partitions UUID in die Grub Startdatei /etc/default/grub gesetzt werden.

Um die UUID der Swap Partition zu ermitteln.

sudo blkid | grep swap


Diese UUID sollte auch in der /etc/fstab stehen.

cat /etc/fstab | grep swap


Die so gefundene UUID wird in die Datei /etc/default/grub gesetzt, indem die angegebene vorhandene Zeile erweitert wird.

das sollte z.B. so aussehen. Die UUID natürlich durch die eigene ersetzen ;-)

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

 

Anschliessend muss Grub noch neu geschrieben werden.

sudo update-grub


Ebenso sollte ab Linux Mint 19.x (Tara, Tessa / Ubuntu 18.04) und folgende, falls vorhanden, die nicht mehr benötigte resume datei entfernt werden. (Dies könnte auch den Start des Systems beschleunigen)

sudo rm /etc/initramfs-tools/conf.d/resume


Zu guter letzt noch ein

sudo update-initramfs -u -k all


Die Resume Partition wird dabei angezeigt, wenn die Eintragung in grub richtig gesetzt wurde.

und nach einem Reboot sollte der Ruhezustand wieder funktionieren. Ich habe es nun ein paar mal erlebt, dass es erst nach dem zweiten Versuch, und danach dauerhaft funktioniert.

 

Um Programm Aktionen bei Ruhezustand  (Hibernate) / Bereitschaft (Standby / Sleep) und Rückkehr (Resume) ab Linux Mint 18 (Sarah) / Ubuntu 16.04 mit systemd zu realisieren, findet in den Kleinen-Tipps ein LinkBeispiel .service Script.

Linux Mint Ruhezustand / Bereitschaft deaktivieren

Leider gibt es Hardware Konstellationen, bei denen Ruhezustand (Hibernate) oder Bereitschaft (Suspend) nicht richtig funktioniert.
Um diese Funktionen nun aus dem Beenden / Shutdown Menü zu entfernen, öffnet man wie oben beschrieben den Order

/etc/polkit-1/localauthority/50-local.d/ und bearbeitet die Datei com.ubuntu.enable-hibernate.pkla

Für Ruhezustand (Hibernation)
ändert man die Eintragung zu

[Re-enable hibernate by default]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=no

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate
ResultActive=no


und für Bereitschaft (Suspend / Standby)
in einer neuen Datei, die angelegt werden muss,

com.ubuntu.enable-suspend.pkla


folgendes einfügen

[Re-enable suspend by default]
Identity=unix-user:*
Action=org.freedesktop.upower.suspend
ResultActive=no
ResultInactive=no
ResultAny=no

[Re-enable suspend by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend
ResultActive=no

[Disable suspend for all sessions (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend-multiple-sessions
ResultActive=no


mit ResultActive=yes oder no kann man die Funktionen ein oder ausschalten.

Nach neuem Start des Rechners sollten die Funktionen nicht mehr im Beenden Menü auftauchen.

Aktionen bei Bereitschaft / Ruhezustand / aufwachen

Einen System Sleep / Resume Hook für Standby und Hibernate ist in den
Linkkleinen Tipps beschrieben.

Sleep-Hybrid / Suspend-Hibernate-Hybrid

Unter Linux Mint ab 18.x (ubuntu 16.04) und folgende mit Systemd, ist Sleep/Suspend-Hybrid to Hibernate möglich.

Wenn das System in Bereitschaft (Sleep/Standby) geschickt wird, wird es mit der folgenden Konfiguration nach einstellbarer Zeit in Ruhezustand (Hibernate) versetzt und der Rechner dann ganz ausgeschaltet.
Das Script kann auch so konfiguriert werden, dass die Umstellung auf Hibernate nicht im AC/Netz Betrieb, sondern nur per Akku/Batterie erfolgt.

Bereitschaft und Ruhezustand müssen einwandfrei funktionieren.

Um Sleep-Hybrid zu realisieren muss eine Systemd Service Unit angepasst und eine neu erstellt werden.

Zuerst wird eine neue Service Unit mit Namen es-suspend-to-hibernate.service im Ordner /lib/systemd/system/ angelegt.

sudo -H xed /lib/systemd/system/es-suspend-to-hibernate.service


in den nun mit Administrator Rechten geöffneten System-Editor (unter Mint Xed) wird folgendes kopiert und gespeichert.

[Unit]
#ES-Seep-hibernate
#(c) 2017 E-Soft
#http://www.ehlertronic.de

Description=ES-Delayed hibernation trigger
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
Documentation=https://wiki.archlinux.org/index.php/Power_management
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
Environment="WAKETEMP=/tmp/waketmp.tmp"

#zeit bis hibernate aus suspend
Environment="SLEEPLENGTH=+2hour"

#Check ob Batt Betrieb. "BATTCHECK=1" hibernate nur bei Batterie (Akku) Betrieb
Environment="BATTCHECK=0"

#hibernate zeit zum testen
#Environment="SLEEPLENGTH=+1minute"

#check Batt und set RTC Timer
ExecStart=/bin/sh -c 'on_ac_power; BATTUSE=$?; echo "BATTCHECK="$BATTCHECK; echo "BATTUSE="$BATTUSE;\
 if [ $BATTUSE -ne 0 ] || [ $BATTCHECK -eq 0 ]; then\
   echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM;\
   date +%%s -d$SLEEPLENGTH | tee $WAKETEMP;\
   echo "SLEEPLENGTH="$SLEEPLENGTH;\
 fi;'
#Nach aufwachen aus RTC awake
ExecStop=/bin/sh -c ' alarm=$(cat $WAKETEMP); now=$(date +%%s); calarm=$(($alarm+30));\
 if [ "$now" -ge "$alarm" ] && [ "$calarm" -ge "$now" ]; then\
  echo "hibernate triggered";\
   sleep 5;\
    systemctl hibernate;\
 else\
   echo "normal wakeup, not hibernating";\
 fi;\
 echo 0 > $WAKEALARM;\
 echo 0 > $WAKETEMP;'

[Install]
WantedBy=sleep.target

 

Die zweite Anpassung betrifft die vorhandene Service-Unit suspend.target. Dort wird unter [Unit] Requires=es-suspend-to-hibernate.service eingefügt und abgespeichert.

Requires=es-suspend-to-hibernate.service

 

sudo -H xed /lib/systemd/system/suspend.target


Dies sollte dann so aussehen

[Unit]
Requires=es-suspend-to-hibernate.service
Description=Suspend
Documentation=man:systemd.special(7)
DefaultDependencies=no
BindsTo=systemd-suspend.service
After=systemd-suspend.service


Kurze Erklärung zum Haupt Script es-suspend-to-hibernate.service.

Die Zeit bis zur Umschaltung in Hibernate lässt sich in
Environment="SLEEPLENGTH=+2hour" ändern..  z.B. "SLEEPLENGTH=+4hour" 
zum Testen einfach die # vor #Environment="SLEEPLENGTH=+1minute" entfernen, dann wird nach 1 Minute umgeschaltet.

Ob ein Check ob im Batteriebetrieb stattfinden soll, wird mit Environment="BATTCHECK=0" oder Environment="BATTCHECK=1"
gesetzt. Mit Environment="BATTCHECK=1" wird im AC/Netz/Strom Betrieb nicht in Hibernation (Ruhezustand geschaltet).

Bitte auf das Vorhandensein der Anführungszeichen am Anfang und am Ende des Parameters achten.

Die neue Service Unit muss nun in Systemd aktiviert werden.

sudo systemctl enable es-suspend-to-hibernate.service


und die Veränderung der vorhanden Unit muss dem System auch bekannt gemacht werden.
Dies ist auch notwendig wenn in den Scripten irgendetwas angepasst/verändert wurde

sudo systemctl daemon-reload


Zu guter letzt kann man sich den Status der neuen Unit ansehen, und schauen ob irgend etwas falsch läuft.

sudo systemctl status es-suspend-to-hibernate.service


Wenn alles richtig gemacht wurde, sollte das System nach Ablauf der angegebenen Zeit aufwachen, und in Ruhezustand gehen.

Achtung: Nach einem Update von Systemd könnte die Anpassung von suspend.target überschrieben werden, so das der Rechner nicht mehr in Hibernate geht und aufwacht. (resume aus standby) Somit nach einem Systemd update, kontrollieren ob die Anpassung noch vorhanden ist.

Ruhezustand mit Nano