Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Bei falscher Anwendung dieser Anleitung kann man alle Daten auf einer oder mehreren Partitionen zerstören.
pm-utils steht für PowerManagement-Utils. Dieses Paket ist Bestandteil aller Ubuntu-Distribution und wurde inzwischen zum Standard für den Wechsel in unterschiedliche Energiesparmodi. Aufgrund mehrerer Änderungen in den letzten Versionen des Pakets pm-utils ist nicht gewährleistet, dass alle hier genannten Pfade und Inhalte zu 100% auf jede der o.g. Ubuntu-Versionen passen. Die allermeisten Inhalte sind dennoch korrekt, allgemeingültig und in der aktuellen Ubuntu-Version zu finden.
Das Paket pm-utils beinhaltet (hauptsächlich) Skripte, die SUSPEND- und RESUME-Vorgänge (siehe auch Energiesparmodi mit ACPI) ausführen. Dabei können die pm-utils-Skripte direkt (in einer Shell) oder indirekt (vom gnome-power-manager unter GNOME, bzw. von kpowersave / powerdevil unter KDE, ...) im Auftrag von HAL aufgerufen werden [4]. Die pm-utils-Skripte greifen automatisch auf uswsusp zurück, sofern das Paket uswsusp [5] installiert ist und nicht explizit auf Kernel-Methoden zurückgegriffen werden sollte.
Die PowerManagement-Funktionen des Pakets pm-utils sollten "Out of the Box" und ohne das Zutun des Benutzers funktionieren. Ist dies nicht der Fall, so liegt es sehr häufig an den fehlerhaften Treibern oder an einer fehlerhaften Konfiguration des Systems. STR (=Suspend-to-RAM) und STD (=Suspend-to-Disc) funktionieren auf einem frisch installierten Ubuntu System und auf Systemen, in denen nicht die aktuellste Hardware verbaut ist, häufiger, als auf Systemen, die die neueste bzw. spezielle Hardware beinhalten oder im Laufe der Zeit Änderungen erfahren haben. Beispiele für "Systeme, die Änderungen erfahren haben":
auf derselben Hardware sind mehrere Linux-Installationen (mit mehreren SWAP-Partitionen) vorhanden, wobei nicht alle SWAP-Partitionen in allen Linux-Installationen aktiviert sein müssen,
die SWAP-Partition(en) wurden vergrößert oder verkleinert,
Arbeitsspeicher wurde hinzugefügt oder ausgebaut,
etc.
Durch solche Veränderungen am System kann es passieren, dass die initial ermittelten Werte über die SWAP-Partition, deren Größe, usw. nicht mehr korrekt sind. Und plötzlich funktioniert STR oder/und STD nicht mehr.
Andererseits funktionieren STR und/oder STD auf anderen Systemen von Anfang an nicht, weil z.B. spezielle Hardware, die Ärger verursacht, verbaut ist.
Die Beweggründe und die Fehlerursachen für nicht funktionierende Energiesparmodi sind sehr vielfältig. Dieser Artikel sollte helfen, diese Fehlerursachen zu finden und zu beheben. Dazu muss ein wenig ausgeholt werden. Zuerst werden das Paket pm-utils, dessen Bestandteile, die pm-utils Hooks und der grundsätzliche Ablauf von SUSPEND und RESUME mit pm-utils erläutert. Im darauf folgenden Abschnitt ist erklärt, wie man herausfinden kann, welche Energiesparmodi auf dem eigenen System möglich sind. Anschließend wird erklärt, wie man STR und/oder STD einrichtet. Das letzte Kapitel behandelt Fehlersuche, Aktivierung des DEBUG-Modus, u.ä.
pm-utils ist in der Standardinstallation von K|X|Ubuntu immer enthalten. Bei einer Minimalinstallation oder anderen Ubuntu-Derivaten muss ggf. das Paket
pm-utils
installiert [1] werden. Die Dokumentation findet man unter /usr/share/doc/pm-utils.
Dieses Paket sollte nicht entfernt werden, da sonst Energiesparfunktionen nicht mehr genutzt werden können!
Mit pm-utils werden u.a. folgende Verzeichnisse und Dateien installiert. Dunkler hinterlegt sind die Namen der Dateien und Verzeichnisse, die vom Benutzer verwendet werden bzw. deren Inhalte von Benutzer verändert werden dürfen. Heller hinterlegt sind die Dateien und Verzeichnisse, die man nur dann braucht, wenn man sich mit Details beschäftigen möchte.
| Datei/Verzeichnis | Beschreibung/Inhalt |
| /etc/pm/config.d/ | Verzeichnis, in dem Konfigurationsdateien abgelegt werden können, mit denen dann die Standardeinstellungen aus /usr/lib/pm-utils/ überschrieben werden. |
| /etc/pm/power.d/ | Das Verzeichnis für die eigenen Hooks für Energiesparmodi , in denen kein SUSPEND gemacht wird. |
| /etc/pm/sleep.d | Das Verzeichnis für die eigenen Hooks für Suspend-Energiesparmodi. |
| /usr/bin/pm-is-supported | Programm, mit dem geprüft werden kann, welche SUSPEND-Modi erreichbar sind |
| /usr/lib/pm-utils/defaults | Standard-Einstellungen für pm-utils |
| /usr/lib/pm-utils/functions | Funktionen, die von pm-utils-Sktripten verwendet werden |
| /usr/lib/pm-utils/bin/pm-action | Das Skript, dass die Arbeit verrichtet |
| /usr/lib/pm-utils/power.d/ | Das Verzeichnis mit den Hooks für Energiesparmodi , in denen kein SUSPEND gemacht wird. Zum Beispiel, anacron stoppen, wenn Notebook nicht am Netz ist, sondern vom Akku mit Spannung versorgt wird. |
| /usr/lib/pm-utils/sleep.d/ | Das Verzeichnis mit den Hooks für Suspend-Energiesparmodi. |
| Seit Intrepid (pm-utils 1.1.2.4) zusätzlich im Paket enthalten | |
| /etc/pm/config.d/00sleep_module | Datei, in die Benutzer Module eintragen sollten, die entladen und geladen werden sollen |
| /usr/lib/pm-utils/module.d/ | In diesem Verzeichnis existieren Dateien kernel, tuxonice, uswsusp mit den Definitionen der Funktionen, die bei der entsprechenden SUSPEND & RESUME-Methode angewendet werden. Die Variable $SLEEP_MODULE definiert, welche der SUSPEND & RESUME-Methoden kernel, tuxonice, uswsusp gilt. |
| /usr/lib/pm-utils/pm-functions | pm-functions enthält (seit Intrepid) nur die Funktionalitäten für pm-utils-"Frontends" pm-action, pm-is-supported, pm-powersave. Die Datei functions wird auch von pm-utils-Hooks verwendet. |
"Hooks" sind pm-utils-Skripte, die bei SUSPEND- und RESUME-Vorgängen abgearbeitet werden:
beim SUSPEND-Vorgang werden die Hooks abhängig von der SUSPEND-Art mit dem Parameter suspend respektive hibernate in der alphabetischen Reihenfolge aufgerufen.
beim RESUME-Vorgang werden die Hooks in der umgekehrten Reihenfolge abgearbeitet, wobei sie beim RESUME_from_STR mit dem Parameter resume aufgerufen werden, beim RESUME_from_STD hingegen mit dem Parameter thaw.
Die Parametrierung der Aufrufe ermittelt pm-action automatisch ohne Zutun des Benutzers.
Eigene Hooks werden in den Verzeichnissen /etc/pm/sleep.d bzw. /etc/pm/power.d gespeichert. Ein Beispiel-Hook ist weiter unten im Kapitel Eigene Hooks erstellen enthalten.
Seit Intrepid wird die Datei /usr/share/doc/pm-utils/HOWTO.hooks mit weiteren nützlichen Details installiert.
Beim Auswählen von "Bereitschaft" im GNOME-Abmeldemenü wird das Skript /usr/sbin/pm-suspend aufgerufen.
Beim Auswählen von "Ruhezustand" im GNOME-Abmeldemenü wird das Skript /usr/sbin/pm-hibernate aufgerufen.
Künftig wird womöglich eine dritte Schaltfläche vorhanden sein, mit der man in einen Hybrid-Energiesparmodus wechseln können wird, sogenannter SUSPEND-HYBRID-Modus. Dabei würde das Skript /usr/sbin/pm-suspend-hybrid aufgerufen werden.
Diese Skripte können auch manuell ausgeführt werden, wobei alle Befehle / Skripte Root-Rechte benötigen:
/usr/sbin/pm-suspend
/usr/sbin/pm-hibernate
/usr/sbin/pm-suspend-hybrid
Dies sind allerdings "nur" symbolische Links auf das Skript /usr/lib/pm-utils/bin/pm-action, das die eigentliche Arbeit verrichtet. Das Skript pm-action erkennt aus dem Aufruf (über die o.g. symbolischen Links) heraus, ob es von /usr/sbin/pm-suspend oder von /usr/sbin/pm-hibernate aufgerufen wurde. Daraufhin arbeitet das Skript /usr/lib/pm-utils/bin/pm-action die Hooks ab, indem sie in der entsprechenden Reihenfolge mit dem Parameter suspend bzw. hibernate aufgerufen werden. Anschließend wird der Rechner in den Schlaf geschickt.
Bei STD wird das Image auf die SUSPEND-Partition geschrieben:
STD über Userspace: Wenn uswsusp installiert ist UND in keinem der aufgerufenen pm-utils-Skripte HIBERNATE_METHOD="kernel" gesetzt ist, dann gilt HIBERNATE_METHOD="autodetect". Das Skript pm-suspend findet /usr/sbin/s2disk bzw. /sbin/s2disk und setzt HIBERNATE_METHOD="userspace". Dabei wird die uswsusp-Konfiguration (standardmäßig) aus der Datei /etc/uswsusp.conf gelesen.
STD über Kernelspace: Wenn uswsusp nicht installiert ist ODER in mindestens einem der augerufenen pm-utils-Skripte HIBERNATE_METHOD="kernel" gesetzt ist, dann wird auf Kernelspace zurückgegriffen, indem folgende Befehle (automatisch) abgesetzt werden:
echo -n "platform" > /sys/power/disk echo -n "disk" > /sys/power/state
RESUME aus STR (S3) ist ein relativ einfacher Vorgang, in dem, vereinfacht gesagt, im Wesentlichen die Hardware-Komponenten mit Spannung versorgt werden, und der Rechner in den Arbeitszustand versetzt wird.
Nachdem ein "Wake-up-Event" erkannt wurde, prüft das BIOS, ob RESUME_from_STR oder ein normaler Boot-Prozess gestartet werden soll. Wenn RESUME_from_STR erkannt wird, startet das BIOS den "Kernel-Wake-up-code". Die Hooks werden dabei, wie oben erwähnt, in der umgekehrten Reihenfolge abgearbeitet. Die entladenen Module werden ggf. wieder geladen, die angehaltenen Dienste ggf. wieder gestartet. Bei Notebooks wird noch die Hintergrundbeleuchtung eingeschaltet etc.
RESUME aus STD (S4) ist ein etwas komplexerer Vorgang. Der Rechner bootet. Da das BIOS keinen Resume_from_STR erkannt hat, startet GRUB zuerst "ganz normal". Der Kernel liest die Boot-Parameter aus /boot/grub/menu.lst. Die initrd wird geladen, und an dieser Stelle kann (muss) der Kernel erkennen, dass der Rechner aus STD (S4) erwacht. Aus den Kernel-Parametern und / oder der initrd erfährt der Kernel, auf welcher Partition ein SUSPEND-Image vorhanden sein könnte. Wird nun kein SUSPEND-Image gefunden, so startet das System "normal weiter". Wird aber ein SUSPEND-Image gefunden, so wird dieses Image geladen und der RESUME_from_STD-Vorgang wird eingeleitet. Dabei wird der Inhalt des Images in den Arbeitsspeicher (zurück)geschrieben und die Hooks in der umgekehrten Reihenfolge abgearbeitet. Die entladenen Module werden wieder geladen, die angehaltenen Dienste wieder gestartet. Bei Notebooks wird noch die Hintergrundbeleuchtung eingeschaltet, ...
Zuerst muss man herausfinden, welche Energiesparmodi erreicht werden können. Will man zum Beispiel STD erreichen, das System STD aber im aktuellen Zustand nicht unterstützt, so muss man zuerst das System in die Lage versetzen, STD erreichen zu können. Erst dann macht es Sinn, die Einrichtung von STD zu starten.
Für diese Prüfung verwendet man das Skript pm-is-supported aus dem Paket pm-utils. Das Paket hal hängt u.a. vom Paket pm-utils ab, sodass pm-utils i.d.R. installiert sein wird.
In einer Konsole diesen Einzeiler eingeben:
echo; for i in --suspend --hibernate --suspend-hybrid; do pm-is-supported $i && echo "$(echo $i | tr [:lower:] [:upper:] | tr -d -) is supported"; done; echo
Alternativ: dieses Skript speichern, ausführbar machen und ausführen (läuft auch als nicht privilegierter Benutzer):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash # check if we can test acpi power states with pm-is-supported if ! which pm-is-supported 1>/dev/null then echo echo "pm-is-supported not found" echo "Please install the package pm-utils if not installed" echo echo "Otherwise check \$PATH" echo "pm-is-supported should be in /usr/bin/" echo exit 1 fi # a new line echo # check POWER MANAGEMENT MODES # for MODE in suspend hibernate suspend-hybrid # do # pm-is-supported --$MODE && echo "Kernel supports $(echo $MODE | tr [:lower:] [:upper:] ) " # done pm-is-supported --suspend && echo "Kernel supports SUSPEND (SUSPEND to RAM)" pm-is-supported --hibernate && echo "Kernel supports HIBERNATE (SUSPEND to DISK)" pm-is-supported --suspend-hybrid && echo "Kernel supports HYBRID-SUSPEND (to DISK & to RAM)" # a new line echo exit 0 |
Die Ausgabe nennt die möglichen Energiesparmodi, die das System im aktuellen Zustand erreichen kann.
Nachdem festgestellt wurde, ob und welche Energiesparmodi erreicht werden können, muss man die Entscheidung treffen, ob diese Energiesparmodi über Kernelspace oder Userspace (zum Beispiel mit Hilfe von uswsusp) erreicht werden sollen.
Viele Ubuntu-Benutzer sind in der Vergangenheit wegen nicht oder schlecht funktionierendem "STR über Kernelspace" auf "STR über Userspace" mithilfe von uswsusp ausgewichen. Infolgedessen wurden nur wenige BugReports zu "STR über Kernelspace" eingereicht. Dies hatte aber zur Folge, dass die Fehler im Suspend_To_RAM über Kernelspace nicht korrigiert werden konnten und immer mehr Benutzer auf uswsusp ausgewichen sind. Die Entwickler wollten diese Fehler aber korrigieren und haben daher kurzerhand das Programm s2ram aus dem Paket uswsusp entfernt. Siehe dazu Bug-Report auf Launchpad
. Aus diesem Grund funktioniert STR über uswsusp, d.h. über Userspace, unter Intrepid nicht.
Es gibt trotzdem Methoden, wie man s2ram auf einem Ubuntu-System installieren und verwenden kann, wenn Suspend_To_RAM über Kernelspace nicht funktioniert. Das kann z.B. in diesem Bug-Report nachgelesen werden.
Das bedeutet, dass STR unter Ubuntu mit Standardmitteln immer über Kernelspace läuft, selbst wenn das Paket uswsusp installiert ist.
Funktioniert STR nicht "Out of the box" und greift man nicht auf s2ram für Ubuntu
zurück, dann macht man zwangsläufig beim Kapitel Fehlersuche unten weiter.
Hinweis für alle die s2ram vermissen: Laut Launchpad ist s2ram ab Jaunty wieder im Paket uswsusp enthalten.
Will man STD einrichten, so muss man sich u.U. zuerst entscheiden, wohin das SUSPEND-Image (der Inhalt des Arbeitsspeichers) vor dem Einschlafen des Rechners geschrieben werden soll. Auf den meisten Systemen stellt sich diese Frage aber nicht, da Linux standardmäßig die SWAP-Partition dafür verwendet. Der Grund hierfür ist die Tatsache, dass die SWAP-Partition nur dann verwendet wird, wenn das System arbeitet. Wird das System heruntergefahren, so kann die SWAP-Partition überschrieben werden. Wichtig ist nur, dass nach dem Einschalten des Rechners die SWAP-Partition entsprechend "reaktiviert" wird. Das passiert automatisch. Hat man keine SWAP-Partition im System (z.B. weil man großen Arbeitsspeicher hat) und möchte man trotzdem STD nutzen, so kann eine separate SUSPEND-Partition erstellt werden. Alternativ kann das SUSPEND-Image auch in eine Datei geschrieben werden, das wird allerdings nur selten gemacht.
Die Angabe über die Partition, auf die das SUSPEND-Image geschrieben wird, findet man an mehreren Stellen:
In der Datei /etc/initramfs-tools/conf.d/resume
Dabei kann sowohl der Partitionsname verwendet werden (RESUME=/dev/sda2), als auch der UUID-Identifier der Partition (RESUME=UUID=f0a3458f-3919-4542-9e27-fdbaa0963796). Der UUID-Identifier ändert sich nicht beim Umhängen der Festplatte an einen anderen Controller oder beim "Um-Jumpern" einer IDE-Platte von Master zu Slave oder umgekehrt. Deswegen ist die Verwendung des UUID-Identifiers weniger fehleranfällig.
Jedes Mal, wenn initrd neu erzeugt bzw. aktualisiert wird (zum Beispiel bei der Installation eines neuen Kernels), wird diese Datei gelesen und die Angabe in initrd geschrieben.
Diese Datei ist oft die Fehlerursache, weil diese Datei i.d.R. nicht vom Benutzer aktualisiert wird, wenn die SWAP-Partition aufgrund eines Platten-Umbaus, -Einbaus- oder -Ausbaus, oder im Rahmen einer Um-Partitionierung eine neue Bezeichnung erhält!
In der Datei /etc/uswsusp.conf
Diese Datei wird bei der Installation des Pakets uswsusp erstellt und mit Benutzer-Angaben befüllt, wenn die Konfiguration des Pakets uswsusp nicht abgebrochen wird. Ansonsten steht irgendein Wert darin! Man kann diese Datei manuell anpassen oder "halb-automatsich" durch den Aufruf
sudo dpkg-reconfigure uswsusp
mit neuem Inhalt befüllen. Empfohlen wird hierzu die Lektüre der Manpage zu uswsusp oder des Wiki-Artikels uswsusp [5].
Kernel Bootparameter in der Datei /boot/grub/menu.lst
Dazu wird in #defoptions ergänzt: resume=<PARTITION>. Dabei kann man sowohl resume=/dev/sda2, als auch resume=UUID=fq23467sfd094k verwendet werden. Der UUID-Identifier ändert sich nicht beim Umhängen der Festplatte an einen anderen Controller oder beim "Um-Jumpern" einer IDE-Platte von Master zu Slave oder umgekehrt. Deswegen ist die Verwendung des UUID-Identifiers weniger fehleranfällig.
Die o.g. Dateien sind nun kontrolliert und man weiß, wo man bei der Einrichtung hinlangen muss.
Nachdem oben festgestellt wurde:
dass der gewünschte Energiesparmodus (STR und/oder STD) erreicht werden kann
ob Kernelspace oder Userspace genutzt werden soll
kann man nun mit der Einrichtung anfangen.
Das ist der Standardfall: Eine aktive SWAP-Partition im System, keine Fehler
Hat man nur eine SWAP-Partition und keine Fehler im System, d.h. die SWAP-Partition ist korrekt definiert und aktiv, dann sollte man so verfahren:
Partitionsname der SWAP-Partition z.Bsp. aus der Ausgabe von
sudo fdisk -l
ablesen (nach "Swap" suchen und /dev/xxxy merken!)
Partitionsname bzw. UUID-Identifier der SWAP-Partition z.B. aus /etc/fstab ablesen:
grep swap /etc/fstab | grep -v
UUID-Identifier der SWAP-Partition ("/dev/xxxy" von oben) aus der Ausgabe
ls -l /dev/disk/by-uuid
ablesen.
Die abgelesenen Informationen sollten übereinstimmen! Sonst bei Sonderfälle unten weitermachen
Überprüfen, ob die gewünschten Angaben schon in den entsprechenden Dateien (korrekt) eingetragen sind. Am wichtigsten ist dabei die Datei /etc/initramfs-tools/conf.d/resume. Wenn nicht, dann die Angaben in die entsprechenden Dateien schreiben bzw. korrigieren.
initrd aktualisieren:
sudo update-initramfs -u
/boot/grub/menu.lst aktualisieren:
sudo /sbin/update-grub
System neu starten und STD testen.
Wenn Fehler auftreten, dann bei Fehlersuche weitermachen.
Der folgende Einzeiler fasst die Schritte 1. bis 4. zusammen:
ls -l /dev/disk/by-uuid/ | grep $(cat /proc/swaps | tail -$(($(cat /proc/swaps | wc -l)-1)) | awk '{print $1}' | awk -F/ '{print $3}') | awk -F' ' '{print $8}' Salopp gesagt: In diesem Fall ist man (sehr) fortgeschrittener Anwender, man kennt sich gut aus und man weiß i.d.R, was man hat und was man will. Folgendes ist zu tun (analog zu weiter oben):
Ggf. zuerst eine SUSPEND-Partition erstellen
Partitionsname aus der Ausgabe von
sudo fdisk -l
ablesen
Partitionsname bzw. UUID-Identifier der Partition aus /etc/fstab ablesen
UUID-Identifier aus der Ausgabe von
ls -l /dev/disk/by-uuid
ablesen (Vergleich mit Ausgabe von sudo fdisk –l)
Überprüfen, ob die gewünschten Angaben schon in den entsprechenden Dateien (korrekt) eingetragen sind. Am wichtigsten ist dabei die Datei /etc/initramfs-tools/conf.d/resume. Wenn nicht, dann die Angaben in die entsprechenden Dateien schreiben bzw. korrigieren.
initrd aktualisieren:
sudo update-initramfs –u
/boot/grub/menu.lst aktualisieren:
sudo /sbin/update-grub
System neu starten und STD testen.
Wenn Fehler auftreten, dann bei Fehlersuche weitermachen.
Auf einem System können mehrere SWAP-Partitionen existieren, so zum Beispiel wenn mehrere Linux-Installationen mit jeweils separater SWAP-Partition vorhanden sind. Nicht jede SWAP-Partition muss im Einsatz (aktiviert) sein. Das ist zum Beispiel dann der Fall, wenn der Eintrag zu SWAP-Partition(en) in fstab nicht korrekt ist, oder wenn aus Umbau-Maßnahmen mehrere SWAP-Partitionen vorhanden sind, aber nur eine verwendet wird.
Die UUID-Bezeichner für alle aktiven SWAP-Partitionen, die tatsächlich im Einsatz (aktiv) sind, kann man so herausfinden:
cat /proc/swaps # zeigt die aktiven SWAP-Partitionen an ls -l /dev/disk/by-uuid/ # zeigt die Zuordnung Partitionen <=> UUID-Identifier
Man sucht sich nun die "richtige" SWAP-Partition heraus und verwendet diese. Außerdem hat man nun womöglich einen ganz anderen Fehler entdeckt, den es zu beheben gilt.
Die Log-Datei für pm-utils ist /var/log/pm-suspend.log. Diese Datei wird bei jeder Einleitung eines SUSPEND-Vorgangs geleert und neu beschrieben. In dieser Datei wird sowohl der SUSPEND-, als auch der RESUME-Vorgang protokolliert. Hat man nach einem missglückten SUSPEND-RESUME-Vorgang Veränderungen vorgenommen, so kann man eine Kopie der Log-Datei /var/log/pm-suspend.log speichern um sie mit ihrem Nachfolger zu vergleichen.
Aussagekräftiger wird diese Datei, wenn man den SUSPEND auf der Konsole startet und davor der Variable $PM_DEBUG den Wert true zuweist:
export PM_DEBUG=true
Das kann viele Ursachen haben. Einige davon sind oben angesprochen. Für die einzelnen Ursachen sind die Maßnahmen in den entsprechenden, nachfolgenden Unterkapiteln beschrieben. An dieser Stelle sind noch weitere Fehlerursachen beschrieben, die in manchen Fällen SUSPEND und RESUME verhindern:
| Fehlerursache - Kategorie | Beschreibung von Maßnahmen | |||||
| Module | Module, die beim SUSPEND entladen und beim RESUME wieder geladen werden müssen. Beispiele: WLAN-Karten, Netzwerk-Karten, Bluetooth-Geräte, USB-Geräte, ... | |||||
| Dienste | Manche Dienste verhindern das Entladen von Modulen. Daher müssen Dienste beim SUSPEND gestoppt und beim RESUME wieder gestartet werden. Beispiel: USV-Dienst verhindert das Entladen von USB-Modulen | |||||
| Grafik | Bei bestimmten Grafik-Einstellungen kann es vorkommen, dass SUSPEND ebenso nicht möglich ist. Beispiele:
Option "NvAGP" "1"
| |||||
| SWAP-Einstellung falsch | Verschiebt man die SWAP-Partition, ohne den Eintrag in der Konfigurationsdatei für RESUME anzupassen, so kann der Kernel das STD-Image nicht finden. | |||||
| ACPI abgeschaltet | Manche Systeme booten nur dann, wenn ACPI abgeschaltet wird (acpi=off). Dann ist die Nutzung von ACPI-Energiesparmodi nicht möglich. | |||||
In der Regel ist es ausreichend, Kernelmodule für die problematiche Hardware automatisch vor SUSPEND entladen und während RESUME neu laden zu lassen. Die Module, die häufig Ärger bereiten, sind die Module für:
WLAN-Karten und USB-WLAN-Sticks: *802*, ndiswrapper, ...
LAN-Karten: forcedeth, *8139*, ...
USB- und Firewire-Module: ehci-hcd, uhci-hcd, *usb*, *1394, ...
Bluetooth- und TV-Karten: ivtv, bttv, btusb, ...
Mit dem folgenden Einzeiler kann man sich die "üblichen Verdächtigen" anzeigen lassen:
lsmod | grep -iE 'usb|1394|hci|ndiswr|forced|8139|hid|802'
Diese Liste erhebt allerdings keinen Anspruch auf Vollständigkeit.
Ab Intrepid verwendet man die (vorhandene) Datei /etc/pm/config.d/00sleep_module, in früheren Ubuntu-Versionen erstellt man eine Datei unload_modules (ein anderer beliebiger Name ist auch richtig) im Verzeichnis /etc/pm/config.d/. Hat man herausgefunden, dass die Module ehci-hcd uhci-hcd usbcore forcedeth SUSPEND (und/oder RESUME verhindern), so fügt man die folgenden Zeilen in diese Datei ein:
# USB-Kernelmodule und forcedeth (Netzwerkkarte) machen Aerger bei SUSPEND & RESUME mit pm-utils # daher sollen sie automatisch ent- und geladen werden SUSPEND_MODULES="$SUSPEND_MODULES ehci-hcd uhci-hcd usbcore forcedeth"
Durch die o.g. Zuweisung werden diejenigen Module, die bereits an einer anderen Stelle in der Variable SUSPEND_MODULES hinterlegt wurden, nicht überschrieben. Nachdem diese Datei erstellt wurde, testet man SUSPEND und RESUME. In der Tabelle unten sind die Module aufgelistet, die in der jeweiligen Ubuntu-Version bei einem oder mehreren Benutzern SUSPEND (und RESUME) verhinderten.
| Version | Module | Weiteres |
| Karmic | cfg80211 via_rhine | WLAN-Karte BCM4311 802.11b/g fährt wieder hoch bzw. im Fall von via_rhine ist nach Suspend zwar VT6102/Rhine-II noch mit lspci sichtbar, bekommt aber keine IP mehr |
| Jaunty | cfg80211 btusb | Bug in /usr/lib/pm-utils/functions -> siehe unten |
| Intrepid | forcedeth 8139to | Bug in /usr/lib/pm-utils/functions -> siehe unten |
| Hardy | ehci-hcd uhci-hcd usbcore forcedeth ivtv ohci1394 ieee1394 bttv | |
| Lucid | xhci | xhci ist für USB 3.0 |
Diese Liste kann als "Start-Liste" benutzt werden. Wenn SUSPEND und RESUME klappen, dann kann man ein Modul nach dem anderen aus der o.g. Liste entfernen, und SUSPEND und RESUME wieder testen, bis man den/die Übeltäter gefunden hat. Es schadet natürlich nicht, wenn man zu Testzwecken alle Module (für alle Versionen) in seine eigene SUSPEND_MODULES-Liste packt. Oder man lässt diese Liste so wie sie ist, da der Zeitgewinn nur minimal ist, wenn man ein oder zwei Module weniger als erforderlich entladen und neu laden läst. Selbstverständlich erhebt diese Liste keinen Anspruch auf Vollständigkeit.
Falls jemand einen oder mehrere weitere Module entdeckt, die entladen und neu geladen werden müssen, damit SUSPEND und RESUME klappen, bitte die Liste für die entsprechende Version vervollständigen! Dabei sollen nur diejenigen Module eingetragen werden, bei denen es sichergestellt ist, dass sie SUSPEND und RESUME tatsächlich verhindern.
Bei Lucid auf äteren ASUS-Boards mit PS/2-Anschlüssen ist es offenbar erforerlich, im BIOS die Funktion "USB Legacy Support" abzuschalten. Dies ist natürlich nur sinnvoll, falls man eine PS/2-Tastatur benutzt.
Weitere Details dazu findet man auf Launchpad und im Forum und speziell zu Lucid hier.
Eine gute Anleitung auf englisch, um solche Module, die Ärger verursachen, ist hier zu finden: "resume-trace" debugging procedure for finding buggy drivers.
Seit Intrepid wird die Datei /usr/share/doc/pm-utils/HOWTO.modules mit weiteren nützlichen Details installiert.
BugFix für pm-utils ab Version 1.1.2.4 (bis 1.2.4) - eingesetzt in Intrepid und Jaunty
In Intrepid wird pm-utils in der Version 1.1.2.4 eingesetzt und in Jaunty die Version 1.2.2.4. Darin existiert in der pm-utils-Funktion modunload() der Bug modunload doesn't follow dependencies properly
. Infolgedessen werden Module, die von anderen Modulen abhängig sind, nicht korrekt entladen. Wer diesen Fehler manuell korrigieren möchte, kann
sich zuerst vergewissern, dass die o.g. pm-utils-Versionen (kleiner als 1.2.4) tatsächlich eingesetzt werden,
der Bug noch ungelöst ist. Dazu in /usr/lib/pm-utils/functions die Zeile MODS="${USED%%*,}" ausfindig machen - es müsste die Zeile 95 sein,
die Zeile MODS="${USED%%*,}" zu MODS=",${USED%,}" ändern (bitte Copy & Paste - das ist der BugFix!)
die Datei /usr/lib/pm-utils/functions speichern
und anschließend das Paket pm-utils durch Apt-Pinning vor Updates schützen, weil dieser Fehler erst in der pm-utils-Version 1.2.4 behoben wurde,
Idealerweise speichert man sich die korrigierte /usr/lib/pm-utils/functions ab, um sie wiederherstellen zu können, wenn sie durch ein reinstall überschrieben wird.
Mit den Diensten, die nach dem RESUME nicht funktionieren, sollte man analog zu den Kernelmodulen verfahren:
Zuerst herausfinden, welcher Dienst gestoppt und wieder gestartet werden muss.
Einen Hook unter Verwendung des Beispiel-Hooks erstellen.
Aus mehreren Gründen kann es vorkommen, dass entweder alle oder nur bestimmte ACPI-Funktionalitäten abgeschaltet sind. Dies kann entweder im BIOS oder über Kernelparameter erreicht werden. Daher sollten unter [4] die BIOS-Einstellungen und ACPI-Kernelparameter kontrolliert werden.
Nvidia
Laut Grafikkarten/Nvidia/Suspend ist es erforderlich, in der Datei /etc/X11/xorg.conf im Abschnitt "Device" die NvAGP-Option zu ergänzen:
1 2 3 4 | Section "Device"
Driver "nvidia"
Option "NvAGP" "1"
EndSection
|
Außerdem wurde mehrmals festgestellt, dass der Nvidia-Treiber in der Version 180 SUSPEND verhindert. In diesem Fall sollte der treiber durch einen älteren ersetzt werden!
ATI
Oft wird berichtet, dass SUSPEND funktioniert, wenn radeon statt fglrx verwendet wird.
Desktop-Effekte
Manchmal wird berichtet, dass SUSPEND funktioniert, nachdem Desktop-Effekte abgeschaltet werden.
Zur Fehlersuche ist es ratsam, stufenweise vorzugehen. Das bedeutet, dass man zuerst den XServer beendet und SUSPEND von einer Konsole aus startet. Wenn das funktioniert, dann startet man SUSPEND aus X heraus.
SUSPEND und RESUME ohne X (aus RUNLEVEL 1) testen:
von GNOME/KDE/… abmelden
mit Strg + Alt + F1 zur Konsole wechseln
anmelden
sudo init 1
mit
/usr/sbin/pm-suspend
bzw.
/usr/sbin/pm-hibernate
SUSPEND starten
Anschließend RESUME einleiten, indem der Rechner wieder eingeschaltet wird.
Man kann das auch testen, indem man nicht (mit sudo init 1) in den RUNLEVEL 1 wechselt, sondern direkt nach der Anmeldung in der Konsole mit sudo /usr/sbin/pm-suspend bzw. sudo /usr/sbin/pm-hibernate den SUSPEND-Vorgang startet.
Der Rechner wird in den Schlaf versetzt. Nach dem Wiedereinschalten startet das System "normal".
Meistens liegt es daran, dass die Angabe zur "SUSPEND & RESUME-Partition" an einer oder mehreren der folgenden Stellen falsch ist:
/etc/initramfs-tools/conf.d/resume (und damit auch in initrd)
/etc/uswsusp.conf
/boot/grub/menu.lst
Eventuell sind die Angaben sogar korrekt, nur das abschließende sudo update-initramfs -u wurde vergessen.
Weiter oben unter Suspend_To_Disk ist beschrieben, wie man feststellen kann, welche Partition die richtige ist, und wie man die Angaben dazu aktualisiert.
Intel HDA ist eine Definition von Intel für integrierte Soundlösungen. Auf unterschiedlichen Mainboards kommen unterschiedliche Chipsätze zum Einsatz. Das bedeutet, das der "Intel HDA"-Treiber eine ganze Gruppe von Soundchips unterstützt. Derzeit funktioniert diese Gruppe von Soundchips nicht richtig mit dem Kernel 2.6.24-15/16. Die Bugs sind in Launchpad immernoch offen, und eine Menge Anwender sind davon betroffen. Meistens funktionieren die Chips selber ohne Probleme mit diesem Kernel und Hardy, aber nur bis zum SUSPEND. Sie werden beim RESUME nicht richtig aufgeweckt, aber vom System als wieder aktiviert erkannt. Die lspci-Ausgabe zeigt die Soundchips als aktiv an, und die Systemprotokolle zeigen nichts ungewöhnliches.
Lösung für dieses Problem:
Mit
aplay -l
den Chipsatz herausfinden! Das Ergebnis könnte so aussehen:
aplay -l **** Liste von PLAYBACK Geräten **** Karte 0: Intel [HDA Intel], Gerät 0: ALC268 Analog [ALC268 Analog] Untergeordnete Geräte: 0/1 Untergeordnetes Gerät '0: subdevice #0
Im Beispiel oben ist ALC268 der gesuchte Begriff.
Mit
zless /usr/share/doc/alsa-base/driver/ALSA-Configuration.txt.gz
nach dem Chipsatz (im Beispiel oben ALC268) suchen! Das Ergebnis könnte so aussehen:
ALC268
3stack 3-stack model
toshiba Toshiba A205
acer Acer laptops
dell Dell OEM laptops (Vostro 1200)
zepto Zepto laptops
test for testing/debugging purpose, almost all controls can
adjusted. Appearing only when compiled with
$CONFIG_SND_DEBUG=y
auto auto-config reading BIOS (default)
Auf Acer-Notebooks wäre acer der gesuchte Begriff.
In den Dateien /etc/modprobe.d/snd-hda-intel.modprobe und /etc/modprobe.d/alsa-base muss folgende Zeile eingetragen werden:
options snd-hda-intel model=acer
Im Forum wird oft die Anweisung gegeben, in der Datei /etc/default/acpi-support noch folgende Änderung vorzunehmen:
# Add services to this list to stop them before suspend and restart them in # the resume process. STOP_SERVICES="alsa"
Dies dürfte sich allerdings auf SUSPEND & RESUME mit pm-utils nicht auswirken, da pm-utils die Dateien aus dem Paket acpi-support nicht verwendet. Möchte man aber sowohl pm-utils als auch acpi-support für SUSPEND & RESUME nutzen, so sollte die Änderung in /etc/default/acpi-support vorgenommen werden.
Anschließend muss man die Dienste neu starten, ggf. Module entladen und neu laden. Wenn´s nicht klappt, einen Neustart durchführen.
Weitere Informationen zu diesem Problem können dem Thread nach-standby-kein-ton-mehr im uu.de-Forum entnommen werden.
Den Debug-Modus schaltet man auf diese Weise ein:
sudo su - # startet eine root Shell echo 1 > /sys/power/pm_trace # aktiviert Debug Modus
Die gezielte Suche nach den Modulen oder Geräten, die Ärger bei SUSPEND und RESUME verursachen, ist nach diesem Schema durchzuführen:
ggf. vom Desktop (KDE, GNOME, ...) abmelden
mit Strg + Alt + F1 zur Konsole wechseln
anmelden
sudo su -
echo 1 > /sys/power/pm_trace
/usr/sbin/pm-suspend
oder
/usr/sbin/pm-hibernate
Das System geht in SUSPEND über.
Wenn "Ruhe" eingekehrt ist, dann RESUME einleiten durch Drücken der Power-Taste.
RESUME startet
Wenn der RESUME-Vorgang "anscheinend durchgelaufen ist", dann den Rechner ausschalten und neu starten (booten). Zwischen dem Erreichen der "Ruhe" (zwei Schritte vor diesem hier) und dem aktuellen Zeitpunkt (Neustart) darf nicht mehr Zeit als 2 bis 3 Minuten vergehen! Da ins RTC geschrieben wird, werden beim nächsten Start des Systems höchstwahrscheinlich Dateisystemcheck durchgeführt. Nicht verunsichern lassen - einfach abwarten!
Sobald das System gestartet ist, mit Strg + Alt + F1 zur Konsole wechseln
anmelden
cd /tmp
dmesg > dmesg.txt
grep "hash matches" dmesg.txt > dmesg_hash_matches.txt
Die Dateien /tmp/dmesg.txt und /tmp/dmesg_hash_matches.txt können nun bei der Fehlersuche verwendet und im Forum gepostet werden.
Ist die Datei /tmp/dmesg_hash_matches.txt nicht leer, so hat man entweder direkt den Modulnamen oder aber zumindest einen Hinweis auf das entsprechende Gerät. Der Modulname sollte nun in die Liste der Module eingefügt werden, die vor SUSPEND entladen und während RESUME neu geladen werden sollten. Details dazu weiter oben.
Seit Intrepid wird die Datei /usr/share/doc/pm-utils/README.debugging installiert.
Man kann auch das Original der Datei /usr/lib/pm-utils/pm-action speichern (z.B. als /usr/lib/pm-utils/pm-action.bak) und dann Änderungen an dieser Datei vornehmen. Zum Beispiel set -x in der zweiten Zeile im Skript eintragen. Dann wird ersichtlich, was das Skript tut, da jeder Aufruf/Befehl inkl. Ergebnis ausgegeben wird.
Für den sehr unwahrscheinlichen Fall, dass man selbst Hooks erstellen muss, hier das Beispiel /usr/lib/pm-utils/sleep.d/05led. Daraus ist ersichtlich, dass beim Betreten von STR und STD echo "7 blink" >/proc/acpi/ibm/led, beim Wiedererwachen hingegen echo "7 off" >/proc/acpi/ibm/led aufgerufen wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash [ -f /proc/acpi/ibm/led ] || exit 0 case "$1" in hibernate|suspend) { echo "7 blink" >/proc/acpi/ibm/led ; } 2>/dev/null ;; thaw|resume) { echo "7 off" >/proc/acpi/ibm/led ; } 2>/dev/null ;; *) ;; esac exit $? |
Diese Revision wurde am 1. August 2010 um 20:33 Uhr
von ingo2 erstellt.
Dieser Seite wurden folgende Begriffe zugeordnet:
Hardware, System
2004 – 2010 ubuntuusers.de • Einige Rechte vorbehalten