web-dev-qa-db-fra.com

Comment (recette) construire un seul module de noyau?

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 seulement module du noyau unique pour ajouter une sortie de débogage supplémentaire. Le module de noyau en question est mvsas et n'est pas nécessaire pour 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. configurer/configurer l'environnement de construction une fois
  2. étapes à suivre après la modification d'un fichier source de ce module de noyau (.c et .h) et la conversion de cette modification en un nouveau module de noyau (.ko)

Les sources utilisées sont:

30
Pro Backup

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 apt-get génère un message d'erreur concernant les URI sources manquants , 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 pour empêcher 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 fichier .ko du module de noyau à l'aide de la configuration du noyau de votre distribution Ubuntu d'origine stockée dans /lib/modules/$(uname -r)/.

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

Ceci 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 ce cas, il sera également lancé 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 /lib/modules/.../extra/mvsas.ko est en cours de chargement.

Erreur Modprobe: impossible d'insérer

Dans certains cas, il est possible que vous rencontriez une modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg) alors que dans la sortie détaillée de test modprobe, vous voyez que insmod tente 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 essayez de charger le module à nouveau:

# depmod
# Sudo modprobe -v mvsas

Remarques

  1. Il se peut que les fichiers de module .ko résultants aient une taille beaucoup plus grande (par exemple, 20 fois) que les fichiers de module d'origine distribués par Ubuntu; dans ce cas, l’étape make prepare 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 paramètre -C pourrait ne pas fonctionner comme prévu.
  2. J'ai vu des guides avec d'autres commandes telles que make modules_prepare et make M=scripts/mod mais je ne pense pas que cela soit nécessaire 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 l'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.list en supprimant la mise en commentaire (en supprimant le # initial) de la première ligne deb-src. Exemple pour Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. lancez Sudo apt-get update et la commande livrera les sources pour vous. Voir aussi cette question où une méthode graphique est aussi décrite.
30
Pro Backup