Configuration aux petits oignons de Debian sur un Lenovo E145

Introduction

J'ai remplacé mon vieil EeePC 701 de 2008 par un portable plus moderne: c'est un Lenovo E145. J'ai décidé de configurer Debian sur cette machine pour pouvoir en faire ce que je veux.

Cette configuration a posé pas mal de problèmes aussi, je tiens à partager ce que j'ai découvert afin que d'autres propriétaires de cette machine puissent en profiter.

Le ton de cet article qui se veut complet est complètement partisan car il faut bien changer de style de temps en temps. Et surtout une documentation d'installation, c'est loin d'être aussi captivant que le dernier polar suédois (je préfère les finlandais... non en fait, je ne lis pas de polar). Donc pour changer les choses, j'ai pris volontairement un ton agressif qui tranche dans le vif. Car il faut bien le reconnaître, j'en ai bien bavé pour installer cette bestiole récalcitrante...

A noter que ce document est dans un wiki. Il est donc en cours d'élaboration constante. Peut-être que des paragraphes marqués TODO le resteront ad vitam eternam; vous voilà prévenus.

Attention, chérie, ça va trancher !

Gestion du périphérique de masse: le disque dur

Installation de base: UEFI c'est le défi !

Le BIOS de cette machine gère L'UEFI. Autant l'utiliser... Mais autant vous dire que ce n'est pas de la tarte ! Pour plus d'informations sur UEFI, je vous recommande de lire cette introduction très bien faite.

UEFI implique une partition au format GPT. Oubliez les partitions de type BIOS avec le Master Boot Record et les partitions étendues ou primaires. GPT c'est bien plus simple ! En effet, un disque utilisant une table de partition GPT est plus facile à gérer. Par exemple, on peut créer autant de partition qu'on veut. Ces partitions peuvent également recevoir un nom ce qui permet de mieux les identifier.

Normalement, l'installeur Debian gère l'installation en mode UEFI. Vous DEVEZ impérativement démarrer l'installation en mode UEFI si vous voulez pouvoir installer un bootloader qui gère cette fonctionnalité. Pour ce faire, il faut que vous modifiez la configuration de votre BIOS en indiquant que vous ne souhaitez démarrer qu'en mode UEFI (interdisez le mode Legacy). Il sera nécéssaire ici de désactiver l'option CSM pour être sûr que le mode Legacy ne soit pas activé.

