Auf meinem Laptop (Acer Travelmate 8371) habe ich seit etwa einem Jahr Windows endgültig verbannt und hatte bisher ArchLinux am Laufen. Dieses Linux ist extem flexibel und lief bisher am saubersten, bis auf den Fingerprint-Reader wird alles unterstützt. Leider bringt die Flexibilität von ArchLinux auch ein (für mich nebenher kaum noch zu schaffenden) Pflegeaufwand mit, so dass ich mich immer mal in Richtung Ubuntu, konkret Xubuntu umgeschaut habe.

Meine Anforderungen sind:

  • möglichst volle Hardware-Unterstützung (auf Kleinigkeiten kann ich ggf. verzichten)
  • saubere Unterstützung von Standby (Suspend to RAM) und Hibernate (Suspend to Disk)
  • saubere Unterstützung von Hibernate after Suspend (das System geht in den Bereitschaftsmodus, nach einer Weile fährt es in den Ruhezustand – wie man es von Windows her kennt)
  • ordentliche Akkulaufzeit
  • keine nervigen Bugs, die das tägliche Arbeiten behindern

Xubuntu 14.10 mit XFCE 4.12  ist noch durchgefallen…

Mein initialer Test, bevor ich mit dem System einen hohen Aufwand betreibe, ist schnell und einfach. Das Thema Hardware-Unterstützung mach aufgrund aktueller Kernel derzeit keinerlei Probleme. Der Fingerprint-Reader läuft auf keinem Linux, der Rest auf allen. Die Akku-Laufzeit ist Out-of-the-Box ca. 20% kürzer als unter Windows, lässt sich aber auf allen gängigen Systemen mittels der Auto-Tune-Funktion von Powertop auf Beinahe-Windows-Niveau anheben. Daher gehe ich zunächst wie folgt vor:

  • Basisinstallation auf frischer Festplatte
  • Aktivieren von Hibernate
  • Test von Standby und Hibernate
  • schauen, wie Hibernate after Suspend zum Laufen zu bekommen ist
  • wenn bis hierher alles klappt, richte ich Mail, den Browser, evtl. noch ein Eclipse ein und arbeite ein paar Tage mit dem System

Mein erster Test mit XFCE 4.12 (PPA) auf Xubuntu 14.10 schluf gleich bei den ersten Schritten fehl. Ein schon lange existierender Bug hat hier zugeschlagen: Schickt man das System durch Schließen des Deckels in den Standby, kann man hinterher sein Passwort eingeben, danach wird und bleibt der Bildschirm schwarz. Der Bug wurde in Xubuntu direkt umschifft, durch XFCE 4.12 aus dem PPA trat er jedoch wieder auf.

Ein neuer Test mit XFCE 4.10 löste dies, jedoch war es mit nicht möglich, ein ordentliches Hibernate after Suspend hinzubekommen. Was unter Arch mit systemd problemlos ging, funktionierte unter Xubuntu mit keiner der zahlreichen Methoden die in diversen Foren diskutiert wurden – einige davon brachten auch gleich den Schwarzer-Bildschirm-Bug wieder zurück…

Damit war Xubuntu 14.10 für mich erst einmal durchgefallen.

… während Xubuntu 15.10 mit XFCE 4.12 und systemd gute Chancen hat

Mit großer Freude laß ich in den Release-Notes der nächsten Xubuntu-Version, dass diese mit XFCE 4.12 ausgeliefert wird. Laut dem Kommentar in meinem Bugreport sollte auch der Schwarzer-Bildschirm-Bug in diesem Release gefixt sein. Hinzu kommt, dass nun auch systemd mit von der Partie ist, so dass große Hoffnung auf ein funktionierendes Hibernate after Suspend bestand. Beides funktioniert, so dass ich mein Ziel mit dieser Xubuntu-Version wohl erreichen werde.

Suspend

Zunächst habe ich Suspend getestet. Dies lief ohne Probleme und ohne den bekannten Schwarzer-Bildschirm-Bug – ein guter Anfang 😉

Hibernate

Als nächstes ging es daran, Hibernate zu aktivieren. Hier kam die schon von Xubuntu 14.04 bekannte Methode zum Einsatz: Es wird die Datei /etc/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla mit folgendem Inhalt angelegt:

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

[Enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

Hibernate funktioniert sofort, nach einem Reboot taucht es auch als Option in den XFCE-Energieeinstellungen auf. Soweit sogut.

In Kombination unschlagbar

Nun wurde es spannend. Wird das von ArchLinux bekannte systemd-Script auch unter Ubuntu seinen Dienst tun und zum erhofften Ergebnis führen?

Das Script wird nach /etc/systemd/system/suspend-to-hibernate.service kopiert und mit dem Befehl sudo systemctl enable suspend-to-hibernate aktiviert. Die Resume-Zeit kann man zum Testen von „2hour“ auf „1minute“ stellen. Leider passierte erst einmal gar nichts.

Nach kurzer Fehlersuche stellte sich heraus, dass es bei ArchLinux einen Link zur Shell unter /usr/bin gibt, den es bei Ubuntu nicht gibt. Also schnell /usr/bin/sh zu /bin/sh geändert – et-voilà – es funktioniert. Das System geht beim Zuklappen des Deckels brav in den Standby, nach 1 Minute wacht es kurz auf, sichert den RAM auf die Festplatte und schaltet sich aus.

Das modifizierte Script sieht so aus:

[Unit]
Description=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="SLEEPLENGTH=+2hour"
ExecStart=-/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM;'
ExecStop=-/bin/sh -c '\
 alarm=$(cat $WAKEALARM); \
 now=$(date +%%s); \
 if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
 echo "hibernate triggered"; \
 systemctl hibernate; \
 else \
 echo "normal wakeup, not hibernating"; \
 fi; \
 echo 0 > $WAKEALARM; \
'

[Install]
WantedBy=sleep.target

 

2 Gedanken zu “Xubuntu 15.04 auf dem Laptop mit Hybrid-Suspend (Hibernate after Suspend)

  1. Super Anleitung!

    Das Script funktionierte bei mir unter Xubuntu 15.10 reibungslos. Nach einem Upgrade auf 16.04 klappt es leider nicht mehr… Hast du eine warum nicht?

Schreibe einen Kommentar zu birefringence Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

code