Artisan Numérique

/système/kernel/ Construire juste un module kernel

Construire et installer un kernel complet c'est aujourd'hui tellement simple que ma nièce de 3 ans peut y arriver.. si je lui dicte ;-). Moi ce que je cherchais depuis des lustres c'est comment ne construire qu'un seul pauvre petit module de rien du tout sans lancer pour cela toute la machine de guerre. L'astuce qui sauve d'une crise de nerf lorsque l'on cherche par exemple à hacker un pilote...

Trois cas de figure

Dans ce qui suit, nous allons trouver les étapes pour compiler trois types de modules :

  1. Un module propriétaire comme celui de nVidia.
  2. Un module de l'arborescence standard de Linux, typiquement après l'avoir joyeusement hacké.
  3. Un module hors de l'arborescence standard.

version des sources

La première chose à faire, dans les trois cas, est de récupérer les sources de la version courante de votre noyau. Je passe là dessus, tout le monde sait faire cela. Lorsqu'on est mandrivien, le seul piège est juste de ne pas se gaufrer dans le souk de numéro de version blindées d'acronymes changeant à chaque release et qu'aujourd'hui encore continue de m'intriguer. Exemple : linux-desktop-2.6.27-0.rc8.2mnb, c'est quelque chose tout de même...

Toujours dans le cas de la Mandriva, une fois les sources installés il ne faut pas oublier de modifier le fichier Makefile de sorte à ce que EXTRAVERSION corresponde bien à ce que vous renvoie uname -r. Si vous ne faites pas cela, vous allez avoir droit à un -1 Invalid module format à l'insertion du module ou une fin de non recevoir pour le pilote nVidia.

Copie de sauvegarde

Si notre but est de hacker un module existant, il vaut mieux sauvegarder une "ancienne version" de l'arborescence des sources.

cp -a /usr/src/linux-$(uname -r) /usr/src/linux-$(uname -r)-old

Configuration

Si vous n'avez pas de configuration à la racine des sources (.config), par exemple après le passage de M. Propre (voir plus loin), il faut en récupérer une de préférence compatible avec le kernel courant. C'est le rôle de la commande oldconfig qui va chercher cette configuration dans /boot/config.$(uname -r).

make oldconfig

Si votre but est d'installer le module nVidia ou un module hors de l'arborescence, vous pouvez passez cette étape, sinon il faut que vous vérifiez dans la configuration que votre module est 1/ bien activé 2/ compilé en tant que module indépendant (marqué [M]) et non pas comme module intégré au noyau (marqué [*]). Personnellement j'aime bien l'interface nCurse pour ce travail :

make menuconfig

Préparation

L'étape suivante n'est utile que pour les modules de type nVidia, elle consiste à préparer la compilation, générer un certain nombre de scripts, de fichiers de version, etc.

make prepare

Compilation du module

Pour ceux qui cherchent à compiler le module nVidia, ça s'arrête ici et il ne vous reste plus qu'à lancer sh NVIDIA-XXX.run.

Pour les autres, c'est là que l'astuce réside. Dans l'exemple suivant je cherche à créer le module fujitsu-laptop qui se trouve dans le dossier drivers/misc. Cela nous donne :

make drivers/misc/fujitsu-laptop.ko

Et oui... Tellement simple que c'est à pleurer en repensant au nombre de fois où je me suis frappé des compilations de kernel complètes sur des machines d'avant guerre... Et ce qui est encore meilleur, c'est que c'est exactement la même chose pour un module hors de l'arborescence :

make /usr/src/u810_tablet/u810_tablet.ko

Une fois que make à terminé son boulot, le module tout frais vous attend sagement dans son dossier, prêt à être inséré pour test :

modinfo drivers/misc/fujitsu-laptop.ko
insmod drivers/misc/fujitsu-laptop.ko

Installation

Pour installer le module, la commande make modules_install ne nous est ici d'aucun secours, il faut bidouiller cela à la main :

# on recopie le modules dans l'arborescence du noyau
cp drivers/misc/fujitsu-laptop.ko /lib/modules/$(uname -r)/drivers/misc/

# un coup de gzip pour qu'il ne choque pas au millieu de ses camarades :
gzip /lib/modules/$(uname -r)/drivers/misc/fujitsu-laptop.ko

# un coup de recalcul de dépendances si c'est un module qui n'existait pas avant (que vous n'avez pas écrasé en somme)
depmod

Voilà, maintenant nous pouvons tester le module "en vrai" :

modinfo fujitsu-laptop
modprobe fujitsu-laptop

Nettoyage et patch

Le ménage c'est utile si vous désirez transformer votre hack en un honorable patch. Mr Proper va en effet supprimer tout fichier que vous avez créé (objets, modules, scripts temporaires, configuration) mais pas ceux que vous avez modifiés. Attention cependant à sauvegarder votre configuration avant.

make mrproper

Et maintenant, un petit patch..

cd ..
diff -Naur linux-$(uname -r)-old linux-$(uname -r) > mon_super_hack-$(uname -r).patch

Conclusion

Voilà, c'est fini...