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:
.c
et .h
) et la conversion de cette modification en un nouveau module de noyau (.ko
)Les sources utilisées sont:
La recette pour construire un module personnalisé devra peut-être être divisée en trois sections.
$ 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.
$ 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é.
$ 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.
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
.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.make modules_prepare
et make M=scripts/mod
mais je ne pense pas que cela soit nécessaire dans ce cas.-C /lib/modules/$(uname -r)/build
par -C /usr/src/linux-headers-$(uname -r)
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.