sept 05 2008

Automatiser une compilation après l’installation d’un nouveau noyau

Tag: Debian GNU/Linux, SystèmeSylvain @ 06:25

Quoi de plus énervant que de devoir lancer systématiquement la compilation d’un module après l’installation d’un nouveau noyau ? Une solution simple pour contourner ce problème est d’utiliser le fichier « /etc/kernel-img.conf » qui est consulté par les différents scripts d’installation des paquets pour les noyaux.

Voici le contenu typique de ce fichier :

# Kernel image management overrides
# See kernel-img.conf(5) for details
do_symlinks = yes
relative_links = yes
do_bootloader = yes
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
postinst_hook = update-grub
postrm_hook = update-grub

La variable qui nous intéresse est postinst_hook, elle contient le programme à lancer après l’installation du noyau. À celui-ci est passé deux paramètres : en premier la version du noyau et en second le chemin vers le noyau lui-même. Par défaut, update-grub est lancé permettant la mise à jour du menu de démarrage (« /boot/grub/menu.lst »).

Prenons pour l’exemple, la compilation du module propriétaire Nvidia.

Il nous faut donc créer un script effectuant la mise à jour de GRUB ainsi que cette compilation grâce à « module-assistant ». En théorie, ce n’est pas plus compliqué que ça, mais en pratique, on se rend compte que ça ne fonctionne pas, tout simplement parce que « module-assistant » a besoin d’installer des paquets et qu’une instance de « dpkg » est déjà en route pour l’installation du noyau… Une solution est donc de créer un script qui s’exécutera ultérieurement, j’ai choisi de créer un service qui sera lancé dès que la machine changera de niveau d’exécution (ce qu’on appelle le « runlevel »).

Voici le script, à adapter à vos besoins, qui générera le service :

root@gnusquad:~# vi /usr/local/sbin/postinst_kernel.sh

#!/bin/sh

FILE=/etc/init.d/update-kernel

# Compilation du module Nvidia pour la version $1 du noyau
echo "m-a a-i nvidia -l $1" >> $FILE

# Mise à jour de grub
echo "update-grub $@" >> $FILE

# Suppression du script une fois son travail terminé
echo "update-rc.d -f update-kernel remove" >> $FILE
echo "rm $FILE" >> $FILE

# Ajout des permissions d'exécution sur le script
chmod +x $FILE

# Ajout du script dans les différents runlevel
update-rc.d update-kernel defaults

Rendons le exécutable :

root@gnusquad:~# chmod +x $_

Et mettons à jour la variable « postinst_hook » du fichier de configuration :

root@gnusquad:~# vi /etc/kernel-img.conf

# See kernel-img.conf(5) for details
do_symlinks = yes
relative_links = yes
do_bootloader = yes
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
postinst_hook = /usr/local/sbin/postinst_kernel.sh
postrm_hook = update-grub

Désormais, à l’installation d’un nouveau noyau, ce script sera lancé, celui-ci générera le fichier « /etc/init.d/update-kernel » qui sera, pour sa part, exécuté lors du prochain changement de niveau d’exécution (généralement lors du redémarrage ou de l’arrêt de la machine). Pensez à vérifier « tty7 » (CTRL-ALT-F7) si vous étiez sous « X » histoire de voir la compilation s’effectuer au cas où …

Voilà, c’était pas plus dur que ça grâce à Debian ! :-)
Pour information, d’autres hooks sont disponibles (postrm, preinst, prerm, …), il ne vous reste plus qu’à en faire bon usage ! ;)

Source :