sept 05 2008
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 # 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 :
