Comment (recette) construire un seul module de noyau?

35

J'ai un bogue dans un module de noyau Linux qui provoque le blocage du noyau Ubuntu 14.04 d'origine (plantage).

C'est pourquoi je veux éditer / patcher la source de ce module de noyau uniquement pour ajouter une sortie de débogage supplémentaire. Le module de noyau en question est mvsaset n'est pas nécessaire de démarrer. 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 trouve la confusion dans les processus d'installation et de construction. J'ai besoin de deux recettes:

  1. installer / configurer l'environnement de construction une fois
  2. les étapes à faire après avoir édité n'importe quel fichier source de ce module de noyau ( .cet .h) et converti cette édition en un nouveau module de noyau ( .ko)

Les sources utilisées sont:

Sauvegarde Pro
la source
Double possible de Comment construire un module de noyau dans l’arbre?
Ciro Santilli a annoncé le
peut-être que cet article aidera aussi: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Réponses:

33

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

Configuration une fois

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

Je suis trop paresseux pour copier les fichiers source du pilote spécifique à MVSA; copiez-les simplement dans votre répertoire de travail actuel. Si le apt-getrésultat est un message d'erreur concernant les adresses URI sources manquantes, reportez-vous à la note 4 au bas de la page.

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

Cela préparera certains fichiers nécessaires à la construction d’un module de noyau.

Chaque version du 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 du noyau dans / lib / modules.

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

Ceci évite 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

Ceci renommera le module de noyau d'origine (version Ubuntu) pour s'assurer que le correctif personnalisé sera chargé.

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

Ceci compilera et construira le .kofichier de module du noyau en utilisant la configuration du noyau de votre distribution stock Ubuntu telle que 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 du module de noyau de distribution. Dans ce cas, il utilisera également depmod .

$ lsmod | grep mvsas

S'il en résulte une sortie, le module mvsas doit d'abord être déchargé avec ( modprobe -r mvsas).

$ sudo modprobe -v mvsas

Cela devrait charger le nouveau module de noyau.

Vérifiez la sortie pour vérifier que le /lib/modules/.../extra/mvsas.kochargement est en cours.

Erreur Modprobe: impossible d'insérer

Dans certains cas, vous remarquerez peut-être un modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)moment dans la sortie de test modulaire modérée qui insmodtente de charger le module à partir de 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 le module à nouveau:

# depmod
# sudo modprobe -v mvsas

Remarques

  1. Il se peut que les .kofichiers de module résultants soient beaucoup plus volumineux (par exemple 20 fois) que les fichiers de module originaux distribués par Ubuntu; dans ce cas, l' make prepareétape aurait pu créer un fichier de configuration du noyau pour le débogage des développeurs Linux et vous construisez à partir du répertoire source. Votre -Cparam peut ne pas fonctionner comme prévu.
  2. J'ai vu des guides avec d'autres commandes telles que make modules_prepareet make M=scripts/modmais je ne pense pas qu'elles 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)/buildpar-C /usr/src/linux-headers-$(uname -r)
  4. Dans une configuration par défaut, apt-get source linux-sourcesrenverra une erreur E: You must put some 'source' URIs in your sources.list. Pour résoudre ce problème, vous pouvez modifier le fichier /etc/apt/sources.listen supprimant la mise en commentaire #de la première deb-srcligne. Exemple pour Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. exécutez sudo apt-get update, puis la commande fournira des sources pour vous. Voir aussi cette question où une méthode graphique est décrite.
Sauvegarde Pro
la source
J'ai eu une erreur: / bin / sh: arm-none-linux -gnueabi-gcc: non trouvé
Dr.jacky
$(uname-r)est apparemment faux ... Vous devez appeler le shellpré-programmé:$(shell uname -r)
Albus Dumbledore
2
@AlbusDumbledore Je vois aussi des cas où $(shell uname -r)cela ne fonctionne pas . Pourquoi est $(uname -r)si apparemment faux?
Pro Backup
J'ai également dû appeler echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confpour que depmodle fichier nouvellement mis à jour soit visible .../extra.
Martin Pecka
1
Que faire avec une erreur de signature de module, comment l'éviter? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko À main.c: 158: - erreur SSL: 02001002: bibliothèque système: fopen: Aucun fichier ou répertoire de ce type: bss_file.c: 175 - erreur SSL: 2006D080: routines BIO: BIO_new_file: aucun fichier de ce type: bss_file.c: 178 fichier de signatures: certs / signature_key.pem: aucun fichier ou répertoire `` `
Envek