Debian GNU/Linux auf dem IBM Thinkpad R50p
« zurück (X.org) • Inhalt • (Strom sparen) weiter »
Übersicht
- Das Kernel-Modul ibm_acpi
- acpid - der ACPI daemon
- Beispiel: Schließen des Notebook-Deckels (LID) führt zu StandBy-Modus
- Beispiel: Ereignisse für die Thinkpad Sondertasten einrichten
- StandBy - suspend-to-ram
- Hibernate - suspend-to-disk (suspend2)
ACPI - Advanced Configuration and Power Interface
Das Kernel-Modul ibm_acpi
Das Advanced Configuration and Power Interface (ACPI) löst das alte Advanced Power Management (APM) ab und bietet zusätzliche Funktionen an.
Es kümmert sich somit nicht nur um die Energieverwaltung (Standby-Modus, Rechner nach dem Herunterfahren ausschalten, etc.), sondern verwaltet
z. B. für die Ereignisse (Events) für die Thinkpad Sondertasten. Seit Linux Version 2.6.10 ist ein Kernel Modul speziell für die
ACPI-Funktionen von IBM vorhanden: ibm_acpi
. Damit das Modul beim Systemstart geladen wird, trügt man es in die Datei
/etc/modules
ein:
# /etc/modules [...] # ab linux 2.6.10 ibm_acpi
Mit Laden des Moduls bildet der Kernel dann die ACPI-Funktionalität im proc-Verzeichnis unter /proc/acpi/ibm
ab. Darin
befinden sich dann die Parameter speziell für die IBM Thinkpad Notebooks wie z. B. das ThinkLight.
Beim Laden des Moduls ibm-acpi sind die Hotkeys standardmäßig inaktiv. Um sie beim Laden des Moduls automatisch zu aktivieren, muss man die
dafür nötigen Optionen in die Datei /etc/modprobe.d/ibm-acpi
eintragen. Wenn diese Datei nicht exisitiert, legt man
sie mit einem Texteditor einfach mit folgenden Inhalt neu an:
options ibm_acpi experimental=1 hotkey=enable,0xffef
Der hexadezimale Wert am Ende stellt eine 16-Bit breite Maskierung dar. Mit der Maskierung 0xffef wird auf die Sondertaste Fn+F5 (Bluetooth an/aus) verzichtet, da diese von dem Programm tpb bereit gestellt wird.
acpid - der ACPI daemon
Um auf auftretende Ereignisse (Events) wie z. B. das Schließen des Notebook-Deckels angemessen reagieren zu können, benötigt man den
ACPI-daemon acpid
, der sinnigerweise in dem Paket acpid
abgelegt ist. In seiner Grundkonfiguration
macht er allerdings sehr wenig: Nichts!
Die Konfigurationsdateien des acpid
befinden sich im Verzeichnis /etc/acpi
und den darin enthaltenen
Unterverzeichnis events
. In diesem Unterverzeichnis liegen Dateien, die lediglich aus Kommentaren und der Definition zweier
Werte bestehen: event
und action
. Der Wert event
legt hierbei durch einen
regulären Ausdruck fest, bei welchem Ereignis (zu finden in der Logdatei des acpid, unter /var/log/acpid
) welche Aktion
ausgelöst werden soll. Die Aktion wird durch das angegebene Programm des Wertes action
definiert.
Beispiel: Schließen des Notebook-Deckels (LID) führt zu StandBy-Modus
Hier ein beispielhafter Auszug aus der Logdatei /var/log/acpid
für die Aktion"Deckel (schließen bzw.
öffnen)":
[Sun Jun 18 11:56:18 2006] received event "button/lid LID 00000080 00000001" [Sun Jun 18 11:56:18 2006] executing action "/etc/acpi/lid.sh" [Sun Jun 18 11:56:18 2006] BEGIN HANDLER MESSAGES LID caught [Sun Jun 18 11:56:18 2006] END HANDLER MESSAGES [Sun Jun 18 11:56:18 2006] action exited with status 0 [Sun Jun 18 11:56:18 2006] completed event "button/lid LID 00000080 00000001"
Der Event für den Deckel wird LID bezeichnet. Es tritt sowohl beim Schließen als auch dem Öffnen des Deckels auf. Meist wird als Aktion das Wechseln in den StandBy-Modus oder gar keine Aktion eingestellt. Im ersteren Fall ist es kein Problem, wenn das zweite Ereignis (beim Öffnen des Deckels) erneut auftritt: Da der Rechner "schläft", tritt das Event nicht auf, bzw. der acpid bekommt davon nichts mit.
Wenn man nun möchte, dass beim Schließen des Deckels der Rechner in den StandBy-Modus (suspend-to-ram) geht, muss man zwei Dateien anlegen.
Die erste ist /etc/acpi/events/lid
(der Dateiname ist beliebig, sein Inhalt ist entscheidend) und die dazugehörende
Aktion (ein Shell-Skript) /etc/acpi/lid.sh
. Hier zuerst der Inhalt der Datei /etc/acpi/events/lid
:
# /etc/acpi/events/lid # This is called when the user presses the power button and calls # /etc/acpi/lid.sh for further processing. # Optionally you can specify the placeholder %e. It will pass # through the whole kernel event message to the program you've # specified. event=button[ /]lid action=/etc/acpi/lid.sh
Als Event wird der reguläre Ausdruck button[/ ]lid definiert, den man in der Logdatei wiederfindet (Match ist blau markiert):
[Sun Jun 18 11:56:18 2006] received event "button/lid LID 00000080 00000001"
Hat das Event stattgefunden (sprich: wurde der Ausdruck entdeckt), wird nun also das Skript /etc/acpi/lid.sh
ausgeführt:
#!/bin/sh # /etc/acpi/lid.sh echo "LID caught"
Im Moment tut dieses Skript nichts, außer der Meldung "LID caught" auszugeben, was man an dem oberen Auszug der Logdatei sehen kann. Das Notebook soll jetzt aber schlafen gehen und deshalb ändern wir das Skript folgendermaßen ab:
#!/bin/sh # /etc/acpi/lid.sh exec /etc/acpi/suspend.sh
Das Skript alleine ruft damit nur ein weiteres Skript mit dem Namen suspend.sh
auf, dass sich ebenfalls in dem Verzeichnis
/etc/acpi
befindet. Sinn der Trennung ist es, die Funktionalität in eine separate Datei auszulagern, da es noch weitere
Möglichkeiten gibt, in den StandBy-Modus zu wechseln (z. B. via Fn+F4). Die Datei suspend.sh
hat den folgenden Inhalt:
#!/bin/sh
# /etc/acpi/suspend.sh
# lock KDE session
if ps -Af | grep -q '[k]desktop' && test -f /usr/bin/dcop
then
/usr/bin/dcop --all-sessions --all-users kdesktop KScreensaverIface lock
fi
# obsolete (udev)
#/etc/init.d/hotplug stop
# save state of system clock to hardware clock
#/sbin/hwclock --systohc
# possible string values: standby, mem, disk (dangerous)
echo "mem" > /sys/power/state
# set system clock from hardware clock
/sbin/hwclock --hctosys
# obsolete (udev)
#/etc/init.d/hotplug start
Dazu noch drei Bemerkungen:
- Die eigentliche Funktionalität ist blau markiert.
-
Vor dem Wechsel in den StandBy-Modus sollen alle eventuell laufenden KDE-Sitzungen gesperrt werden. Dafür sorgt der Aufruf mit
dcop
. -
Seit Kernel Version 2.6.15 gibt es udev, den Nachfolger von devfs. Das hat insbesonders Auswirkungen auf die Hotplug-Fähigkeiten (also das
Einbinden von Geräten im laufenden Betrieb, z. B. USB-Geräte wie Memory-Sticks). Vor udev gab es eine Sammlung von Skripten, die diese
Funktionalität bereitgestellt haben und aus dem Tritt kamen, wenn das Notebook aus dem StandBy-Modus zurückkehrte (z. B. USB-Maus bewegte
nicht mehr). Wenn also ein Kernel ohne udev verwendet wird, müssen die beiden Zeilen mit dem
/etc/init.d/hotplug
wieder einkommentiert werden.
Beispiel: Ereignisse für die Thinkpad Sondertasten einrichten
Außer LID gibt es natürlich noch weitere Ereignisse, die abgefangen werden sollen. Das Modul ibm_acpi
liefert
eine Menge weitere Ereignisse für die Fn+{Taste} Kombinationen (Thinkpad Sondertasten). All diese Funktionen können mit einer Datei
/etc/acpi/events/ibm-acpi
abgefangen und verarbeitet werden:
(Quelle: http://linux.spiney.org/book/print/71)
# /etc/acpi/events/ibm-acpi # This is called when the user presses the power button and calls # /etc/acpi/ibm-acpi.sh for further processing. event=ibm/ action=/etc/acpi/ibm-acpi.sh "%e"
Im Gegensatz zu dem LID-event werden hier mit "%e" alle Parameter vom acpid
an das Skript
ibm-acpi.sh
übergeben, die dann in einer case-Schleife in die einzelnen Funktionen aufgesplittet werden:
#!/bin/sh # /etc/acpi/ibm-acpi.sh case "$1" in # Fn+F3 (Backlight?) #"ibm/hotkey HKEY 00000080 00001003") # /root/bin/toggle_backlight # ;; # Fn+F4 (StandBy (suspend-to-ram)) "ibm/hotkey HKEY 00000080 00001004") . /etc/acpi/suspend.sh ;; # disabled via mask in /etc/modprobe.d/ibm-acpi # Fn+F5 (Wireless LAN, Bluetooth, IrDA (Infrarot)) #"ibm/hotkey HKEY 00000080 00001005") # /root/bin/toggle_wlan # ;; # Fn+F7 (Video Select) "ibm/hotkey HKEY 00000080 00001007") [ -f /proc/acpi/ibm/video ] && echo "video_switch" > /proc/acpi/ibm/video ;; # Fn+F12 (Hibernate (suspend-to-disk)) "ibm/hotkey HKEY 00000080 0000100c") /usr/sbin/hibernate ;; # log everything else to syslog *) /usr/bin/logger -i -t "IBM Special Button" $1 ;; esac
Die auskommentierten Programme (/root/bin/...
) für Fn+F3 und Fn+F5 sind bei mir nicht vorhanden. Die verbliebenen
Sondertasten werden von dem Programm tpb
abgedeckt. Darunter fallen: Fn+Pos1 und Fn+End fü das Einstellen der
Helligkeit des Diplays, Fn+BildRauf für das Thinklight und Fn+Leertaste für die ZOOM-Funktion.
Für den Hibernate-Modus (suspend-to-disk) ist das Skript hibernate
notwendig, welches von dem gleichnamigen Paket
bereitgestellt wird. Die richtige Konfiguration von StandBy- und Hibernate-Modus wird nun erläutert.
StandBy- und Hibernate-Modus einrichten
StandBy - suspend-to-ram
Der Wechsel in den StandBy-Modus sollte durch das von der Konfiguration des acpid
bekannten LID-Skripts funktionieren.
Damit das Notebook aber wieder aufwachen kann, muss beim Bootvorgang dem Kernel die Option acpi_sleep=s3_bios
mitgegeben worden sein. Damit das automatisch geschieht, muss man die Datei /boot/grub/menu.lst
wie folgt anpassen
(blau markiert):
# /boot/grub/menu.lst
[...]
# kopt=root=/dev/hda5 ro vga=791 acpi_sleep=s3_bios resume2=swap:/dev/hda6 elevator=cfq
[...]
Hinweis: Anschließend update-grub
ausführen, um die Änderung zu übernehmen!
Den StandBy-Modus kann man testen, indem man als root folgendes Kommando ausführt:
# echo "mem" > /sys/power/state
Um das Notebook wieder aufzuwecken entweder den Deckel zu- und anschließend wieder aufmachen oder Fn+F4 drücken.
Hibernate - suspend-to-disk (suspend2)
Hinweis: Für die hier beschriebene Funktionalität ist ein gepatchter Kernel notwendig!
Wie man den Kernel patcht und kompiliert gibt es in dieser Anleitung zum Herunterladen und Anwenden des suspend2 Kernel-Patch.
Für den komfortablen Wechsel in den Hibernate-Modus bietet das debian-Paket hibernate
ein Skript bereit, dass über
die Dateien im Verzeichnis /etc/hibernate
gesteuert wird. Maßgebend für die Funktion von suspend2 sind die beiden
Dateien common.conf
und suspend2.conf
. Zusätzlich kann man noch einen Splash-Screen
erstellen oder herunterladen, der beim Wechseln von bzw. aus dem Hibernate-Modus angezeigt wird.
Wichtige Änderungen an der Datei /etc/hibernate/common.conf
(allgemein gültige Einstellungen):
# Configuration options common for suspending to disk or RAM. # Options are not case sensitive. # # See hibernate.conf(5) for help on the configuration items. ############################################################################## ### Some global settings ############################################################################## Verbosity 0 LogFile /var/log/hibernate.log LogVerbosity 2 [...] Distribution debian [...] ### Scriptlets [...] ### clock SaveClock restore-only [...] ### fbsplash (enable SwitchToTextMode if you use this) FBSplash on FBSplashTheme suspend2 [...] ### hardware_tweaks IbmAcpi yes ### lock (generally you only want one of the following options) [...] LockKDE yes [...] ### modules [...] UnloadBlacklistedModules yes LoadModules auto LoadModulesFromFile /etc/modules [...] ### network DownInterfaces eth0 ath0 UpInterfaces auto [...] ### xhacks SwitchToTextMode yes [...]
Bei Verwendung eines anderen Desktop Environments als KDE muss die Lock-Sektion entsprechend angepasst werden. Die vom Paket bereitgestellte Datei beinhaltet ein paar Beispiele, die nur einkommentiert werden müssen.
Wichtiger für die Funktionalität ist die Datei /etc/hibernate/suspend2.conf
:
# Example suspend2.conf file.
#
# See hibernate.conf(5) for help on the configuration items.
#
[...]
### suspend2 (for Software Suspend 2)
UseSuspend2 yes
Reboot no
EnableEscape yes
DefaultConsoleLevel 1
Compressor lzf
Encryptor none
# ImageSizeLimit 200
## useful for initrd usage:
SuspendDevice swap:/dev/hda6
## Powerdown method - 3 for suspend-to-RAM, 4 for ACPI S4 sleep, 5 for poweroff
PowerdownMethod 5
[...]
## Specify a userui like this:
ProcSetting userui_program /usr/sbin/suspend2ui_fbsplash
Include common.conf
Hinweis: Die Position der Swap-Partition ist entsprechend anzupassen!
Wie bereits erwähnt muss der gesammte Hauptspeicher in diese Partition gesichert werden und es muss genügend Platz für ggf. bereits ausgelagerte Speicherseiten sein. Trotz der anschließenden Komprimierung sollte die Größe der Swap-Partition deshalb in etwa doppelt so groß sein wie Hauptspeicher im Rechner vorhanden ist.
Für das entsprechende Eye-Candy sorgt nun das Paket suspend2-userui
, das das auf der Framebuffer-Konsole aufbauendes
Programm namens suspend2ui_fbsplash
beinhaltet. Die Konfiguration hierfür ist einfach:
- Zuerst benötigt man ein Theme, z. B. von http://wiki.suspend2.net/UserUI/Themes oder auch das von mir angepasste Theme NCC1701-D (Enterprise).
-
Das heruntergeladene Theme extrahiert man in das Verzeichnis
/etc/splash
, das evtl. vorher angelegt werden muss. -
Das Programm
suspend2ui_fbsplash
sucht immer nach dem Theme an der Stelle/etc/splash/suspend2
. Somit ist noch ein Link auf das zu verwendende Theme anzulegen.
Hier der oben beschriebene Ablauf mit {Theme} als Platzhalter für den Namen und /var/tmp/{Theme}.tar.bz2
als temporärer Speicherort des Themes:
# mkdir /etc/splash # cd /etc/splash # tar xjf /var/tmp/{Theme}.tar.bz2 # ln -s {Theme} suspend2
Dank dem Kernel mit suspend2 Kernel-Patch und dem hibernate-Skript sollte das suspend-to-disk nun funktionieren. Wenn die Sondertasten via ACPI richtig konfiguriert worden sind, sollte sich das Notebook nun mit Fn+F12 in den Tiefschlaf versetzen lassen. Mit dem Theme NCC1701-D sieht das dann in etwa so aus: