Nov 09 2009

Configuration avancée du Thinkpad T43 sous Debian Etch

Category: Configuration,Linux

Résumé

Cette page décrit comment configurer et optimiser le système d'exploitation GNU/Linux Debian Etch sur un ordinateur portable Thinkpad T43 (2668WR9) en utilisant le noyau (kernel) 2.6.20 et les pilotes propriétaires ATI.
On suppose que le système d'exploitation de base est déjà installé; l'installation ne pose aucun problème particulier si l'on a la bonne idée de la lancer en passant l'option libata.atapi_enabled=1 au kernel.
Ne pas hésiter à me faire part de toute remarque qui pourrait améliorer cette documentation.

Les commandes délimitées par un filet rouge comme celle-ci une commande sont à exécuter en tant que root.
Les commandes "dans le texte" sont notées ainsi: une commande.

Sommaire de la page


/etc/apt/sources.list

Le fichier /etc/apt/sources.list contient ces lignes:
## Stable ##
deb http://security.debian.org/ stable/updates main contrib non-free
deb ftp://ftp.fr.debian.org/debian stable main contrib non-free
deb-src  ftp://ftp.fr.debian.org/debian stable main contrib non-free

## Testing ##
#deb  ftp://ftp.fr.debian.org/debian/ testing main contrib non-free

## unstable ##
deb-src ftp://ftp.fr.debian.org/debian unstable main contrib non-free
#deb ftp://ftp.fr.debian.org/debian unstable main contrib non-free

# mplayer,acidrip, acroread, acroread-plugins, autopano-sift...
deb http://www.debian-multimedia.org stable main

# Emacs-snapshot
deb http://emacs.orebokech.com sarge main
deb-src http://emacs.orebokech.com sarge main

Compilation du kernel

Commençons par installer le minimum requis pour les opérations à venir:
su && apt-get install kernel-package ncurses-dev fakeroot wget bzip2 unzip gzip


On se place dans un répertoire où l'utilisateur à tous les droits.
Pour ma part j'utilise /usr/local/pi/src/kernel/
su && mkdir /usr/local/pi && chown pi:pi /usr/local/pi && exit
mkdir -p /usr/local/pi/src/kernel/ && cd /usr/local/pi/src/kernel/
# Téléchagement du kernel et de la signature
wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.bz2
wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.bz2.sign
# On vérifie que le fichier n'est pas corrompu
gpg --verify linux-2.6.20.tar.bz2.sign


On doit obtenir une sortie de ce genre:
gpg: Signature made dim 04 fév 2007 20:08:30 CET using DSA key ID 517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key <ftpadmin@kernel.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E


Télécharger le patch Suspend2 pour ce kernel:
wget http://www.suspend2.net/downloads/all/suspend2-2.2.9-for-2.6.20.patch.bz2


Configuration

On peut voir ici le fichier de configuration que j'utilise pour compiler le kernel.
Le code suivant se charge de décompresser le kernel et de rapatrier mon fichier de configuration.
tar xjf linux-2.6.20.tar.bz2
wget -O linux-2.6.20/.config http://www.piprime.fr/files/articles/linux/config/t43/includes/config-2.6.20
make oldconfig


Notes importantes:
  • J'ai choisi d'activer le support pour les périphériques 'frame buffer' (CONFIG_FB=y) et les pilotes VESA VGA graphics (CONFIG_FB_VESA=y) ce qui n'est pas recommandé pour utiliser les pilotes propriétaires ATI fglrx.
    Je les utilise pourtant mais il faut prendre soin de passer les bons paramètres au kernel dans le boot loader (voir la section sur Boot loader).
    Ce qui est recommandé:
    CONFIG_FB is not set
    CONFIG_FB_VESA=y is supposed to work, but it appears that it can cause "mtrr overlapping" errors;
    CONFIG_FB_RADEON=y definitely causes problems, so disable it.
        

    Voir ici pour plus d'informations.
  • Depuis la version 2.6.16 du kernel, le support pour iptables est désactivé. Mon fichier de configuration le réactive mais je pense qu'il est loin d'être optimisé à ce sujet.
  • Pour modifier ou visualiser facilement le fichier de configuration avant de compiler le noyau exécuter cette commande:
    make menuconfig
        

Patch et compilation

Avant de 'patcher' le noyau il faut effectuer une première compilation (le temps d'une bonne Guiness):
cd linux-2.6.20
make


On peut maintenant 'patcher' le noyau pour Suspend2:
bzcat ../suspend2-2.2.9-for-2.6.20.patch.bz2 | patch -p1


Dans le fichier .config qui a été modifié par le 'patch', il faut modifier les variables suivantes comme suit:
CONFIG_SUSPEND2=y
CONFIG_SUSPEND2_FILE=y
CONFIG_SUSPEND2_SWAP=y
CONFIG_CRYPTO_LZF=y

On peut aussi utiliser la commande suivante et aller dans les menus Power Management options et Cryptograpic options.
make menuconfig
  

Création et installation du paquet non-initrd kernel pour Debian

make-kpkg clean && fakeroot make-kpkg --revision=T43.1.0 kernel_image
cd ..
su && dpkg -i linux-image-2.6.20_T43.1.0_i386.deb


L'opération suivante est importante pour la suite de la configuration.
Il est préférable voir indispensable, pour compiler les pilotes extérieurs au kernel, que le lien symbolique /usr/src/linux pointe vers le répertoire contenant les sources du noyau.
Certaines futures commandes dans ce tutoriel ne doivent pas être exécutées tant que cette étape ne s'est pas correctement déroulée.
[ -h /usr/src/linux ] && rm -f /usr/src/linux
ln -s /usr/local/pi/src/kernel/linux-2.6.20 /usr/src/linux


Boot loader (chargeur d'amorçage)

J'ai choisi Grub comme chargeur d'amorçage; il faudra adapter la syntaxe pour les autres chargeurs mais les options du noyau restent les mêmes.
Commencer par récupérer la taille de la mémoire de la carte vidéo (ici [size=128M]):
lspci -v | less # Taper 'q' pour sortir.


Il faut chercher une ligne ressemblant à celle pointée par la flèche:
...

01:00.0 VGA compatible controller: ATI Technologies Inc M22 [Radeon Mobility M300] (prog-if 00 [VGA])
        Subsystem: IBM Unknown device 056e
        Flags: bus master, fast devsel, latency 0, IRQ 169
        Memory at c0000000 (32-bit, prefetchable) [size=128M] <---- INFORMATION ICI
        I/O ports at 3000 [size=256]
        Memory at a8100000 (32-bit, non-prefetchable) [size=64K]
        [virtual] Expansion ROM at a8120000 [disabled] [size=128K]
...

Ce qui permet de passer l'option vram:128 au noyau par le fichier /boot/grub/menu.lst
Dans les lignes suivantes (à copier dans /boot/grub/menu.lst), /dev/sda3 correspond à la partition où sont installés GNU/Linux et /dev/sda6 à la SWAP.
Si l'on ne connaît pas ses partitions sur le bout des doigts, il suffit de faire un fdisk -l en tant que root.
Pour avoir une session en mode console qui corresponde à la résolution de votre écran il faut choisir la valeur du paramètre vga parmi ces valeurs suivant la résolution de votre moniteur:
Nombre de couleurs 640x480 800x600 1024x768 1280x1024 1600x1200 1400x1050
8 bits ( 256 ) 769 771 773 775 796 ???
15 bits ( 32768 ) 784 787 790 793 797 ???
16 bits ( 65536 ) 785 788 791 794 798 834
24 bits ( 16,8 M ) 786 789 792 795 799 835
32 bits ( 16,8 M étendu ) ??? ??? ??? ??? ??? 836

J'insiste: /dev/sda3, vram:128, vga=836 et /dev/sda6 sont à adapter à votre configuration.
title   Debian, kernel 2.6.20
root    (hd0,2)
kernel  /boot/vmlinuz-2.6.20 root=/dev/sda3 ro video=vesafb,nomtrr,ywrap,vram:128 vga=836 acpi_sleep=s3_bios resume2=swap:/dev/sda6 elevator=cfq ide1=noprobe libata.atapi_enabled=1
savedefault
boot

title   Debian, kernel 2.6.20 (recovery mode)
root    (hd0,2)
kernel  /boot/vmlinuz-2.6.20 root=/dev/sda3 ro single
boot

Quelques explications sur les paramètres du noyau se trouve ici.
Un bon conseil: passer à tous les autres noyaux du menu les deux options noresume noresume2 afin d'éviter de reprendre une hibernation du 2.6.20 avec un noyau différent; cela provoquerait une corruption irréversible du système de fichier.

Rebouter sur le nouveau kernel maintenant. À tout de suite, j'espère...

Le modem

Identification

Si l'on connaît exactement le modèle du modem, on peut passer à l'étape «installation».
Si vous avez encore Windows installé, le plus simple est de rebouter dessus et de noter très exactement le modèle du modem mais on peut s'en sortir sans avoir à rebouter:
cd /usr/local/pi/src/
mkdir modem
cd modem
wget http://linmodems.technion.ac.il/packages/scanModem.gz
gunzip scanModem.gz && chmod u+x scanModem && su && ./scanModem
less Modem/ModemData.txt && exit


Installation des pilotes

Après avoir identifié le modem on consultera la page: http://thinkwiki.org/wiki/Modem_Devices
Le mien est un Conexant IBM Integrated 56K Modem (MDC-2)
J'utilise le pilote payant (20$) linuxant:
[ -e /usr/local/pi/src/modem/ ] || mkdir /usr/local/pi/src/modem/


Télécharger dans /usr/local/pi/src/modem/ le pilote ici puis exécuter ce code:
cd /usr/local/pi/src/modem/
unzip hsfmodem_7.60.00.04full_i386.deb.zip
su && dpkg -i hsfmodem_7.60.00.04full_i386.deb && exit
  

On obtiendra une sortie de ce genre:
Note: HDA support not compiled in the driver (requires a 2.6.16 or later kernel)

Config for modem unit 0: /dev/ttySHSF0
        Device instance: 0-PCI-8086:266d-1014:0574
        HW revision    : CXT23 SSD=20 LSD=0x10
        HW profile name: hsfmc97ich
        Registration ID: PROTECTED
        License owner  : PROTECTED
        License key    : PROTECTED
        License status : OK
        Current region : FRANCE (T.35 code: 003D)

The /dev/modem alias (symlink) points to ttySHSF0

Pour configurer la connexion, on peut utiliser kppp. Il faut cependant appartenir au groupe dip.
Pour le vérifier, lancer la commande suivante dans votre shell.
id -Gn
  

Si nécessaire, lancer la commande suivante et se 'relogguer':
adduser votre_loggin dit
  

Notes utiles:
  • si la licence n'a pas été rentrée lors de l'installation, le modem est bridé.
    Pour entrer la licence, il suffit d'exécuter en tant que root la commande hsfconfig --license;
  • les pilotes du modem peuvent être manuellement déchargés avec la commande hsfstop;
  • pour désinstaller les pilotes du système il suffit de lancer la commande (toujours en tant que root) hsfconfig --uninstall;
  • s'il y a des déconnexions fréquentes ou une mauvaise connexion, il faut vérifier les dernières informations de statuts.
    Elles peuvent être obtenues soit avec la commande modem AT#UG ou avec cat /proc/driver/hsf/0/lastcallstatus.
    Alternativement le pilote peut être configuré pour enregistrer les données lors d'un mauvais fonctionnement en ajoutant le paramètre loglastcallstatus=1 à l'option hsfserial dans /etc/modules.conf.

La carte graphique

Installation des pilotes propriétaires ATI

mkdir /usr/local/pi/src/ati

Télécharger dans le répertoire /usr/local/pi/src/ati le fichier correspondant à votre carte depuis http://ati.amd.com/support/driver.html. En tant que root:
cd /usr/local/pi/src/ati
apt-get install debhelper module-assistant libstdc++5 fontconfig libgcc
sh ./ati-driver-installer-8.36.5-x86.x86_64.run --buildpkg Debian/etch
dpkg -i *.deb
cd /usr/src
module-assistant prepare
module-assistant a-i fglrx
cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
aticonfig -f --initial --input=/etc/X11/xorg.conf
echo "fglrx" >> /etc/modules


Voici le contenu de mon fichier xorg.conf (source d'inspiration):
# /etc/X11/xorg.conf (xorg X Window System server configuration file)
#
# Edit this file with caution, and see the /etc/X11/xorg.conf manual page.
# (Type "man /etc/X11/xorg.conf" at the shell prompt.)
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
#   sudo dpkg-reconfigure -phigh xserver-xorg

Section "dri"
# Access to OpenGL ICD is allowed for all users:
    Mode 0666
# Access to OpenGL ICD is restricted to a specific user group:
#    Group 100    # users
#    Mode 0660
EndSection

Section "Files"
	FontPath     "/usr/share/fonts/X11/misc"
	FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
	FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
	FontPath     "/usr/share/fonts/X11/Type1"
        FontPath     "/usr/X11R6/lib/X11/fonts/Speedo/"
	FontPath     "/usr/share/fonts/X11/100dpi"
	FontPath     "/usr/share/fonts/X11/75dpi"
	FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"

# This loads the DBE extension module.

Load        "dbe"  	# Double buffer extension

# This loads the miscellaneous extensions module, and disables
# initialisation of the XFree86-DGA extension within that module.
SubSection  "extmod"
   Option    "omit xfree86-dga"   # don't initialise the DGA extension
EndSubSection

# This loads the Type1 and FreeType font modules
Load        "type1"
Load        "freetype"

# This loads the GLX module
Load        "glx"   # libglx.a
Load        "dri"   # libdri.a

EndSection

Section "Extensions"
     Option  "Composite" "Disable"  #make DRI work with fglrx.
 EndSection

Section "ServerFlags"
# To disable the <Crtl><Alt><KP_+>/<KP_-> mode switching
# sequences.
#    Option "Dont Zoom"

# take a look to http://geeks-have-feelings-too.net/ati-driver-problem-aiglx-error-dricreatenewscreen/
    Option "AIGLX" "off"
EndSection

Section "InputDevice"
	Identifier  "Generic Keyboard"
	Driver      "kbd"
	Option	    "CoreKeyboard"
	Option	    "XkbRules"     "xorg"
	Option	    "XkbModel"     "pc105"
	Option	    "XkbLayout"    "fr"
	Option	    "XkbVariant"   "nodeadkeys"
EndSection

Section "InputDevice"
	Identifier  "Trackpoint"
	Driver      "mouse"
	Option	    "CorePointer"
	Option	    "Device" "/dev/input/mice"
	Option	    "Protocol" "ImPS/2"
EndSection

Section "InputDevice"
	Identifier  "Synaptics Touchpad"
	Driver      "synaptics"
	Option	    "SendCoreEvents"    "true"
	Option	    "Device"            "/dev/psaux"
        Option	    "Protocol"          "auto-dev"
	Option      "SHMConfig"		"true"
	Option      "CircularScrolling"	"true"
	Option      "CircScrollTrigger"	"8"
        Option	    "HorizScrollDelta"  "0"
EndSection

Section "InputDevice"
	Identifier "External USB Mouse"
	Driver     "mouse"
	Option     "Device"          "/dev/input/mouse1"
	Option     "SendCoreEvents"  "true"
	Option     "Protocol"        "ImPS/2"
	Option     "Emulate3Buttons" "false"
	Option     "ZAxisMapping"    "4 5"
	Option     "EmulateWheel"    "false"
EndSection


Section "Monitor"
    Identifier "Monitor[0]"
EndSection

Section "Monitor"
    Identifier "Monitor[1]"
EndSection

Section "Device"
     Identifier "Device[0]"
     Driver      "fglrx"
# ### generic DRI settings ###
# === disable PnP Monitor  ===
    #Option                              "NoDDC"
# === disable/enable XAA/DRI ===
    Option "no_accel"                   "no"
    Option "no_dri"                     "no"
# === misc DRI settings ===
    Option "mtrr"                       "off" # disable DRI mtrr mapper, driver has its own code for mtrr
# ### FireGL DDX driver module specific settings ###
# === Screen Management ===
#    Option "DesktopSetup"               "(null)"
# === TV-out Management ===
    Option "TVFormat"                   "PAL-B"
    Option "TVStandard"                 "VIDEO"
    Option "TVHSizeAdj"                 "0"
    Option "TVVSizeAdj"                 "0"
    Option "TVHPosAdj"                  "0"
    Option "TVVPosAdj"                  "0"
    Option "TVHStartAdj"                "0"
    Option "TVColorAdj"                 "0"
    Option "GammaCorrectionI"           "0x00000000"
    Option "GammaCorrectionII"          "0x00000000"
# === OpenGL specific profiles/settings ===
    Option "Capabilities"               "0x00000000"
    Option "CapabilitiesEx"             "0x00000000"

# === Uncomment if you encounter problems with mpalyer === Begin
#    Option "OpenGLOverlay"              "off"
#    Option "PseudoColorVisuals"         "off"
#    Option "VideoOverlay"               "on"
#..................................................... === End

# === Center Mode (Laptops only) ===
    Option "CenterMode"                 "off"
# === QBS Management ===
    Option "Stereo"                     "off"
    Option "StereoSyncEnable"           "1"
# === FSAA Management ===
    Option "FSAAEnable"                 "no"
    Option "FSAAScale"                  "1"
    Option "FSAADisableGamma"           "no"
    Option "FSAACustomizeMSPos"         "no"
    Option "FSAAMSPosX0"                "0.000000"
    Option "FSAAMSPosY0"                "0.000000"
    Option "FSAAMSPosX1"                "0.000000"
    Option "FSAAMSPosY1"                "0.000000"
    Option "FSAAMSPosX2"                "0.000000"
    Option "FSAAMSPosY2"                "0.000000"
    Option "FSAAMSPosX3"                "0.000000"
    Option "FSAAMSPosY3"                "0.000000"
    Option "FSAAMSPosX4"                "0.000000"
    Option "FSAAMSPosY4"                "0.000000"
    Option "FSAAMSPosX5"                "0.000000"
    Option "FSAAMSPosY5"                "0.000000"
# === Misc Options ===
    Option "UseFastTLS"                 "2"
    Option "BlockSignalsOnLock"         "on"
    Option "UseInternalAGPGART"         "no"
    Option "ForceGenericCPU"            "no"
    Option "KernelModuleParm"		"agplock=0"
    BusID "PCI:1:0:0"    # vendor=1002, device=3154
    Screen 0
EndSection

Section "Device"
    Identifier  "Device[1]"
    Driver      "fglrx"
    BusID "PCI:1:0:0"    # vendor=1002, device=3154
    Screen 1
EndSection


Section "Screen"
	Identifier "Screen[0]"
	Device     "Device[0]"
	Monitor    "Monitor[0]"
	DefaultDepth     24
	SubSection "Display"
		Depth     24
                Modes     "1400x1050" "1280x1024" "1024x768" "800x600" "640x480"
		Viewport   0 0
	EndSubSection
EndSection

Section "Screen"
	Identifier "Screen[1]"
	Device     "Device[1]"
	Monitor    "Monitor[1]"
	DefaultDepth     24
	SubSection "Display"
		Depth     24
                Modes     "1024x768" "800x600" "640x480"
		Viewport   0 0
	EndSubSection
EndSection


# **********************************************************************
# ServerLayout sections.
# **********************************************************************

# Any number of ServerLayout sections may be present.  Each describes
# the way multiple screens are organised.  A specific ServerLayout
# section may be specified from the X server command line with the
# "-layout" option.  In the absence of this, the first section is used.
# When now ServerLayout section is present, the first Screen section
# is used alone.

Section "ServerLayout"
	Identifier     "Default Layout"
# Each Screen line specifies a Screen section name, and optionally
# the relative position of other screens.  The four names after
# primary screen name are the screens to the top, bottom, left and right
# of the primary screen.
	Screen         "Screen[0]"
        Screen         "Screen[1]" RightOf "Screen[0]"
	InputDevice    "Generic Keyboard"
	InputDevice    "Trackpoint"
	InputDevice    "Synaptics Touchpad"
	InputDevice	"External USB Mouse"
EndSection

Remarques importantes :
  • Sans modification du fichier xorg.conf généré par aticonfig, j'obtiens une erreur dans les log de xorg.
    La commande grep fglrx /var/log/Xorg.0.log retourne:
    (EE) AIGLX error: dlsym for __driCreateNewScreen_20050727 failed (/usr/lib/dri/fglrx_dri.so: undefined symbol: __driCreateNewScreen_20050727)
    (EE) AIGLX: reverting to software rendering

    Pour y remédier il faut désactiver le support AIGLX (cf. driver-problem-aiglx-error-dricreatenewscreen).
    Section "ServerFlags"
        Option "AIGLX" "off"
    EndSection

  • Pour que le DRI fonctionne correctement il paraît qu'il faut ajouter ces lignes (je n'ai pas vraiment vu de différence avec ou sans..)
    Section "Extensions"
        Option  "Composite" "Disable"  #make DRI work with fglrx.
    EndSection

Redémarrer le serveur X:
/etc/init.d/kdm restart || /etc/init.d/gdm restart || init 3


Pour limiter la dépense d'énergie:
aticonfig  --set-powerstate=1


Quelques tests

Sortie de la commande LIBGL_DEBUG=verbose fglrxinfo
libGL: XF86DRIGetClientDriverName: 8.36.5 fglrx (screen 0)
libGL: OpenDriver: trying /usr/lib/dri/fglrx_dri.so
libGL: XF86DRIGetClientDriverName: 8.36.5 fglrx (screen 0)
drmOpenByBusid: busid is PCI:1:0:0
drmOpenDevice: minor is 0
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 4, (OK)
drmOpenByBusid: drmOpenMinor returns 4
drmOpenByBusid: drmGetBusid reports PCI:1:0:0
Can't open configuration file /etc/drirc: No such file or directory.
Can't open configuration file /home/pi/.drirc: No such file or directory.
display: :0.0  screen: 0
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: ATI MOBILITY RADEON X300
OpenGL version string: 2.0.6458 (8.36.5)

Le message Can't open configuration file /etc/drirc: No such file or directory montre qu'il n'y pas de fichier de configuration.
Pour le créer il suffit d'installer driconf:
apt-get install driconf && exit && driconf


On peut alors copier le fichier ~/.drirc généré dans /etc/.
Sortie de la commande fgl_glxgears
Using GLX_SGIX_pbuffer
1126 frames in 5.0 seconds = 225.200 FPS
1379 frames in 5.0 seconds = 275.800 FPS
1367 frames in 5.0 seconds = 273.400 FPS

Sortie de la commande fgl_glxgears -fbo
Using GL_EXT_framebuffer_object
481 frames in 5.0 seconds = 96.200 FPS
493 frames in 5.0 seconds = 98.600 FPS
494 frames in 5.0 seconds = 98.800 FPS

Le Wifi

Tout est expliqué à l'adresse http://www.thinkwiki.org/wiki/Ipw2200#Installation
La configuration de mon noyau suit exactement les recommandations pour l'installation depuis les sources.
À la fin de l'installation j'obtiens le message suivant (que j'ignore):
Don't forget to copy firmware to your hotplug's firmware directory and have the
hotplug tools in place.

On peut compléter l'installation avec wireless-tools:
apt-get install wireless-tools
echo "options ipw2200 disable=1" > /etc/modutils/ipw2200 && update-modules


J'active et désactive la carte avec la touche de fonction Fn F6, voir la section ACPI.

ACPI

Il s'agit ici de configurer les touches de fonction propre au Thinkpad.
Pour les touches standards (luminosité, volume, Access IBM, loupiote) j'utilise tpb.
Les touches concernant l'hibernation sont capturées par le processus acpid et utilisent les fonctionnalités de Suspend2 qui ont été ajoutées par le 'patch' du kernel.
apt-get install acpid tpb hibernate hdaps-utils


Le répertoire /etc/acpi/ est organisé ainsi (retour de la commande tree -r /etc/acpi/ ):
/etc/acpi/
|-- powerbtn.sh
|-- ibm-acpi.sh
|-- hibernate_lid.sh
|-- fglrx-powermode.sh
`-- events
    |-- powerbtn
    |-- lid
    `-- ibm-acpi

Les fichiers powerbtn, lid et ibm-acpi décrivent les actions associés aux événements:
cat /etc/acpi/events/powerbtn
event=button[ /]power
action=/etc/acpi/powerbtn.sh

cat /etc/acpi/events/lid
event=button[ /]lid
action=/etc/acpi/hibernate_lid.sh

cat /etc/acpi/events/ibm-acpi
event=(ibm/|ac_adapter)
action=/etc/acpi/ibm-acpi.sh "%e"

Après avoir modifié des fichiers du répertoire /etc/acpi/events/ il ne faut pas oublier de redémarrer le démon:
/etc/init.d/acpid reload


Voici le contenu des fichiers ibm-acpi.sh, fglrx-powermode.sh, hibernate_lid.sh et powerbtn.sh du répertoire /etc/acpi/
cat /etc/acpi/ibm-acpi.sh
#!/bin/bash

FANCONTROL="tp-fancontrol -u"

case "$1" in
        #Fn+F1
    "ibm/hotkey HKEY 00000080 00001001")
        /usr/bin/logger -i -t "IBM Button F1 not implemented"
        ;;
        # Fn+F12
    "ibm/hotkey HKEY 00000080 0000100c")
        $FANCONTROL
        /usr/sbin/hibernate -F /etc/hibernate/suspend2.conf
        ;;
        # Fn+F4
    "ibm/hotkey HKEY 00000080 00001004")
        $FANCONTROL
        /usr/sbin/hibernate -F /etc/hibernate/ram.conf
        ;;
        # Fn+F6
    "ibm/hotkey HKEY 00000080 00001006")
        ## toggle wlan
        if lsmod | grep -q ipw2200 ; then
            rmmod ipw2200
        else
            modprobe ipw2200 led=1
        fi
        ;;
        # Fn+F8
    "ibm/hotkey HKEY 00000080 00001008")
        # irda
        /usr/bin/logger -i -t "IBM Button $1 not implemented"
        ;;
        # Fn+F3
    "ibm/hotkey HKEY 00000080 00001003")
        /etc/acpi/fglrx-powermode.sh --light
        ;;
    "ac_adapter AC 00000080 00000001" | "ac_adapter AC 00000080 00000000")
        /etc/acpi/fglrx-powermode.sh
        ;;
    *)
        # log everything else to syslog
        /usr/bin/logger -i -t "IBM Special Button" $1
        ;;

cat /etc/acpi/fglrx-powermode.sh
#!/bin/bash

RADEONTOOL='/usr/sbin/radeontool'

# spindown time for HD (man hdparm for valid values)
# I prefer 2 hours for acad and 2 min for batt
ACAD_HD=244
BATT_HD=24

# Power management level
# 255 (off) on AC
# 128 (medium) on batt
ACAD_PM=255
BATT_PM=128

light=0
while true
do
    case $1 in
        --light)
            light=1
            ;;
        *)
            break
            ;;
    esac
    shift
done

getXuser() {
    user=`finger| grep -m1 ":$displaynum " | awk '{print $1}'`
    if [ x"$user" = x"" ]; then
        user=`finger| grep -m1 ":$displaynum" | awk '{print $1}'`
    fi
    if [ x"$user" != x"" ]; then
        userhome=`getent passwd $user | cut -d: -f6`
        export XAUTHORITY=$userhome/.Xauthority
    else
        export XAUTHORITY=""
    fi
}

$RADEONTOOL light | grep -qe "off$"
light_off=$?

[ "$light" = "0" ] && sleep 5 # Wait update ac_adapter state
if grep -q off-line /proc/acpi/ac_adapter/*/state; then
    on_dc=1
else
    on_dc=0
fi


if [ ${light_off} -eq 1 -o ${on_dc} -eq 1 ]; then
    /usr/bin/logger "fglrx: setting low power"
    for x in /tmp/.X11-unix/*; do
        displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
        getXuser;
        if [ x"$XAUTHORITY" != x"" ]; then
            export DISPLAY=":$displaynum"
            powermode=`/usr/bin/aticonfig --lsp | grep -m1 low | cut -b 3-3`
            if [ x"$powermode" != x"" ]; then
                su $user -c "/usr/bin/aticonfig --set-powerstate=$powermode --effective=now" &>/dev/null
            fi
        fi
    done
    [ "$light" = "1" ] && $RADEONTOOL light off
    test -e /sbin/laptop_mode && /sbin/laptop_mode start && /usr/bin/logger "Running /sbin/laptop_mode start"
    /usr/bin/logger "Setting HD spindown with hdparm -S $BATT_HD /dev/sda."
    /sbin/hdparm -S $BATT_HD /dev/sda > /dev/null 2>&1
    /usr/bin/logger "Setting HD powersaving with hdparm -B $BATT_PM /dev/sda."
    /sbin/hdparm -B $BATT_PM /dev/sda > /dev/null 2>&1
else
    /usr/bin/logger "fglrx: setting default powermode"
    for x in /tmp/.X11-unix/*; do
        displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
        getXuser;
        if [ x"$XAUTHORITY" != x"" ]; then
            export DISPLAY=":$displaynum"
            powermode=`/usr/bin/aticonfig --lsp | grep -m1 default | cut -b 3-3`
            if [ x"$powermode" != x"" ]; then
                su $user -c "/usr/bin/aticonfig --set-powerstate=$powermode --effective=now" &>/dev/null
            fi
        fi
    done
    [ "$light" = "1" ] && $RADEONTOOL light on
    test -e /sbin/laptop_mode && /sbin/laptop_mode stop && /usr/bin/logger "Running /sbin/laptop_mode stop"
    logger "Setting HD spindown hdparm -S $ACAD_HD /dev/sda."
    /sbin/hdparm -S $ACAD_HD /dev/sda > /dev/null 2>&1
    logger "Setting HD powersaving hdparm -B $ACAD_PM /dev/sda."
    /sbin/hdparm -B $ACAD_PM /dev/sda > /dev/null 2>&1
fi

cat /etc/acpi/hibernate_lid.sh
#!/bin/bash

#Ne Rien faire si l'écran est ouvert.
grep -q open /proc/acpi/button/lid/LID/state && exit 0
#Sinon hiberner dans la RAM...
tp-fancontrol -u
/usr/sbin/hibernate -F /etc/hibernate/ram.conf

cat /etc/acpi/powerbtn.sh
# If powersaved is running, let it process the acpi event
if pidof powersaved; then
    exit 0
fi

if ps -Af | grep -q '[k]desktop' && test -f /usr/bin/dcop
then
    dcop --all-sessions --all-users ksmserver ksmserver logout 0 2 0 && exit 0
else
    /sbin/shutdown -h now "Power button pressed"
fi

Ces scripts font appel aux fichiers de configuration de hibernate.
cat /etc/hibernate/common.conf
Verbosity 0
LogFile /var/log/hibernate.log
LogVerbosity 1
Distribution debian

SaveClock restore-only

### devices
# IncompatibleDevices /dev/dsp /dev/video*

### diskcache
# DisableWriteCacheOn /dev/hda

### filesystems
UnmountFSTypes smbfs nfs

### hardware_tweaks
IbmAcpi yes

### modules
UnloadBlacklistedModules yes
LoadModules auto

### xhacks
SwitchToTextMode yes

cat /etc/hibernate/ram.conf
TryMethod ususpend-ram.conf
TryMethod sysfs-ram.conf
RadeonTool yes

cat /etc/hibernate/suspend2.conf
### suspend2 (for Software Suspend 2)
UseSuspend2 yes
Reboot no
EnableEscape yes
DefaultConsoleLevel 1
Compressor lzf
Encryptor none

# For fglrx
ProcSetting extra_pages_allowance 20000

# Scale CPU to full speed to make sure we suspend as fast as possible.
FullSpeedCPU yes

Include common.conf

Gestion de la fréquence de la CPU

On peut utiliser le logiciel cpufreqd avec le fichier de configuration etc/cpufreqd.conf
apt-get install cpufreqd


mais je préfère toujours travailler en mode ondemand pour limiter l'activité du ventilateur, voir la section Démarrage personnalisé

Pour surveiller le bon fonctionnement du système on peut utiliser gkrellm et se confectionner quelques scripts pour les alarmes:
apt-get install gkrellm gkrellm-x86info


Démarrer gkrellm et presser F1 pour le configurer.
On peut voir ici ce que j'obtiens.

Démarrage personnalisé

Pour la gestion du ventilateur j'utilise le script tp-fancontrol script.
Voici le script /etc/init.d/personal qui est lancé à chaque démarrage du système:
#! /bin/sh

PROGRAM="/usr/bin/tp-fancontrol"
PARAMS="-l -s 8 -d"

checkconfig() {
        if [ ! -e /proc/acpi/ibm/fan ]; then
                echo "The ibm_acpi module must be loaded with \"experimental=1\" to use \"pt-fancontrol\""
                return 1
        fi
}

case "$1" in
    start)
        echo "Loading personal parameters."
        echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
        echo "scaling_governor : "`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`
        checkconfig && $PROGRAM $PARAMS && echo "tp-fancontrol : started"

        # fix dvd and cdrom links
        rm -f /dev/cdrom /dev/dvd
        if grep -q MATSHITA /proc/scsi/scsi
        then
        # running libata enabled kernel
            ln -s /dev/sr0 /dev/cdrom
            ln -s /dev/sr0 /dev/dvd
            logger "linking /dev/sr0 to /dev/dvd"
        else
        # running kernel with only IDE support
            ln -s /dev/hdc /dev/cdrom
            ln -s /dev/hdc /dev/dvd
            logger "linking /dev/hdc to /dev/dvd"
        fi
        ;;
    stop)
        echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
        echo "scaling_governor : "`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`
        $PROGRAM -k
        ;;
    reload|restart|force-reload)
        echo "Stoping personal parameters."
        $0 stop
        sleep 1
        $0 start
        ;;
    *)
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        exit 1
        ;;
esac

exit 0

Après avoir copier ce script dans le fichier /etc/init.d/personal il faut exécuter la commande suivante pour qu'il soit exécuté à chaque démarrage du système:
update-rc.d personal defaults


Pour supprimer un service au démarrage on utilise la commande suivante:
update-rc.d -f SERVICE remove


Le lecteur d'empruntes

Il n'est pas configuré mais cela ne semble pas poser de difficultés particulières: voir ici.

Liens

Les pages principales dont je me suis inspiré pour écrire cet article:
http://linux.spiney.org/debian_gnu_linux_on_an_ibm_thinkpad_t43p
http://wiki.foosel.net/linux/t43?DokuWiki=a3cad0cc9b720af337d8fe70ac94bfd5
http://www.thinkwiki.org/wiki/ThinkWiki

Mots-clés :