Debian GNU/Linux auf dem IBM Thinkpad R50p

« zurück (X.org)Inhalt(Strom sparen) weiter »

Übersicht

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.

« zurück (Übersicht)

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.

« zurück (Übersicht)

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.

« zurück (Übersicht)

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.

« zurück (Übersicht)

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.

« zurück (Übersicht)

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:

Enterprise NCC1701-D

« zurück (X.org)Inhalt(Strom sparen) weiter »