Le Lenovo E145 étant dépourvu de lecteur optique, il faudra lancer l'installeur Debian à partir d'une clef USB. Pour cela, rendez-vous sur la page de téléchargement de l'installeur Debian et téléchargez l'image "netinst". Ensuite, une simple copie sur votre clef USB (/dev/sdd dans l'exemple) permettra d'avoir un installeur Debian complet qui gère le mode UEFI:

     # cp debian-jessie-DI-rc1-amd64-netinst.iso /dev/sdd
     # sync

Insérez cette clef dans un port USB du Lenovo E145.

Il faut ensuite s'assurer que la machine démarre en mode UEFI. Pour cela, démarrez votre Lenovo E145 et appuyez sur la touche Entrée lorsque la machine démarre. Cela vous permet d'accéder à la configuration du BIOS. Ensuite, allez faire un tour du côté du menu "Startup". Pour l'option "UEFI/Legacy Boot", indiquez "UEFI Only". Pour l'option "CSM Support", indiquez "No". Enfin, il reste à indiquer que vous souhaitez démarrer sur la clef USB insérée. Pour cela, ouvrez le sous menu "Boot" (première entrée du menu Startup) et mettez l'option "USB HDD Generic Flash Disk" en premier.

Une fois cette configuration terminée, appuyez sur F10 pour sauvegarder le tout dans la mémoire Flash du BIOS.

Au prochain redémarrage, vous devriez voir le menu de l'installeur Debian. Celui-ci indique "Debian GNU/Linux UEFI Installer menu". UEFI indique que l'installation se fera en mode UEFI, nous sommes sur la bonne voie.

Je ne vais pas revenir sur l'installation d'une Debian, il y a un excellent manuel qui le fait à ma place ! Vous pouvez utiliser le mode texte (le mode des vrais sysadmins) mais le mode graphique n'est pas mal non plus.

Au moment où partman vous demande comment partitionner l'ensemble, vous pouvez utiliser le partitionnement suivant:

# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ATA WDC WD5000LPVX-0 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size    File system     Name        Flags
 1      1049kB  128MB  127MB   fat32           UEFIBOOT    boot, esp
 2      128MB   100GB  100GB   ext4            DEBIANROOT
 3      100GB   110GB  10,0GB  linux-swap(v1)  SWAP
 4      110GB   260GB  150GB                   HOME
 5      260GB   500GB  240GB   ext4            DATA

UEFIBOOT est présente pour déposer les éléments qui vont permettre le boot UEFI. Le "BIOS" UEFI va directement lire les programmes d'amorce sur cette partition. Avec GRUB-EFI, elle devrait contenir le bootloader de Grub ainsi que le noyau Linux de démarrage. Cette partition est montée dans /boot.

DEBIANROOT contient les fichiers systèmes. Ils seront non chiffrés. On trouve ensuite le swap lui aussi non chiffré. Enfin, la partition HOME servira à accueillir un répertoire /home chiffré. Enfin, le reste, c'est à dire la majorité de l'espace libre, sera utilisé pour stocker des données qui n'ont pas besoin d'être chiffrées. On y trouve par exemple, des images de VM, des documents publics, de l'espace temporaire de test. C'est également là que je place les programmes gourmands (les jeux quoi) qui ont besoin d'un accès performant aux données (le chiffrement dégrade un peu les perfs quand même !).

Vous devez bien évidemment installer un bootloader (GRUB2) pour que votre BIOS UEFI prenne en compte ce bootloader (c'est fait automatiquement dans le mode d'installation non expert).

Une fois que l'installation est terminée, vous pouvez vérifier qu'UEFI est pris en compte en listant les efivars:

# ls /sys/firmware/efi
config_table  efivars  fw_platform_size  fw_vendor  runtime  runtime-map  systab  vars

Normalement, l'UEFI est bien pris en compte par l'installeur Debian de Jessie, y compris dans sa RC1 ce qui laisse augurer une bonne prise en charge lors de la publication de la prochaine version stable de Debian.

Si vous avez installé GRUB2 sans prise en charge de l'UEFI (avec une table de partition GPT au minimum), il sera difficile de convertir votre installation en UEFI. J'ai essayé et je me suis retrouvé à devoir refaire l'installation from scratch. Dans tous les cas, il vous faudra une clef USB pour démarrer en UEFI puis lancer des commandes pour réinstaller GRUB correctement.

Le plus simple est donc de le faire directement depuis l'installeur Debian.

Chiffrer la partition home

Un ordinateur portable, c'est un truc qui se pique plus facilement qu'une grosse tour bien lourde qui traine dans un bureau sécurisé. Il faut donc mettre tout ce qui est sensible sous clef. Pas facile d'y arriver. Je ne me vois pas chiffrer toutes les partitions car je pense qu'il n'y a rien de trop sensible sur la partition root.

Si j'étais parano, je chiffrerais tout: ça permettrait notamment qu'un type qui a un accès frauduleux à / ne puisse y fourrer un keylogger velu qui se chargera de récupérer le mot de passe de la clef de chiffrement de la partition home. Mais en fait, ça ne fait pas partie du risque que je souhaite couvrir (hé, je suis en train de faire une analyse de risque en tâche de fond bordel !). Je ne suis pas un agent du gouvernement qui souhaite ne pas se faire piéger.

Le seul risque que je souhaite couvrir, c'est celui du vol de machine qui a une probabilité plus importante de survenir. Une fois ce besoin défini, il reste à le mettre en oeuvre de la manière la plus simple possible. Le plus simple consiste à proposer du chiffrement uniquement quand c'est utile en le combinant avec le moins d'interfaces possibles. Debian propose un système de chiffrement assez bien intégré dans l'installeur mais ce n'est pas ce que je vais utiliser.

En effet, je refuse de devoir taper un mot de passe pour pouvoir simplement booter la machine. Je vais donc utiliser le module pam-mount qui permet de monter automatiquement lors du login la partition chiffrée en utilisant le mot de passe comme passphrase de déchiffrement de la partition chiffrée. Le biais de cette technique réside dans le fait qu'en général, une passphrase c'est beaucoup plus long qu'un mot de passe. Mais pour mes besoins, ça suffira amplement !

Nous allons donc partir avec dm-crypt (fourni en standard dans le Kernel Linux), cryptsetup (l'outil pour configurer dm-crypt) et pam-mount pour monter la partition chiffrée lors du login de l'utilisateur. A noter que la partition chiffrée ne sera pas /home mais bien /home/user. L'espace disque sera donc uniquement dédié à un seul utilisateur. Si j'ajoute un nouvel utilisateur à cette machine (ce qui a peu de chances d'arriver), il ne pourra pas bénéficier de cette partition.

Voici l'implémentation concrète:

  • Créer un volume chiffré
  • Le monter
  • Créer un filesystème ext4 dessus
  • Configurer pam-mount pour monter ce volume chiffré au login de l'utilisateur.

Je déteste pam-mount: c'est un des seuls modules PAM qui stocke sa configuration dans un arbre XML. C'est humainement imbittable et on fait toujours un maximum d'erreurs de saisie comme oublier de fermer des balises à la con. Mais bon, j'ai besoin de pam-mount donc je fais avec. Voici les lignes à modifier pour la configuration qui nous intéresse:

Avec ces éléments, on dispose d'une partition home chiffrée qui s'active uniquement après le login de l'utilisateur.

Normalement, il faudrait que je chiffre /tmp et le swap parce qu'il se pourrait bien qu'on trouve des choses intéressantes dedans pour voler ma passphrase. Mais en fait, je n'en n'ai rien à foutre ! De toute manière, si un mec veut cette passphrase, il n'a qu'à installer un keylogger dans l'espace root...

Voyons comment intégrer tout ça de manière assez simple.

  -- on va d'abord installer ce qu'il faut:
  # aptitude install cryptsetup libpam-mount

  -- Ensuite, on créé une partition chiffrée avec LUKS sur /dev/sda5 (ma partition home)
  -- LUKS permet d'arranger la partition pour y fourrer la clef de chiffrement protégée par une passphrase.
  -- Faîtes en sorte que cette passphrase soit votre mot de passe Unix:
  # cryptsetup luksFormat /dev/sda5
  -- On fait le lien avec le device-mapper qu'on nomme crypted-home.
  # cryptsetup luksOpen /dev/sda5 crypted-home
  -- Ensuite, il est temps de créer un système de fichier par dessus tout ça:
  # mkfs.ext4 /dev/mapper/crypted-home

  -- Maintenant, faisons une petite synchro entre l'ancien /home/username et le nouveau:
  # mount /dev/mapper/crypted-home /media/crypthome
  # rsync -tarv /home/username/ /media/crypthome/
  # umount /media/crypthome

Dès cet instant, vous voilà équipé d'une partition home chiffrée mais il reste à configurer pam_mount. La conf est simplissime: il suffit de modifier le contenu du fichier /etc/security/pam_mount.conf.xml et d'ajouter une entrée du type:

<volume user="username" fstype="crypt" path="/dev/sda5" mountpoint="/home" />

Normalement, lorsque vous installez le paquet libpam-mount, Debian l'intègre dans la conf de PAM. Un petit reboot pour la forme et lorsque username se connecte, il dispose d'un home chiffré. Je vous conseille de supprimer le contenu de l'ancien /home/username en vous logguant en root (qui normalement ne monte pas la partition chiffrée à la connexion).

Accélération du processus de boot

J'aime bien que les machines que je gère démarrent rapidement. Pour un portable en utilisation nomade, ça me semble indispensable d'avoir un boot qui tient en moins de 30 secondes. Ça permet tout simplement d'allumer et d'éteindre la machine à l'envie.

Pour faire simple, on va utiliser e4rat. Le système de fichiers root est en ext4, ça tombe bien, e4rat ne gère que ce FS.

Installez e4rat:

 # dpkg -i e4rat_0.2.3_amd64.deb

Ensuite, il faut lancer e4rat-collect au moment du boot de la machine. Le plus simple est de faire une entrée spécifique dans la configuration dynamique de grub. Pour ma part, voici ce que j'ai ajouté à /etc/grub.d/40_custom (un fichier qui est fait pour ça):

 menuentry 'E4rat collect Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7840a396-1ab7-4acb-869c-083d607baa0d' {
    load_video
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt3'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3  7840a396-1ab7-4acb-869c-083d607baa0d
    else
      search --no-floppy --fs-uuid --set=root 7840a396-1ab7-4acb-869c-083d607baa0d
    fi
    echo    'Chargement de Linux 3.13-1-amd64 avec e4rat…'
    linux   /boot/vmlinuz-3.13-1-amd64 root=UUID=7840a396-1ab7-4acb-869c-083d607baa0d ro  quiet init=/sbin/e4rat-collect
    echo    'Chargement du disque mémoire initial…'
    initrd  /boot/initrd.img-3.13-1-amd64
 }

Vous devrez bien sûr adapter votre configuration. Pour ma part, j'ai fait un copier-coller d'une partie du contenu du fichier /boot/grub/grub.cfg. C'est plus facile. N'oubliez pas de lancer un

 # update-grub2

... pour avoir une entrée de menu dans le bootloader au prochain démarrage. Une fois fait, rebootez votre machine et choisissez cette entrée de menu.

Le système va se lancer et créer une liste de fichiers à précharger en fonction de ce qui est lancé au niveau du système de fichiers. La liste des fichiers est stockée, par défaut, dans le fichier '''/var/lib/e4rat/startup.log'''.

Une fois le boot terminé, n'hésitez pas à fouiller cette liste et à virer les fichiers qui ne sont pas importants. Pour ma part, j'ai supprimé toutes les entrées qui mobilisent des fichiers de thumbnails par exemple. Une fois la vérification de ce fichier réalisée, il suffit de redémarrer le système en mode de dépannage (single). Lorsque le système vous donne la main (après avoir donné le mot de passe root), il suffit d'entrer la commande '''e4rat-realloc /var/lib/e4rat/startup.log'''.

Les fichiers concernés par la réallocation vont être alors déplacés de manière à minimiser leur temps d'accès. Une fois que e4rat-realloc a terminé son travail, il suffit de rebooter sur une instance normale du système (la première entrée dans le menu de GRUB2).

Enfin, contrairement à readahead, le pré-chargement des fichiers de e4rat est réalisé au niveau du processus init (readahead se base sur un script sysvinit). Il faut donc l'indiquer dans la configuration de GRUB2. Une méthode (un peu bourrine il faut bien le reconnaître), consiste à modifier le contenu d'une variable du fichier '''/etc/default/grub''':

GRUB_CMDLINE_LINUX_DEFAULT="quiet init=/sbin/e4rat-preload"

Après un '''update-grub2''', à chaque reboot, le système va charger les fichiers et tout devrait automagiquement aller plus vite. Pour ma part, je boote en environ 15 secondes (après l'init du BIOS) avec le disque dur d'origine qui n'est franchement pas folichon. On pourrait encore améliorer ça en installant systemd. Mais ce sera pour une autre histoire...

Configuration Xorg

Je n'ai pas eu d'hésitation au départ sur ce chapitre: je me suis lancé dans l'utilisation d'un pilote non libre ! Je sais, c'est le mal et c'est assez dur psychologiquement à assumer. Mais, au moins dans un premier temps, j'ai souhaité avoir une config simple et qui marchait out-of the box.

Pour cela, j'ai opté pour une solution simple:

 # aptitude install fglrx-driver
 # aticonfig --initial

Si l'écran fonctionnait correctement avec les bons réglages, j'ai rapidement déchanté: le serveur X mettait près de 20 secondes avant d'être opérationnel ce qui est tout bonnement innacceptable en 2014. Changeons ça !

 # aptitude purge fglrx-driver
 # aptitude install xserver-xorg-video-ati
 # reboot

Et ça marche out-of-the-box aussi. Normalement, grâce au paquet firmware-linux-nonfree, je dois avoir l'accélération 3D. Mais en fait, je m'en fous: ce n'est pas utile pour mon twm et j'en ai pas besoin pour faire fonctionner ScummVM ! Le pilote libre ati met moins de 3 secondes à se charger, c'est bien plus réactif que le pilote fglrx. Comme quoi le libre c'est mieux, la preuve par A+B !

Voici de quoi lancer mon environnement de bureau préféré:

# aptitude install xinit slim xserver-xorg-input-all i3-wm i3status suckless-tools i3lock

Connexion Wifi et réseau Ethernet

Commençons avec le controleur Ethernet. Il s'agit d'un Realtek RTL8169. Ce contrôleur a besoin d'un firmware non libre. Celui-ci est disponible dans le paquet firmware-linux-nonfree. Il vous faut donc installer ce paquet si vous voulez faire fonctionner la carte réseau Ethernet. D'ailleurs, je vous recommande son installation car il vous faudra une connexion à Internet pour installer facilement la partie Wifi.

Car cette machine dispose d'une carte wifi particulière:

$ lspci | grep Net
01:00.0 Network controller: Broadcom Corporation BCM43228 802.11a/b/g/n

C'est une broadcom BCM43228 et son exploitation implique une petite compilation de module sous Debian pour fonctionner. Par bonheur, il vous suffit d'installer le paquet broadcom-sta-dkms qui, comme son nom l'indique, contient un paquet DKMS (un truc qui se compile automatiquement lorsque le noyau de la distribution change) pour ce pilote Broadcom (STA). Un simple aptitude install broadcom-sta-dkms suffit à être équipé du module noyau requis pour faire fonctionner le Wifi. Attention, ce pilote est issu du dépôt non-free: il n'est donc pas libre.

Pour la configuration réseau de cette machine, je vais au plus simple: une simple définition de l'interface dans /etc/network/interfaces et un fichier de configuration de wpa_supplicant dans /etc/wpa_supplicant/wpa_supplicant.conf dans lequel je glisse les différentes configurations des réseaux Wifi auxquels je peux me connecter. C'est très simple à mettre en oeuvre, il n'y a pas d'autres paquets que les wireless-tools et wpa-supplicant à installer. La configuration est très KISS mais reste facilement maitrisable pour qui est équipé d'un éditeur de fichiers (Emacs is the best One !).

Donc, pas besoin de prendre le paquet networkmanager et ses 300 paquets de dépendance pour configurer un accès Wifi. Pour vous motiver encore plus, sachez que les véritables gentlemens ne jurent que par /etc/network/interfaces !

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

iface eth0 inet dhcp

iface wlan0 inet dhcp
      wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Pour la connexion, il reste à customiser un peu le comportement. En effet, je ne souhaite pas que l'accès Wifi se paramètre au démarrage de la machine. En effet, je ne suis pas toujours près d'un réseau Wifi connu et je n'ai vraiment pas l'intention d'attendre que la session DHCP echoue. J'ai donc décidé de relocaliser la touche spéciale Wifi du clavier (FN+F9) pour lancer la configuration du réseau à la volée. Ce truc fait juste un ifup wlan0 en root pour que ça marche et un ifdown wlan0 lorsqu'on réappuie dessus.

La conf ACPI est décrite dans le chapitre qui vient juste après...

Configuration des touches spéciales

Le Lenovo E145 est livré avec un ensemble de touches spécialisées qu'on peut s'amuser à customiser avec un brin d'imagination.

Ce qu'il faut savoir c'est que la gestion de ces touches se fait via ACPI. En règle générale sous Debian, un serveur ACPI (qui se nomme acpid) tourne en tâche de fond et intercepte les évènement ACPI. Quand une touche spéciale est pressée, elle déclenche un évènement ACPI.

Pour s'en convaincre, il vous suffit d'utiliser l'utilitaire acpi_listen (même en espace utilisateur) et de presser une touche spéciale pour voir quel évènement est déclenché.

Une fois l'évènement déclenché, le serveur acpid scrute un répertoire de configuration (/etc/acpi/events) qui contient une liste de scripts de configuration qui associent un évènement avec une action.

Quand ça ne marche pas, c'est que les codes renvoyés ne sont pas reconnus dans /etc/acpi/events. A noter que bien souvent les scripts de /etc/acpi lancent acpi_fakekey. Je me suis posé la question de savoir ce que ce programme faisait. En fait, il émule un évènement clavier X11. Cela permet de faire comme si un évènement ACPI déclenchait l'appui sur une touche d'un clavier spécial. Ce truc sert essentiellement parce qu'au lieu de renvoyer un évènement clavier X11, l'appui sur une touche spéciale du clavier des ordinateurs portables déclenche un évènement ACPI, au même titre que le fait de fermer l'écran. C'est un peu débile, mais il faut faire avec.

Faisons donc un peu d'étude concrète du fonctionnement de ces touches spéciales en étudiant la démarche pour la touche qui désactive/active le son. J'ai commencé par étudier le problème de manière très mono-centrée: je ne veux pas un truc universel, juste un truc qui marche. Dans cette optique, mon système marche avec Alsa pour le son (pulseaudio needs to die). Il existe justement un truc pour gérer le son en ligne de commande: c'est amixer.

Lisez la page man de amixer pour juger de son potentiel. Dans mon cas, j'avais juste besoin d'un ordre qui permette de rendre silencieux le son ainsi que de le remettre. Dans la pratique, ça se fait dans une seule ligne de commande:

# Pour couper le son
amixer -d default set Master mute

# Pour remettre le son
 amixer -d default set Master unmute

Mais j'ai besoin de plus d'intelligence: il faut détecter si le son est actuellement coupé. J'ai fait un script (il y a une appli pour ça ;-)):

#!/bin/sh
# Script to mute/unmute with amixer

# First get the state of the Master
amixer -D default get Master 2>&1 | grep -q '\[off\]'

# Then, we mute or unmute the sound
if [ "$?" -eq 0 ]
then
  amixer -D default set Master unmute 2>&1 >> /dev/null
else
  amixer -D default set Master mute 2>&1 >> /dev/null
fi

exit 0

J'ai foutu ce script dans /etc/acpi/mute_snd.sh que j'ai rendu exécutable avec le bon chmod.

Ensuite, j'ai lancé la commande acpi_listen et j'ai appuyé sur le bouton pour couper le son. J'ai récupéré le résultat suivant:

$ acpi_listen 
button/mute MUTE 00000080 00000000 K

J'ai créé un fichier /etc/acpi/events/e145-mute dont voici le contenu:

# Volume Always Mute
event=button/mute MUTE 00000080 00000000
action=/etc/acpi/mute_snd.sh

Un petit coup de:

service acpid restart

pour prendre en compte la config et c'est parti...

Maintenant que vous avez pigé comment ça marche, il suffit de créer les scripts qui font l'action puis de récupérer les identifiants d'évènement et le tour est joué. Voici ce que j'ai mis en place sur cette machine...

Touche Baisser le son

Script shell: /etc/acpi/snd_less.sh

#!/bin/sh
# Script to lower sound by 5%

amixer -D default set Master 5%- 2>&1 >> /dev/null

exit 0

Script event: /etc/acpi/e145-sndless

# Volume Always Mute
event=button/volumedown VOLDN 00000080 00000000
action=/etc/acpi/snd_less.sh

Touche Monter le son

Script shell: /etc/acpi/snd_more.sh

#!/bin/sh
# Script to increase sound level by 5%

amixer -D default set Master 5%+ 2>&1 >> /dev/null

exit 0

Script event: /etc/acpi/e145-sndmore

# Volume Always Mute
event=button/volumeup VOLUP 00000080 00000000
action=/etc/acpi/snd_more.sh

Touche Couper le micro

Pas de surprise, c'est le même concept qu'avec le reste du son et Alsa.

Script shell: /etc/acpi/snd_mic_mute.sh

#!/bin/sh
# Script to mute/unmute mic with amixer

# First get the state of the Mic
amixer -D default get Mic 2>&1 | grep -q '\[off\]'

# Then, we mute or unmute the sound
if [ "$?" -eq "0" ]
then
  amixer -D default set Mic unmute 2>&1 >> /dev/null
else
  amixer -D default set Mic mute 2>&1 >> /dev/null
fi

exit 0

Script event: /etc/acpi/events/e145-micmute

# Volume Mic Mute
event=button/f20 F20 00000080 00000000
action=/etc/acpi/snd_mic_mute.sh

Touche Pas de photo

Pour ma part, je ne sais pas à quoi peut servir une telle touche sachant qu'il y en a une qui est utilisée pour la webcam. Cette touche ne renvoie pas d'évènement ACPI. Donc poubelle !

Touche Vidéoprojecteur (non, ce n'est pas une Webcam !)

Cette touche, à gauche de la touche de luminosité - est étiquettée comme étant une touche de changement de mode vidéo. Pour ma part, je ne change pas le mode vidéo de ma machine, du moins, pas avec une touche. Donc pas de configuration !

Touche Luminosité moins

Pour que cette touche fonctionne, pas le choix, vous DEVEZ utiliser un pilote libre ! J'ai essayé avec le pilote fglrx mais je ne suis capable de changer la luminosité qu'avec la commande aticonfig. De toute manière, si vous utilisez fglrx, démerdez-vous...

Avec le pilote radeon, c'est très simple, il suffit d'utiliser l'interface ACPI standarde de backlight qui se trouve dans /sys/class/backlight/radeon_bl0.

Script shell: /etc/acpi/e145_brightless.sh

#!/bin/sh                                                                          
# Script to lower brightness on fglrx driver                                       

# Get the state of the brightness                                                  
BRIGHTNESS=$(cat /sys/class/backlight/radeon_bl0/actual_brightness)
MAX_BRIGHTNESS=$(cat /sys/class/backlight/radeon_bl0/max_brightness)

# Lower the brightness                                                             
if [ "$BRIGHTNESS" -gt "-0" ]
then
   BRIGHTNESS=$(( $BRIGHTNESS - 5 ))
   echo $BRIGHTNESS > /sys/class/backlight/radeon_bl0/brightness
fi

exit 0

Script event: /etc/acpi/events/e145-brightless

# Brightness Lower
event=video/brightnessdown BRTDN 00000087 00000000
action=/etc/acpi/e145_brightless.sh

Touche Luminosité Plus

Idem que pour la touche luminosité moins !

Script Shell: /etc/acpi/e145_brightmore.sh

#!/bin/sh                                                                          
# Script to increase brightness on e145 backlight                                  

# Get the state of the brightness                                                  
BRIGHTNESS=$(cat /sys/class/backlight/radeon_bl0/actual_brightness)
MAX_BRIGHTNESS=$(cat /sys/class/backlight/radeon_bl0/max_brightness)

# Lower the brightness                                                             
if [ "$BRIGHTNESS" -lt "$MAX_BRIGHTNESS" ]
then
   BRIGHTNESS=$(( $BRIGHTNESS + 5 ))
   echo $BRIGHTNESS > /sys/class/backlight/radeon_bl0/brightness
fi

exit 0

Script event: /etc/acpi/events/e145-brightmore

# Brightness Increase
event=video/brightnessup BRTUP 00000086 00000000
action=/etc/acpi/e145_brightmore.sh

Voilà pour la luminosité qu'on peut modifier par pas de 5, ce qui est parfait !

Touche Wifi

Cette touche est déjà fonctionnelle mais elle ne fait pas ce que je veux: elle lance juste le programme rfkill qui se charge de couper physiquement les cartes sans-fil (Wifi et Bluetooth) et elle lance un ifconfig up ou down suivant l'état initial. Pour ma part, je veux que le réseau soit monté automatiquement avec les scripts ifup et ifdown de Debian.

La partie ACPI est asez complexe. En effet, l'appui sur la touche Wifi déclenche l'évènement suivant:

 button/wlan WLAN 00000080 00000000 K

Cet évènement ACPI est géré dans deux fichiers d'évènement:

 $ grep button/wlan *
 asus-wireless-wlan:event=button/wlan WLAN 00000080
 thinkpad-wireless-wlan:event=button/wlan WLAN 00000080

Lorsque ces évènements sont détectés ils lancent le script /etc/acpi/asus-wireless.sh qui ne fonctionne que si la machine est une Asus. C'est une erreur. Pour ma part, j'ai modifié le fichier /etc/acpi/events/thinkpad-wireless-wlan avec le contenu suivant:

 event=button/wlan WLAN 00000080
 action=/etc/acpi/ibm-wireless.sh

Le contenu du fichier /etc/acpi/ibm-wireless.sh détecte si la machine est bien une ibm ou une lenovo et se charge ensuite de gérer le Wifi et/ou le bluetooth. Ce script s'appuie essentiellement sur un fichier général du paquet acpid: /usr/share/acpi-support/state-funcs. C'est dans ce fichier que se fait la mécanique de gestion du montage réseau avec rfkill et ifconfig. Pour m'en sortir, j'ai du réaliser une copie modifiée de ce fichier et le placer dans /etc/acpi/e145-wireless-funcs dont voici le contenu (j'ai juste ajouter un ifup et un ifdown au bon endroit):

     # Paul Sladen, 2006-03-28, 2007-03-26
     # Luca Niccoli <lultimouomo@gmail.com>, 2010-06-23
     # Cristian Ionescu-Idbohrn <cristian.ionescu-idbohrn@axis.com>, 2010-12-14
     # Library functions to check/change status of wireless
     # Modified to add ifup/ifdown commands by Médéric Ribreux <mederic.ribreux@medspx.fr>

     # Setup WLAN_RFKILLS list
     WLAN_RFKILLS=
      for r in /sys/class/rfkill/rfkill*; do
   ! read t <$r/type || [ "$t" != wlan ] ||
       WLAN_RFKILLS=${WLAN_RFKILLS:+$WLAN_RFKILLS }$r/state
      done

     haveDevRfkill() {
   [ -c /dev/rfkill ] && [ -x /usr/sbin/rfkill ]
     }

     isAnyWirelessPoweredOn() {
   local RFKILL s

   if haveDevRfkill; then
       rfkill list wlan |
           egrep -q "Soft:blank:+blocked::blank:+no"
       return $?
   else
       for RFKILL in $WLAN_RFKILLS ; do
           [ ! -r "$RFKILL" ] || ! read s <$RFKILL ||
               [ "$s" -ne 1 ] || return 0
       done
   fi
   # otherwise return failure
   return 1
     }

     # Takes no parameters, toggles all wireless devices.
     toggleAllWirelessStates() {
   local WIFACE RFKILL get_wifaces zzz=0 max_zzz=7
   local wicd_connect=/usr/share/wicd/daemon/autoconnect.py

   if [ -x /usr/sbin/iw ]; then
       get_wifaces='iw dev | sed -rne "s|^:blank:+Interface:blank:+(:alnum:+).*$|\1|p"'
   elif [ -x /sbin/iwconfig ]; then
       get_wifaces='iwconfig 2>/dev/null | grep -o "^:alnum:*"'
   else
       logger -t${0##*/} -perr -- \
           toggleAllWirelessStates: no way to pick up interfaces
       exit 1
   fi

   if [ -x /sbin/ip ]; then
       if_cmd="ip link set dev"
   elif [ -x /sbin/ifconfig ]; then
       if_cmd=ifconfig
   else
       logger -t${0##*/} -perr -- \
           toggleAllWirelessStates: no way to up/down interfaces
       exit 1
   fi

   # If rfkill is handled by the kernel, don't touch it
   if ! grep -q '^H.*\brfkill\b' /proc/bus/input/devices; then
       if isAnyWirelessPoweredOn; then
           # 'down'ing wireless interfaces, helps with some
           # buggy drivers
           for WIFACE in $(eval $get_wifaces); do
                                ifdown $WIFACE
                $if_cmd $WIFACE down 2>/dev/null || :
           done
           if haveDevRfkill; then
               rfkill block wlan
           else
               for RFKILL in $WLAN_RFKILLS; do
                   [ ! -w $RFKILL ] || echo 0 >$RFKILL
               done
           fi
       else
           if haveDevRfkill; then
               rfkill unblock wlan
           else
               for RFKILL in $WLAN_RFKILLS; do
                   [ ! -w $RFKILL ] || echo 1 >$RFKILL
               done
           fi
       fi
   fi
   # Is wireless on now? Set the interfaces up and poke wicd
   while ! isAnyWirelessPoweredOn && [ $zzz -lt $max_zzz ]; do
       sleep 1
       zzz=$(($zzz + 1))
   done
   if [ $zzz -lt $max_zzz ]; then
       for WIFACE in $(eval $get_wifaces); do
            $if_cmd $WIFACE up 2>/dev/null || :
                        ifup $WIFACE
       done
       [ ! -x $wicd_connect ] || $wicd_connect
   fi
     }

     # Pass '1' to blink suspending LED and '0' to stop LED
     setLEDThinkpadSuspending() {
   local ibm_led=/proc/acpi/ibm/led

   action=$([ "$1" -ne 0 ] && echo blink || echo off)
   [ ! -w $ibm_led ] || printf '7 %s' $action >$ibm_led
     }

Puis j'ai modifié légèrement le fichier /etc/acpi/ibm-wireless.sh pour utiliser ce fichier à la place de l'autre:

#!/bin/sh

test -f /etc/acpi/e145-wireless-funcs || exit 0

read vendor </sys/class/dmi/id/sys_vendor 2>/dev/null || exit 0
case $vendor in
   [iI][bB][mM]*)
       ;;
   [lL][eE][nN][oO][vV][oO]*)
       ;;
   *)
       exit 0
       ;;
esac

if ! test -x /usr/sbin/rfkill
then
 logger -t${0##*/} -perr -- "Error: Please install package rfkill to enable toggling of wireless devices."
 exit 0
fi


# Find and toggle wireless of bluetooth devices on ThinkPads
. /etc/acpi/e145-wireless-funcs

rfkill list | sed -n -e'/tpacpi_bluetooth_sw/,/^[0-9]/p' | grep -q 'Soft blocked: yes'
bluetooth_state=$?

# Note that this always alters the state of the wireless!
toggleAllWirelessStates;

# Sequence is Both on, Both off, Wireless only, Bluetooth only
if ! isAnyWirelessPoweredOn; then
    # Wireless was turned off
    if [ "$bluetooth_state" = 0 ]; then
      if [ x$WIRELESS_BLUETOOTH_SYNC != xtrue ]; then
        rfkill unblock bluetooth
      fi
    else
        rfkill block bluetooth
    fi
else
    if [ x$WIRELESS_BLUETOOTH_SYNC = xtrue -a "$bluetooth_state" = 0 ]; then
         rfkill unblock bluetooth
    fi
fi

Vous pouvez noter qu'il faut que le paquet rfkill soit installé pour que ça fonctionne...

Une fois passé ces modifications substantielles, ça roule et ça fait exactement ce que je veux !

Touche Precédent

Script shell: /etc/acpi/cmus-prev.sh

#!/bin/sh
# Script to play previous track in cmus with cmus-remote

# Get the username
USERNAME=$(who -u | awk -F ' ' '{ print $1 }' | uniq | head -n 1)

# Go to previous track with cmus-remote
cmus-remote --server /home/$USERNAME/.cmus/socket -r

exit 0

Script event: /etc/acpi/events/e145-prev

# Play next track in Cmus
event=cd/prev CDPREV 00000080 00000000
action=/etc/acpi/cmus-prev.sh

Touche Pause

Script shell: /etc/acpi/cmus-pause.sh

#!/bin/sh
# Script to pause/unpause cmus with cmus-remote

# Get the username
USERNAME=$(who -u | awk -F ' ' '{ print $1 }' | uniq | head -n 1)

# Pause cmus with cmus-remote
cmus-remote --server /home/$USERNAME/.cmus/socket -u

exit 0

Script event: /etc/acpi/events/e145-pause

# Pause Cmus
event=cd/play CDPLAY 00000080 00000000
action=/etc/acpi/cmus-pause.sh

Touche Suivant

Script shell: /etc/acpi/cmus-next.sh

#!/bin/sh
# Script to play next track in cmus with cmus-remote

# Get the username
USERNAME=$(who -u | awk -F ' ' '{ print $1 }' | uniq | head -n 1)

# Go to next track with cmus-remote
cmus-remote --server /home/$USERNAME/.cmus/socket -n

exit 0

Script event: /etc/acpi/events/e145-next

# Play next track in Cmus
event=cd/next CDNEXT 00000080 00000000
action=/etc/acpi/cmus-next.sh

Configuration audio

Je suis un vieux et donc, j'ai appris à utiliser Alsa pour le son. Je sais, il y a Pulseaudio mais ALSA a toujours fonctionné et je l'aime bien. J'utilise donc le paquet alsa-utils.

Par défaut, le périphérique de sortie audio est le port HDMI Audio. Ce dernier permet de faire sortir du son numérique via la prise HDMI de la machine. En conséquence de cet ordre, la sortie sonore par défaut ne fonctionne pas nativement.

Pour s'en rendre compte, un simple: aplay -l permet de s'en rendre compte:

# aplay -l
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: Generic [HD-Audio Generic], périphérique 3: HDMI 0 [HDMI 0]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 0: Generic [HD-Audio Generic], périphérique 7: HDMI 1 [HDMI 1]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 1: Generic_1 [HD-Audio Generic], périphérique 0: ALC269VC Analog [ALC269VC Analog]
  Sous-périphériques: 0/1
  Sous-périphérique #0: subdevice #0

La carte n°0 est bien du HDMI. Pour configurer ALSA pour tenir compte de cette configuration (dans le fichier /etc/asound.conf), il faut connaître le nom de la carte son telle que détectée par le noyau. Un simple 'cat /proc/asound/cards' suffit:

0 [Generic        ]: HDA-Intel - HD-Audio Generic
                     HD-Audio Generic at 0xf1540000 irq 75
1 [Generic_1      ]: HDA-Intel - HD-Audio Generic
                     HD-Audio Generic at 0xf1544000 irq 16

29 [ThinkPadEC ]: ThinkPad EC - ThinkPad Console Audio Control ThinkPad Console Audio Control at EC reg 0x30, fw unknown

On voit que la carte n°1 est nommée Generic_1. Maintenant, il reste à modifier le fichier /etc/asound.conf pour que la sortie PCM par défaut et l'instance de contrôle du son soit porté par la carte n°1 nommée Generic_1:

pcm.!default {
    type hw
    card Generic_1
}
ctl.!default {
    type hw
    card Generic_1
}

Configuration du bureau

Chez moi, le bureau est toujours le même: le vénérable i3-wm. Sa configuration est identique d'une machine à l'autre. Ainsi, je ne suis pas perdu. Voici l'étendue de mon fichier de conf:

     # This file has been auto-generated by i3-config-wizard(1).
     # It will not be overwritten, so edit it as you like.
     #
     # Should you change your keyboard layout somewhen, delete
     # this file and re-run i3-config-wizard(1).
     # 

     # i3 config file (v4)
     #
     # Please see http://i3wm.org/docs/userguide.html for a complete reference!

     set $mod Mod4

     # font for window titles. ISO 10646 = Unicode
     font -misc-fixed-medium-r-normal--10-120-75-75-C-70-iso10646-1

     # Use Mouse+$mod to drag floating windows to their wanted position
     floating_modifier $mod

     # start a terminal
     bindsym $mod+Return exec urxvt

     # Vérouille l'écran:
     bindsym    $mod+l exec i3lock -d

     # kill focused window
     bindsym $mod+Shift+Q kill

     # start dmenu (a program launcher)
     bindsym $mod+d exec dmenu_run

     # alternatively, you can use the cursor keys:
     bindsym $mod+Left focus left
     bindsym $mod+Down focus down
     bindsym $mod+Up focus up
     bindsym $mod+Right focus right

     # alternatively, you can use the cursor keys:
     bindsym $mod+Shift+Left move left
     bindsym $mod+Shift+Down move down
     bindsym $mod+Shift+Up move up
     bindsym $mod+Shift+Right move right

     # split in horizontal orientation
     bindsym $mod+h split h

     # split in vertical orientation
     bindsym $mod+v split v

     # enter fullscreen mode for the focused container
     bindsym $mod+f fullscreen

     # change container layout (stacked, tabbed, default)
     bindsym $mod+s layout stacking
     bindsym $mod+z layout tabbed
     bindsym $mod+e layout default

     # toggle tiling / floating
     bindsym $mod+Shift+space floating toggle

     # change focus between tiling / floating windows
     bindsym $mod+space focus mode_toggle

     # focus the parent container
     bindsym $mod+q focus parent

     # switch to workspace
     bindsym $mod+ampersand workspace 1: Mail
     bindsym $mod+eacute workspace 2: Web
     bindsym $mod+quotedbl workspace 3: Terminal
     bindsym $mod+apostrophe workspace 4: Emacs
     bindsym $mod+parenleft workspace 5: Music
     bindsym $mod+minus workspace 6
     bindsym $mod+egrave workspace 7
     bindsym $mod+underscore workspace 8
     bindsym $mod+ccedilla workspace 9
     bindsym $mod+agrave workspace 10

     # move focused container to workspace
     bindsym $mod+Shift+1 move workspace 1: Mail
     bindsym $mod+Shift+2 move workspace 2: Web
     bindsym $mod+Shift+3 move workspace 3: Terminal
     bindsym $mod+Shift+4 move workspace 4: Emacs
     bindsym $mod+Shift+5 move workspace 5: Music
     bindsym $mod+Shift+6 move workspace 6
     bindsym $mod+Shift+7 move workspace 7
     bindsym $mod+Shift+8 move workspace 8
     bindsym $mod+Shift+9 move workspace 9
     bindsym $mod+Shift+0 move workspace 10

     # reload the configuration file
     bindsym $mod+Shift+C reload

     # restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
     bindsym $mod+Shift+R restart

     # exit i3 (logs you out of your X session)
     bindsym $mod+Shift+E exit

     # resize window (you can also use the mouse for that)
     mode "resize" {
        # These bindings trigger as soon as you enter the resize mode

        # They resize the border in the direction you pressed, e.g.
        # when pressing left, the window is resized so that it has
        # more space on its left

        bindsym j resize shrink left 10 px or 10 ppt
        bindsym Shift+J resize grow   left 10 px or 10 ppt

        bindsym k resize shrink down 10 px or 10 ppt
        bindsym Shift+K resize grow   down 10 px or 10 ppt

        bindsym l resize shrink up 10 px or 10 ppt
        bindsym Shift+L resize grow   up 10 px or 10 ppt

        bindsym m resize shrink right 10 px or 10 ppt
        bindsym Shift+M resize grow   right 10 px or 10 ppt

        # same bindings, but for the arrow keys
        bindsym Left resize shrink left 10 px or 10 ppt
        bindsym Shift+Left resize grow   left 10 px or 10 ppt

        bindsym Down resize shrink down 10 px or 10 ppt
        bindsym Shift+Down resize grow   down 10 px or 10 ppt

        bindsym Up resize shrink up 10 px or 10 ppt
        bindsym Shift+Up resize grow   up 10 px or 10 ppt

        bindsym Right resize shrink right 10 px or 10 ppt
        bindsym Shift+Right resize grow   right 10 px or 10 ppt

        # back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
     }

     bindsym $mod+r mode "resize"

     # Gestion de la barre de base:
     bar {
         status_command i3status
     }

     # assign bordel:
     assign [instance="Mutt"] → 1: Mail
     assign [class="Iceweasel"] → 2: Web
     assign [instance="Terminal"] → 3: Terminal
     assign [instance="Emacs"] → 4: Emacs
     assign [instance="Cmus"] → 5: Music

     # Démarrage de mes outils de base
     exec urxvt -name Mutt -e mutt
     exec ~/bin/firefox
     exec urxvt -name Terminal
     exec urxvt -name Emacs -e emacs
     exec /home/medspx/.i3/fehbg
     exec urxvt -name Cmus -e cmus

La barre de notification de i3-wm indique tout correctement sauf l'état de la batterie ce qui est un peu génant pour un ordinateur portable. i3-status est un programme en C qui s'appuie sur des trucs en dur pour lire l'état de la batterie. Dans mon cas, je n'avais pas d'affichage simplement en raison de la configuration par défaut de i3status (fichier ~/.i3status.conf).

En effet, le problème venait du fait que i3status tentait de récupérer des infos sur la batterie en interrogant sysfs de la mauvaise manière: il interroge la batterie 0 alors qu'en fait les informations sont récupérables dans /sys/class/power_supply/BAT1/uevent en lieu et place de /sys/class/power_supply/BAT0/uevent !

Voici donc mon passage de configuration de la batterie dans ~/.i3status.conf:

order += "battery 0"
...
battery 0 {
        format = "%status %percentage %remaining"
        format_down = "No battery"
        path = "/sys/class/power_supply/BAT1/uevent"
        low_threshold = 10
}
...

Maintenant, je peux voir facilement si je vais manquer de jus ou non...

Configuration du clavier

Par défaut, rxvt-unicode affecte son opération de copier-coller avec les combinaisons de touches suivantes:

  • Shitf+Insert pour copier ce qui est sélectionné
  • Ctrl+Insert pour coller ce qui est dans le tampon

Malheureusement, le clavier du Lenovo E145 ne dispose pas de touche Insert ! Il faut donc en modifier le comportement par défaut. Pour ma part, j'ai choisi d'employer la touche Suppr qui se trouve à peu près placée au même niveau physique pour mes doigts que la touche Insert sur un clavier classique.

Un client de courrier électronique

Pour le courrier électronique, un mutt bien placé permet de faire l'affaire. Mon cahier des charges sur un ordinateur portable est pourtant un peu différent de ce que je peux retrouver sur une machine qui sera tout le temps connectée à un serveur IMAP.

En fait, la configuration de Mutt doit refléter le fait que je souhaite éditer et lire des mails en offline. Il faut donc un moyen de rapatrier tout le courrier électronique lors de la consultation réseau ainsi qu'un moyen de renvoyer le courrier qui doit être envoyé.

Le choix est assez simple et se résume à deux programmes assez sympathiques:

  • OfflineImap qui permet de récupérer le contenu d'un compte IMAP en local dans une arborescence de type Maildir.
  • msmtp qui est un MTA light qui gère les files de message. Ainsi, il est possible de le configurer pour qu'il effectue l'envoi vers un autre MTA quand il est en ligne.

Ma configuration est simple car je n'ai qu'un seul compte IMAP et un seul compte SMTP. La configuration d'Offline IMAP se résumera au fichier de configuration qui suit:

[general]
# List of accounts to be synced, separated by a comma.
accounts = main

[Account main]
# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
localrepository = main-local
# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
remoterepository = main-remote
# Status cache. Default is plain, which eventually becomes huge and slow.
status_backend = sqlite

[Repository main-local]
# Currently, offlineimap only supports maildir and IMAP for local repositories. 
type = Maildir
# Where should the mail be placed?
localfolders = ~/Mail

[Repository main-remote]
# Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.
type = IMAP
remotehost = imap.example.com
remoteuser = john.doe

Pour gérer la connectivité, j'ai créé une simple tâche cron qui s'occupe de rapatrier les messages uniquement quand une adresse IP existe. Le tout est concentré dans un script shell qui se charge de vérifier si le réseau est actif et de lancer offlineimap:

#!/bin/bash
# Script de lancement intelligent de offlineimap

# Détection d'une interface réseau active
ip -4 address | egrep -q 'eth0|wlan0'

# Si ok, on lance Iceweasel
if [ "$?" -eq "0" ] 
then
  echo -e "Found a network interface => go grab your mails !\n"
  /usr/bin/offlineimap &
  exit 0
else
  echo -e "No network interface found => go fuck yourself !\n"
  exit 1
fi

Et voici la crontab:

5 * * * * ~/bin/email

Pour la sécurité, je vais utiliser une simple solution: .netrc. Même si je n'aime pas les mots de passe en clair, la partition est chiffrée, pas de risque qu'on me le pique en cas de subtilisation de la machine. De toute manière, le jour où quelqu'un me pique une machine, je change tout...

Configuration du trackpad

Par défaut, le trackpad est mal configuré. En effet, une simple pression dessus ne permet pas d'obtenir un clic-gauche. Je suis donc obligé d'utiliser les boutons du dessus ce qui est assez pénible ou bien d'enfoncer complètement le trackpad ce qui est aussi non naturel et peu discret ! De plus, par défaut, le scrolling vertical est réalisé à l'aide de deux doigts qui doivent défiler vers le bas ou le haut pour réaliser le défilement. Je ne savais pas que ça existait et je n'aime pas du tout ça ! Au contraire, pour moi, le défilement vertical doit être réalisé avec un défilement d'un seul doigt sur le côté du touchpad.

Changeons donc tout ça ! Le premier moyen de modifier la configuration par défaut, c'est d'utiliser l'outil synclient. Ce dernier permet de configurer aux petits oignons les touchpads Synaptics. C'est le cas pour le touchpad du e145. Pour désactiver le scrolling à deux doigts, il suffit de lancer la commande suivante:

$ synclient VertTwoFingerScroll=0

Pour avoir une liste des options, un simple synclient -l suffit. A vous de trouvez la configuration qui vous plaît. Une fois que vous avez trouvé les bonnes options à activer et à désactiver, il faudra rendre cette configuration permanente. Comment faire ?

La réponse se trouve dans le fichier /etc/X11/xorg.conf... Mais vous allez me dire qu'en fait, par défaut, ce fichier n'existe pas. Il faut donc le créer. Pour ma part, j'ai utilisé la commande Xorg -configure qui permet de générer un fichier de base (après avoir coupé mon serveur X). Normalement cette manipulation doit retrouver votre bon pilote vidéo (ce sera radeon pour le e145).

Voici mon fichier xorg.conf commenté sur la partie touchpad qui vous permettra de configurer votre touchpad comme le mien.

    Section "ServerLayout"
       Identifier     "X.org Configured"
   Screen      0  "Screen0" 0 0
   InputDevice    "Mouse0" "CorePointer"
   InputDevice    "Keyboard0" "CoreKeyboard"
   InputDevice    "Touchpad0"
    EndSection

    Section "Files"
   ModulePath   "/usr/lib/xorg/modules"
   FontPath     "/usr/share/fonts/X11/misc"
   FontPath     "/usr/share/fonts/X11/cyrillic"
   FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
   FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
   FontPath     "/usr/share/fonts/X11/Type1"
   FontPath     "/usr/share/fonts/X11/100dpi"
   FontPath     "/usr/share/fonts/X11/75dpi"
   FontPath     "built-ins"
    EndSection

    Section "Module"
       Load  "glx"
    EndSection

    Section "InputDevice"
   Identifier  "Keyboard0"
   Driver      "kbd"
    EndSection

    Section "InputDevice"
   Identifier  "Mouse0"
   Driver      "mouse"
   Option      "Protocol" "auto"
   Option      "Device" "/dev/input/mice"
   Option      "ZAxisMapping" "4 5 6 7"
    EndSection

    # Ici commence la conf du touchpad
    Section "InputDevice"
   Identifier "Touchpad0"
   Driver     "synaptics"
   Option     "TapButton1" "1"              # Cette option active le clic-gauche par un Tap sur le touchpad
   Option     "VertEdgeScroll" "1"          # Cette option active le scrolling par défilement sur le côté droit du touchpad
   Option     "VertTwoFingerScroll" "0"     # Cette option désactive le scrolling à deux doigts
    EndSection

    Section "Monitor"
   Identifier   "Monitor0"
   VendorName   "Monitor Vendor"
   ModelName    "Monitor Model"
   Option      "DPMS" "true"
    EndSection

    Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
        ### <percent>: "<f>%"
        ### [arg]: arg optional
        #Option     "NoAccel"                # [<bool>]
        #Option     "SWcursor"               # [<bool>]
        #Option     "EnablePageFlip"         # [<bool>]
        #Option     "ColorTiling"            # [<bool>]
        #Option     "ColorTiling2D"          # [<bool>]
        #Option     "RenderAccel"            # [<bool>]
        #Option     "SubPixelOrder"          # [<str>]
        #Option     "EXAVSync"               # [<bool>]
        #Option     "EXAPixmaps"             # [<bool>]
        #Option     "ZaphodHeads"            # <str>
        #Option     "EnablePageFlip"         # [<bool>]
        #Option     "SwapbuffersWait"        # [<bool>]
   Identifier  "Card0"
   Driver      "radeon"
   BusID       "PCI:0:1:0"
    EndSection

    Section "Screen"
   Identifier "Screen0"
   Device     "Card0"
   Monitor    "Monitor0"
   SubSection "Display"
       Viewport   0 0
       Depth     24
       Modes "1366x768"
   EndSubSection
    EndSection

Voilà, avec cette configuration, un touchpad adapté à vos besoins est né !

Gestion de l'hibernation

Si vous utilisez systemd, il n'y a rien à faire: ce dernier gère comme un grand l'hibernation lorsque l'écran se baisse. UTILISEZ SYSTEMD !

Un ordinateur portable se doit d'avoir une bonne gestion de son énergie. En règle générale, sur ce dernier point, il existe un ensemble d'utilitaires dédiés. C'est notamment le cas des pm-utils qui proposent de mettre la machine dans un mode d'hibernation donné.

Par défaut, lorsqu'on ferme l'écran sur le clavier, rien ne se passe. Ça peut être un mode de travail: ça permet notamment de continuer à écouter de la musique tout en ayant fermé l'écran. Mais ça continue à consommer du courant. Je veux simplement que quand l'écran se ferme, la machine se mette en hibernation en RAM et que quand l'écran s'ouvre, l'hibernation prenne fin.

Dans la pratique, c'est assez facile à mettre en oeuvre. Il suffit d'éditer le fichier /etc/default/acpi-support et de décommenter les bonnes lignes; en particulier ces dernières:

...
# Comment the next line to disable ACPI suspend to RAM
ACPI_SLEEP=true

# Comment the next line to disable suspend to disk
ACPI_HIBERNATE=true

# Comment this out to disable screen locking on resume
LOCK_SCREEN=true

# Uncomment this to enable ACPI sleep when the lid screen is closed.
LID_SLEEP=true
...

Configuration du BlueTooth

Je n'aime pas le bluetooth. Essentiellement parce que je n'ai pas de périphérique Bluetooth... Sur cette machine, la configuration sera donc de faire en sorte d'avoir un comportement assez fermé sur cette techno de communication. Le plus simple consiste encore à supprimer les paquets liés au bluetooth en espérant que d'autres logiciels ne seront pas impactés.

TODO

Quelques programmes bien utiles pour le train

Voici une liste non-exhaustive de programmes à utiliser dans le train:

  • Emacs pour écrire des textes, des articles à publier.
  • Emacs encore pour gérer la ou les TODO lists avec org-mode.
  • Scummvm avec des jeux de LucasFilms Games d'avant 1996 car il n'y a que le Point'n Click comme jeu pour les vrais gentlemens !
  • Ok, on peut installer un équivalent d'Elite Frontier parce qu'on aime s'évader dans l'espace pendant qu'on traîne dans le train.
  • cmus avec le plugin ffmpeg pour lire sa musique en mode texte parce qu'en fait, c'est crétin d'avoir une interface graphique qui ne sera pas affichée pendant toute la durée du trajet.
  • Mutt pour gérer les emails en mode Offline parce qu'il faut bien faire semblant de bosser, toujours en mode texte: la classe !
  • Mplayer2 pour regarder une vidéo de cours sur les Algorithmes de Princeton, disponible sur Coursera. Parce qu'il faut toujours apprendre et que dans le train, on n'a que ça à foutre !
  • Un sniffer bluetooth qui gère les portes dérobées des téléphones portables du marché histoire de prendre le contrôle sur les gens qui veulent essayer de parler dans les transports en commun alors que c'est interdit (si si, allez vérifier, dans le doute taisez-vous !).

Liste des paquets installés

Pour terminer et parce qu'il ne faut rien oublier, voici la liste des paquets de cette machine:

 acl acpi acpi-support-base acpid adduser alsa-base alsa-utils apt apt-utils aptitude aptitude-common backup base-files base-passwd bash bash-completion binutils blt broadcom-sta-dkms bsd-mailx bsdmainutils bsdutils busybox ca-certificates clementine coinor-libcbc3 coinor-libcgl1 coinor-libclp1 coinor-libcoinmp1:amd64 coinor-libcoinutils3 coinor-libosi1 console-setup console-setup-linux coreutils cpio cpp cpp-4.8 cpp-4.9 cron cryptsetup cryptsetup-bin dash dbus dbus-x11 dconf-gsettings-backend:amd64 dconf-service debconf debconf-i18n debian-archive-keyring debianutils dh-python dictionaries-common diffutils discover discover-data dkms dmidecode dmsetup docutils-common dpkg e2fslibs:amd64 e2fsprogs efibootmgr emacs24-bin-common emacs24-common emacs24-nox emacsen-common exim4-base exim4-config exim4-daemon-light faac faad fakeroot findutils firmware-linux-nonfree fontconfig fontconfig-config fonts-dejavu fonts-dejavu-core fonts-dejavu-extra fonts-droid fonts-lyx fonts-opensymbol fonts-vlgothic freepats fuse gcc gcc-4.8 gcc-4.8-base:amd64 gcc-4.9 gcc-4.9-base:amd64 gconf-service gconf2 gconf2-common gdal-bin gettext-base ghostscript glib-networking:amd64 glib-networking-common glib-networking-services gnupg gnupg-agent gnupg2 gpgv grep groff-base grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub2-common gsettings-desktop-schemas gsfonts gstreamer0.10-alsa:amd64 gstreamer0.10-gconf:amd64 gstreamer0.10-plugins-bad:amd64 gstreamer0.10-plugins-base:amd64 gstreamer0.10-plugins-good:amd64 gstreamer0.10-plugins-ugly:amd64 gstreamer0.10-x:amd64 gstreamer1.0-plugins-base:amd64 gzip heirloom-mailx hicolor-icon-theme hostname hunspell-en-us i3-wm i3lock i3status i965-va-driver:amd64 iceweasel ifupdown init init-system-helpers initramfs-tools initscripts insserv installation-report iproute2 iptables iputils-ping isc-dhcp-client isc-dhcp-common iso-codes javascript-common kbd keyboard-configuration klibc-utils kmod laptop-detect less liba52-0.7.4 libaa1:amd64 libaacs0:amd64 libabw-0.1-1 libacl1:amd64 libanyevent-i3-perl libanyevent-perl libapt-inst1.5:amd64 libapt-pkg4.12:amd64 libarmadillo4 libarpack2 libasan0:amd64 libasan1:amd64 libasn1-8-heimdal:amd64 libasound2:amd64 libasound2-data libasprintf0c2:amd64 libass5:amd64 libassuan0:amd64 libasync-interrupt-perl libasyncns0:amd64 libatk1.0-0:amd64 libatk1.0-data libatomic1:amd64 libattr1:amd64 libaudio2:amd64 libaudit-common libaudit1:amd64 libavahi-client3:amd64 libavahi-common-data:amd64 libavahi-common3:amd64 libavc1394-0:amd64 libavcodec56:amd64 libavdevice55:amd64 libavfilter5:amd64 libavformat56:amd64 libavresample2:amd64 libavutil54:amd64 libblas-common libblas3 libblkid1:amd64 libbluray1:amd64 libboost-date-time1.55.0:amd64 libboost-iostreams1.55.0:amd64 libboost-system1.55.0:amd64 libbs2b0 libbsd0:amd64 libbz2-1.0:amd64 libc-bin libc-dev-bin libc6:amd64 libc6-dev:amd64 libcaca0:amd64 libcairo-gobject2:amd64 libcairo2:amd64 libcap-ng0:amd64 libcap2:amd64 libcap2-bin libcdaudio1 libcdio-cdda1 libcdio-paranoia1 libcdio13 libcdparanoia0:amd64 libcdr-0.1-1 libchromaprint0:amd64 libcilkrts5:amd64 libcloog-isl4:amd64 libclucene-contribs1:amd64 libclucene-core1:amd64 libcmis-0.4-4 libcoin80 libcolamd2.8.0:amd64 libcomerr2:amd64 libcommon-sense-perl libconfuse-common libconfuse0:amd64 libcroco3:amd64 libcryptsetup4:amd64 libcups2:amd64 libcupsfilters1:amd64 libcupsimage2:amd64 libcurl3-gnutls:amd64 libcwidget3:amd64 libdap11:amd64 libdapclient3:amd64 libdapserver7:amd64 libdatrie1:amd64 libdb5.3:amd64 libdbus-1-3:amd64 libdbus-glib-1-2:amd64 libdc1394-22:amd64 libdca0:amd64 libdconf1:amd64 libdebconfclient0:amd64 libdevmapper1.02.1:amd64 libdirac-encoder0:amd64 libdirectfb-1.2-9:amd64 libdiscover2 libdns-export100 libdrm-dev:amd64 libdrm-intel1:amd64 libdrm-nouveau2:amd64 libdrm-radeon1:amd64 libdrm2:amd64 libdv4:amd64 libdvdnav4:amd64 libdvdread4:amd64 libe-book-0.1-1 libechonest2.1:amd64 libedit2:amd64 libefivar0:amd64 libegl1-mesa:amd64 libegl1-mesa-drivers:amd64 libelf1:amd64 libenca0:amd64 libeot0 libepoxy0 libepsilon1:amd64 libestr0 libetonyek-0.1-1 libev-perl libev4 libevdev2 libevent-2.0-5:amd64 libexpat1:amd64 libexttextcat-2.0-0 libexttextcat-data libfaac0:amd64 libfaad2:amd64 libfakeroot:amd64 libfcgi0ldbl libffi6:amd64 libfftw3-double3:amd64 libflac8:amd64 libflite1:amd64 libfontconfig1:amd64 libfontenc1:amd64 libfreehand-0.1-1 libfreetype6:amd64 libfreexl1:amd64 libfribidi0:amd64 libftgl2:amd64 libfuse2:amd64 libgbm1:amd64 libgcc-4.8-dev:amd64 libgcc-4.9-dev:amd64 libgcc1:amd64 libgconf-2-4:amd64 libgcrypt20:amd64 libgdal1h libgdbm3:amd64 libgdk-pixbuf2.0-0:amd64 libgdk-pixbuf2.0-common libgeos-3.4.2 libgeos-c1 libgfortran3:amd64 libgif4:amd64 libgl1-mesa-dev:amd64 libgl1-mesa-dri:amd64 libgl1-mesa-glx:amd64 libglade2-0:amd64 libglapi-mesa:amd64 libglew1.10:amd64 libglib2.0-0:amd64 libglib2.0-data libgltf-0.0-0 libglu1-mesa:amd64 libglu1-mesa-dev libgme0 libgmp10:amd64 libgnutls-deb0-28:amd64 libgnutls-openssl27:amd64 libgomp1:amd64 libgpg-error0:amd64 libgpgme11:amd64 libgpm2:amd64 libgpod-common libgpod4:amd64 libgraphicsmagick3 libgraphite2-3:amd64 libgs9 libgs9-common libgsl0ldbl libgsm1:amd64 libgssapi-krb5-2:amd64 libgssapi3-heimdal:amd64 libgstreamer-plugins-bad0.10-0:amd64 libgstreamer-plugins-base0.10-0:amd64 libgstreamer-plugins-base1.0-0:amd64 libgstreamer0.10-0:amd64 libgstreamer1.0-0:amd64 libgtk2.0-0:amd64 libgtk2.0-bin libgtk2.0-common libguard-perl libgudev-1.0-0:amd64 libguess1:amd64 libharfbuzz-icu0:amd64 libharfbuzz0b:amd64 libhcrypto4-heimdal:amd64 libhdf4-0-alt libhdf5-8:amd64 libheimbase1-heimdal:amd64 libheimntlm0-heimdal:amd64 libhogweed2:amd64 libhunspell-1.3-0:amd64 libhx28:amd64 libhx509-5-heimdal:amd64 libhyphen0 libice6:amd64 libicu52:amd64 libidn11:amd64 libiec61883-0:amd64 libijs-0.35:amd64 libimobiledevice4:amd64 libio-socket-ip-perl libirs-export91 libisc-export95 libisccfg-export90 libisl10:amd64 libiso9660-8 libitm1:amd64 libiw30:amd64 libjack-jackd2-0:amd64 libjasper1:amd64 libjbig0:amd64 libjbig2dec0 libjpeg62-turbo:amd64 libjs-jquery libjs-jquery-ui libjson-c2:amd64 libjson-xs-perl libk5crypto3:amd64 libkate1 libkeyutils1:amd64 libklibc libkml0:amd64 libkmod2:amd64 libkrb5-26-heimdal:amd64 libkrb5-3:amd64 libkrb5support0:amd64 libksba8:amd64 liblangtag-common liblangtag1 liblapack3 liblastfm1:amd64 liblcms2-2:amd64 libldap-2.4-2:amd64 libldb1:amd64 liblircclient0 libllvm3.5:amd64 liblocale-gettext-perl liblockfile-bin liblockfile1:amd64 liblogging-stdlog0:amd64 liblognorm1:amd64 liblsan0:amd64 libltdl7:amd64 liblua5.2-0:amd64 liblzma5:amd64 libmad0:amd64 libmhash2:amd64 libmimic0 libmms0:amd64 libmng1:amd64 libmnl0:amd64 libmodplug1 libmount1:amd64 libmp3lame0:amd64 libmpc3:amd64 libmpcdec6:amd64 libmpdec2:amd64 libmpeg2-4:amd64 libmpfr4:amd64 libmpg123-0:amd64 libmspub-0.1-1 libmtdev1:amd64 libmtp-common libmtp-runtime libmtp9:amd64 libmwaw-0.3-3 libmysqlclient18:amd64 libmythes-1.2-0 libncurses5:amd64 libncursesw5:amd64 libneon27-gnutls libnetcdfc7 libnetfilter-acct1:amd64 libnettle4:amd64 libnewt0.52:amd64 libnfnetlink0:amd64 libnl-3-200:amd64 libnl-genl-3-200:amd64 libnspr4:amd64 libnss3:amd64 libntdb1:amd64 libodbc1:amd64 libodfgen-0.1-1 libofa0 libogdi3.2 libogg0:amd64 libopenal-data libopenal1:amd64 libopencore-amrnb0:amd64 libopencore-amrwb0:amd64 libopencv-core2.4:amd64 libopencv-imgproc2.4:amd64 libopenjpeg5:amd64 libopenscenegraph100:amd64 libopenthreads20:amd64 libopenvg1-mesa:amd64 libopus0:amd64 liborc-0.4-0:amd64 liborcus-0.8-0 libosgearth3 libosgearthannotation3 libosgearthfeatures3 libosgearthqt3 libosgearthsymbology3 libosgearthutil3 libp11-kit0:amd64 libpam-modules:amd64 libpam-modules-bin libpam-mount libpam-runtime libpam0g:amd64 libpango-1.0-0:amd64 libpangocairo-1.0-0:amd64 libpangoft2-1.0-0:amd64 libpaper-utils libpaper1:amd64 libparted2:amd64 libpcap0.8:amd64 libpci3:amd64 libpciaccess0:amd64 libpcre3:amd64 libpcsclite1:amd64 libperl5.20 libpipeline1:amd64 libpixman-1-0:amd64 libplist2:amd64 libpng12-0:amd64 libpoppler-glib8:amd64 libpoppler46:amd64 libpopt0:amd64 libpostproc52 libpq5:amd64 libprocps3:amd64 libproj0 libprojectm2 libprotobuf9:amd64 libproxy1:amd64 libpsl0:amd64 libpth20:amd64 libpthread-stubs0-dev:amd64 libpulse0:amd64 libpython-stdlib:amd64 libpython2.7:amd64 libpython2.7-minimal:amd64 libpython2.7-stdlib:amd64 libpython3-stdlib:amd64 libpython3.4:amd64 libpython3.4-minimal:amd64 libpython3.4-stdlib:amd64 libqca2:amd64 libqgis-analysis2.8.1 libqgis-core2.8.1 libqgis-customwidgets libqgis-gui2.8.1 libqgis-networkanalysis2.8.1 libqgis-server2.8.1 libqgisgrass2.8.1 libqgispython2.8.1 libqjson0:amd64 libqscintilla2-11 libqscintilla2-l10n libqt4-dbus:amd64 libqt4-declarative:amd64 libqt4-designer:amd64 libqt4-dev libqt4-dev-bin libqt4-help:amd64 libqt4-network:amd64 libqt4-opengl:amd64 libqt4-opengl-dev libqt4-qt3support:amd64 libqt4-script:amd64 libqt4-scripttools:amd64 libqt4-sql:amd64 libqt4-sql-mysql:amd64 libqt4-sql-sqlite:amd64 libqt4-svg:amd64 libqt4-test:amd64 libqt4-xml:amd64 libqt4-xmlpatterns:amd64 libqtassistantclient4:amd64 libqtcore4:amd64 libqtdbus4:amd64 libqtgui4:amd64 libqtwebkit-dev libqtwebkit4:amd64 libquadmath0:amd64 libquvi-scripts libquvi7:amd64 libqwt6 libqxt-core0:amd64 libqxt-gui0:amd64 libraptor2-0:amd64 librasqal3:amd64 libraw1394-11:amd64 librdf0:amd64 libreadline6:amd64 libreoffice-avmedia-backend-gstreamer libreoffice-base-core libreoffice-calc libreoffice-common libreoffice-core libreoffice-draw libreoffice-impress libreoffice-math libreoffice-style-galaxy libreoffice-writer librevenge-0.0-0 libroken18-heimdal:amd64 librsvg2-2:amd64 librsvg2-common:amd64 librtmp1:amd64 libsamplerate0:amd64 libsasl2-2:amd64 libsasl2-modules:amd64 libsasl2-modules-db:amd64 libschroedinger-1.0-0:amd64 libsdl2-2.0-0:amd64 libselinux1:amd64 libsemanage-common libsemanage1:amd64 libsepol1:amd64 libsgutils2-2 libshout3:amd64 libsidplay1 libsigc++-2.0-0c2a:amd64 libslang2:amd64 libslv2-9 libsm6:amd64 libsmartcols1:amd64 libsmbclient:amd64 libsndfile1:amd64 libsoundtouch0:amd64 libsoup-gnome2.4-1:amd64 libsoup2.4-1:amd64 libspandsp2:amd64 libspatialindex3:amd64 libspatialite5:amd64 libspeex1:amd64 libsqlite3-0:amd64 libss2:amd64 libssh2-1:amd64 libssl1.0.0:amd64 libstartup-notification0:amd64 libstdc++6:amd64 libswscale3:amd64 libsystemd0:amd64 libtag1-vanilla:amd64 libtag1c2a:amd64 libtalloc2:amd64 libtasn1-6:amd64 libtbb2 libtcl8.6:amd64 libtdb1:amd64 libtevent0:amd64 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libthai-data libthai0:amd64 libtheora0:amd64 libtiff5:amd64 libtinfo5:amd64 libtk8.6:amd64 libtokyocabinet9:amd64 libtsan0:amd64 libtwolame0 libtxc-dxtn-s2tc0:amd64 libubsan0:amd64 libudev1:amd64 liburiparser1 libusb-0.1-4:amd64 libusb-1.0-0:amd64 libusbmuxd2:amd64 libustr-1.0-1:amd64 libutempter0 libuuid-perl libuuid1:amd64 libv4l-0:amd64 libv4lconvert0:amd64 libva-glx1:amd64 libva-x11-1:amd64 libva1:amd64 libvcdinfo0 libvdpau1:amd64 libvisio-0.1-1 libvisual-0.4-0:amd64 libvisual-0.4-plugins:amd64 libvo-aacenc0:amd64 libvo-amrwbenc0:amd64 libvorbis0a:amd64 libvorbisenc2:amd64 libvpx1:amd64 libwavpack1:amd64 libwayland-client0:amd64 libwayland-cursor0:amd64 libwayland-egl1-mesa:amd64 libwayland-server0:amd64 libwbclient0:amd64 libwebp5:amd64 libwebpdemux1:amd64 libwebpmux1:amd64 libwildmidi-config libwildmidi1:amd64 libwind0-heimdal:amd64 libwmf0.2-7:amd64 libwpd-0.10-10 libwpg-0.3-3 libwps-0.3-3 libwrap0:amd64 libx11-6:amd64 libx11-data libx11-dev:amd64 libx11-doc libx11-xcb-dev:amd64 libx11-xcb1:amd64 libx264-142:amd64 libxapian22 libxau-dev:amd64 libxau6:amd64 libxaw7:amd64 libxcb-cursor0:amd64 libxcb-dpms0:amd64 libxcb-dri2-0:amd64 libxcb-dri2-0-dev:amd64 libxcb-dri3-0:amd64 libxcb-dri3-dev:amd64 libxcb-glx0:amd64 libxcb-glx0-dev:amd64 libxcb-icccm4:amd64 libxcb-image0:amd64 libxcb-keysyms1:amd64 libxcb-present-dev:amd64 libxcb-present0:amd64 libxcb-randr0:amd64 libxcb-randr0-dev:amd64 libxcb-render-util0:amd64 libxcb-render0:amd64 libxcb-render0-dev:amd64 libxcb-shape0:amd64 libxcb-shape0-dev:amd64 libxcb-shm0:amd64 libxcb-sync-dev:amd64 libxcb-sync1:amd64 libxcb-util0:amd64 libxcb-xfixes0:amd64 libxcb-xfixes0-dev:amd64 libxcb-xinerama0:amd64 libxcb-xkb1:amd64 libxcb1:amd64 libxcb1-dev:amd64 libxcomposite1:amd64 libxcursor1:amd64 libxdamage-dev:amd64 libxdamage1:amd64 libxdmcp-dev:amd64 libxdmcp6:amd64 libxerces-c3.1:amd64 libxext-dev:amd64 libxext6:amd64 libxfixes-dev:amd64 libxfixes3:amd64 libxfont1:amd64 libxft2:amd64 libxi6:amd64 libxine2 libxine2-bin libxine2-doc libxine2-ffmpeg libxine2-misc-plugins libxine2-plugins libxinerama1:amd64 libxkbcommon-x11-0:amd64 libxkbcommon0:amd64 libxkbfile1:amd64 libxml2:amd64 libxmu6:amd64 libxmuu1:amd64 libxpm4:amd64 libxrandr2:amd64 libxrender1:amd64 libxshmfence-dev:amd64 libxshmfence1:amd64 libxslt1.1:amd64 libxss1:amd64 libxt6:amd64 libxtables10 libxtst6:amd64 libxv1:amd64 libxvidcore4:amd64 libxxf86dga1:amd64 libxxf86vm-dev:amd64 libxxf86vm1:amd64 libyajl2:amd64 libzbar0 libzvbi-common libzvbi0:amd64 linux-base linux-compiler-gcc-4.8-x86 linux-headers-3.16.0-4-amd64 linux-headers-3.16.0-4-common linux-headers-amd64 linux-image-3.16.0-4-amd64 linux-image-amd64 linux-kbuild-3.16 linux-libc-dev:amd64 locales login logrotate lp-solve lsb-base make man-db manpages manpages-dev mawk menu mesa-common-dev:amd64 mime-support mount mpv multiarch-support mutt mysql-common nano ncurses-base ncurses-bin ncurses-term net-tools netbase netcat-traditional nfacct obnam odbcinst odbcinst1debian2:amd64 offlineimap openssh-client openssh-server openssh-sftp-server openssl os-prober osgearth-data parted passwd patch pciutils perl perl-base perl-modules pinentry-gtk2 poppler-data popularity-contest procps proj-bin proj-data projectm-data psmisc python python-cairo python-chardet python-cliapp python-crypto python-dateutil python-debian python-debianbts python-defusedxml python-docutils python-ecdsa python-egenix-mxdatetime python-egenix-mxtools python-fuse python-gdal python-glade2 python-gobject-2 python-gtk2 python-httplib2 python-imaging python-jinja2 python-larch python-markupsafe python-matplotlib python-matplotlib-data python-minimal python-mock python-nose python-numpy python-paramiko python-pil:amd64 python-pkg-resources python-psycopg2 python-pygments python-pyparsing python-pyspatialite python-qgis python-qgis-common python-qscintilla2 python-qt4 python-reportbug python-roman python-sip python-six python-soappy python-support python-talloc python-tk python-tracing python-ttystatus python-tz python-wstools python2.7 python2.7-minimal python3 python3-minimal python3-uno python3.4 python3.4-minimal qdbus qgis qgis-common qgis-plugin-globe qgis-plugin-globe-common qgis-plugin-grass qgis-plugin-grass-common qgis-providers qgis-providers-common qt4-designer qt4-linguist-tools qt4-qmake qtchooser qtcore4-l10n readline-common reportbug rfkill rsyslog rxvt-unicode samba-libs:amd64 sed sensible-utils sgml-base shared-mime-info slim startpar suckless-tools systemd systemd-sysv sysv-rc sysvinit-utils tar tasksel tasksel-data tcpd tk8.6-blt2.5 traceroute ttf-dejavu ttf-dejavu-core ttf-dejavu-extra tzdata ucf udev uno-libs3 ure usbmuxd usbutils util-linux va-driver-all:amd64 vdpau-va-driver:amd64 vim-common vim-tiny wakeonlan wget whiptail wireless-tools wpasupplicant x11-common x11-utils x11-xkb-utils x11proto-core-dev x11proto-damage-dev x11proto-dri2-dev x11proto-fixes-dev x11proto-gl-dev x11proto-input-dev x11proto-kb-dev x11proto-xext-dev x11proto-xf86vidmode-dev xauth xbitmaps xdg-user-dirs xfonts-base xfonts-encodings xfonts-utils xinit xkb-data xml-core xorg-sgml-doctools xserver-common xserver-xorg xserver-xorg-core xserver-xorg-input-all xserver-xorg-input-evdev xserver-xorg-input-mouse xserver-xorg-input-synaptics xserver-xorg-input-vmmouse xserver-xorg-input-wacom xserver-xorg-video-ati xserver-xorg-video-mach64 xserver-xorg-video-r128 xserver-xorg-video-radeon xterm xtrans-dev zlib1g:amd64

Conclusion

Avec beaucoup de persévérance, il est donc possible de configurer une machine Lenovo E145 sous GNU/Linux Debian à sa façon... à condition de se lever de bonne heure le matin (et de bien dormir la nuit sinon le cerveau reste au point mort).