43 votes

Comment (recette) construire un seul module de noyau?

J'ai un bug dans un module noyau Linux qui provoque un plantage (oops) du noyau Ubuntu 14.04 de base.

C'est pourquoi je veux éditer/patcher uniquement la source de ce module noyau unique pour ajouter des sorties de débogage supplémentaires. Le module noyau en question est mvsas et n'est pas nécessaire pour le démarrage. Pour cette raison, je ne vois pas la nécessité de mettre à jour les images initrd.

J'ai lu beaucoup d'informations (comme indiqué ci-dessous) et je trouve le processus de configuration et de construction confus. J'ai besoin de deux recettes :

  1. pour configurer l'environnement de construction une seule fois
  2. étapes à suivre après avoir modifié un fichier source de ce module noyau (.c et .h) et converti cette modification en un nouveau module noyau (.ko)

Les sources qui ont été utilisées sont :

41voto

Pro Backup Points 3090

La recette pour construire un module personnalisé peut être divisée en trois sections.

Configuration initiale

$ cd ~
$ apt-get source linux-source-3.13.0 

Je suis trop paresseux pour copier les fichiers sources spécifiques au pilote mvsas; copiez simplement tous les fichiers dans votre répertoire de travail actuel. Si apt-get renvoie un message d'erreur concernant des URIs de source manquants, consultez la note n°4 ci-dessous.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

Cela préparera certains fichiers nécessaires pour construire un module de noyau.

Pour chaque version de noyau

$ apt-get install linux-headers-$(uname -r)

Cela installera les en-têtes et le fichier de configuration du noyau Ubuntu pour cette version de noyau dans /lib/modules.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

Ceci pour éviter le message "pas de version de symbole pour module_layout" lors du chargement du module avec insmod ou modprobe.

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

Cela renommera le module kernel original (compilé pour Ubuntu) pour s'assurer que le module personnalisé patché se chargera.

Pour chaque édition

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Ce sont pour les modifications.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Cela compilera et construira le fichier de module de noyau .ko en utilisant la configuration du noyau de votre distribution Ubuntu de base stockée dans /lib/modules/$(uname -r)/.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Cela installera le module de noyau dans /lib/modules/$(uname -r)/extra/, sans écraser le module de distribution au cas où vous n'auriez pas renommé le fichier de module de noyau de distribution. Dans le cas de mvsas, cela exécutera également depmod.

$ lsmod | grep mvsas

Si cela renvoie une sortie, le module mvsas doit être déchargé avec (modprobe -r mvsas) d'abord.

$ sudo modprobe -v mvsas

Cela devrait charger le nouveau module de noyau.

Vérifiez la sortie pour vérifier que /lib/modules/.../extra/mvsas.ko est chargé.

Erreur Modprobe : impossible d'insérer

Dans certains cas, vous pourriez rencontrer une erreur modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg) alors que dans la sortie verbose de modprobe vous voyez que insmod essaie de charger le module depuis l'emplacement par défaut du noyau. Par exemple :

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

Dans ce cas, vous devez exécuter manuellement depmod et essayer de charger à nouveau le module :

# depmod
# sudo modprobe -v mvsas

Notes

  1. Il se peut que les fichiers de module .ko résultants soient beaucoup plus grands (par exemple 20 fois) que les fichiers de module originaux distribués par Ubuntu; dans ce cas, l'étape make prepare pourrait avoir créé un fichier de configuration de noyau de débogage pour les développeurs Linux et vous compilez à partir du répertoire source. Votre paramètre -C pourrait ne pas fonctionner comme prévu.
  2. J'ai vu des guides avec d'autres commandes comme make modules_prepare et make M=scripts/mod mais je ne pense pas qu'ils soient nécessaires dans ce cas.
  3. Vous pouvez utiliser la configuration de débogage des développeurs Linux en remplaçant -C /lib/modules/$(uname -r)/build par -C /usr/src/linux-headers-$(uname -r)
  4. Dans une configuration par défaut, apt-get source linux-sources renverra une erreur E: Vous devez mettre des URI de 'source' dans votre fichier sources.list. Pour résoudre ce problème, vous pouvez modifier le fichier /etc/apt/sources.list en décommentant (en enlevant le # initial) la première ligne deb-src. Exemple pour Ubuntu 17.10 : deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. exécutez sudo apt-get update, et ensuite la commande fournira les sources pour vous. Voir aussi cette question où une méthode GUI pour le faire est également décrite.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X