sept 05

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

# 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 :

10 réponses pour “Automatiser une compilation après l’installation d’un nouveau noyau”

  1. Guyou a dit :

    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.

  2. Sylvain a dit :

    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 ! ;)

  3. Ulhume a dit :

    Effectivement intéressant, merci pour l’idée, faut que je cherche à voir comme faire cela sous Mandriva maintenant ;-)

  4. Dab a dit :

    Ulhume, toi ici ? les grands esprits se recontrent :)
    Merci beaucoup pour cette excellente astuce.

  5. Dab a dit :

    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 » ?

  6. Sylvain a dit :

    Dans le man de ton shell… Pour Bash ça se trouve dans la section « Special Parameters » : http://man.gnusquad.org/bash/section-1/en/

  7. Dab a dit :

    oups sorry … j’y avais pourtant fait une recherche mais sur la chaine ‘\$_’ et non ‘_’.
    Merci

  8. Ulhume a dit :

    @Dab il n’y a pas tant d’articles intéressant que cela sur planet-libre ;-)

  9. marko a dit :

    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” ?

  10. Sylvain a dit :

    Lis la section HISTORY EXPANSION dans le man de bash : http://man.gnusquad.org/bash/section-1/en/

Laissez un commentaire