Il arrive parfois que le module noyau pour un périphérique n’est pas encore intégré au noyau de notre distribution. Il est donc nécessaire de compiler le driver du périphérique en tant que module noyau. Mais à chaque installation d’un nouveau noyau, il faut recompiler ce module noyau… Pour remédier à cela, on va utiliser DKMS. Il va nous permettre de recompiler automatiquement les sources d’un module noyau lors de la mise à jour du noyau.

Driver réseau compilé par DKMS

Dans mon cas, un problème de carte réseau non reconnue est apparue avec le matériel. Pourtant c’est une carte réseau Intel… Et Intel est très libre avec ces drivers habituellement. Cette carte réseau doit utiliser le driver IGB qui doit être compilé à la main au moment où j’en ai eu besoin. Actuellement, depuis Debian Wheezy 7.5 le driver a été intégré au noyau. Mais cet exemple est bon pour montrer l’utilisation de DKMS.

Installation manuelle du driver IGB

Installation des paquets de base :

 apt-get install linux-headers-$(uname -r) firmware-linux-free gcc-4.6

Prendre les paquets suivants à la main dans mon cas vu que je n’ai pas de carte réseau :

  • cpp4.6
  • cpp4.7
  • make

Faire un lien de gcc pour utiliser la version 4.6 et pas 4.7 :

cd /usr/local/bin && ln -s /usr/bin/gcc-4.6 gcc

Compiler le module noyau :

make && make install

Supprimer le lien créé plus haut après que la compilation ait réussie.

Redémarrer !

Ensuite installation de gcc-4.7 :

apt-get update && apt-get install gcc gcc-4.7

Gérer les modules noyau compilés via DKMS

Cela permet de compiler automatique les sources de modules noyau nouvellement installés. Cela réduit le risque d’erreur en cas de mise à jour noyau et lors de la compilation de ses modules. Le module réseau IGB devant être compilé à chaque nouvelle mise à jour du noyau, il est préférable de gérer la compilation par DKMS.

apt-get install dkms
cp -a igb-5.0.6 /usr/src/

Création du fichier « dkms.conf » dans ce répertoire /usr/src/igb-5.0.6 :

MAKE="make -C src/ KERNELDIR=/lib/modules/${kernelver}/build KERNELRELEASE=${kernelver} BUILD_KERNEL=${kernelver}"
CLEAN="make -C src/ clean"
BUILT_MODULE_NAME[0]="igb"
BUILT_MODULE_LOCATION[0]="src/"
PACKAGE_NAME=igb
PACKAGE_VERSION=5.0.6
REMAKE_INITRD=yes
DEST_MODULE_NAME[0]="igb"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/igb/"
AUTOINSTALL=yes

Les lignes à modifier sont :

  • BUILD_MODULE_NAME[0] : le nom du module
  • PACKAGE_NAME : le même nom
  • PACKAGE_VERSION : la version du module
  • DEST_MODULE_NAME[0] : le nom du module qui sera placé dans /lib/modules/$(uname -r)
  • DEST_MODULE_LOCATION[0] : le sous répertoire approprié pour le module

On ajoute ce module dans DKMS pour le gérer :

# dkms add igb/5.0.6 /usr/src/igb-5.0.6/
 Creating symlink /var/lib/dkms/igb/5.0.6/source ->/usr/src/igb-5.0.6
DKMS: add completed.

Ensuite un build et install :

dkms build igb/5.0.6
 dkms install igb/5.0.6

Voilà c’est tout. A la prochaine mise à jour du noyau, les sources du noyau seront automatiquement recompilés.