sept 05
Automatiser une compilation après l’installation d’un nouveau noyau
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 # On switche de VT pour que l'utilisateur suive ce qu'il se passe echo "chvt 7" >> $FILE # 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).
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 !
À lire :

Le 5 septembre 2008 à 10:39
Très instructif.
Vivement que quelqu’un nous mette au point un méchanisme générique, intégrant module-assistant, les mises à jour kernel et les mises à jour des sources des modules non accessibles sous forme binaires.
Par exemple, un fichier du genre /etc/module-assistant.conf contenant une ligne avec tous les modules à recompiler systématiquement.
En attendant que ce doux rève prenne forme, merci pour cette information.
Le 5 septembre 2008 à 10:51
C’est très simple à faire et c’est exactement le même principe que ce que j’explique, y’a juste un peu plus de bash à écrire pour lire le fichier de configuration… Je l’aurais bien fait mais j’ai pas l’temps !
Le 5 septembre 2008 à 10:56
Effectivement intéressant, merci pour l’idée, faut que je cherche à voir comme faire cela sous Mandriva maintenant
Le 5 septembre 2008 à 13:46
Ulhume, toi ici ? les grands esprits se recontrent
Merci beaucoup pour cette excellente astuce.
Le 5 septembre 2008 à 14:01
Une petite question à propos du ‘chmod +x $_’ : J’ai plûtot l’habitude d’utiliser ‘!$’ pour retourner le dernier argument (comme semble le faire $_’) de la ligne de commande précédente et ‘!^’ pour le premier. Sais tu ou l’on peux trouver de la doc sur ces type de « variables » ?
Le 5 septembre 2008 à 14:08
Dans le man de ton shell… Pour Bash ça se trouve dans la section « Special Parameters » : http://man.gnusquad.org/bash/section-1/en/
Le 5 septembre 2008 à 14:43
oups sorry … j’y avais pourtant fait une recherche mais sur la chaine ‘\$_’ et non ‘_’.
Merci
Le 6 septembre 2008 à 10:03
@Dab il n’y a pas tant d’articles intéressant que cela sur planet-libre
Le 9 janvier 2009 à 15:13
J’ai plûtot l’habitude d’utiliser ‘!$’ pour retourner le dernier argument (comme semble le faire $_’) de la ligne de commande précédente et ‘!^’ pour le premier. Sais tu ou l’on peux trouver de la doc sur ces type de “variables” ?
Le 9 janvier 2009 à 15:21
Lis la section HISTORY EXPANSION dans le man de bash : http://man.gnusquad.org/bash/section-1/en/