web-dev-qa-db-fra.com

Comment recompiler un seul module noyau?

Habituellement, les sources du noyau sont stockées dans /usr/src/linux-2.6.x/. Pour éviter de recompiler le noyau entier si je modifie la source d'un module, comment puis-je recompiler uniquement ce module?

47
user1056635

Basculez vers le répertoire racine de votre arborescence source et exécutez la commande suivante:

$ make modules SUBDIRS=drivers/the_module_directory

Et pour installer le module compilé:

$ make modules_install SUBDIRS=drivers/the_module_directory

Note: Comme le mentionne lunakid, cette dernière commande pourrait pas construire le module en premier, alors soyez prudent.

56
Niklas B.

depuis les versions du noyau 3.xx et 4.xx la procédure devient plus compliqué (mais il y a un espoir, alors continuez à lire):

  1. make distclean si vous n'avez pas simplement cloné une nouvelle source mais utilisé pour construire d'autres modules avant
  2. créer un nouveau dossier quelque part pour la source du module (exemple: extra ) et copier uniquement les fichiers source (depuis la source du noyau ou ailleurs) liés au module nécessaire à intégrer dans ce nouveau dossier
  3. copie /boot/config-`uname -r` fichier (exemple: /boot/config-4.8.0-46-generic ) dans le fichier du dossier source du noyau .config et exécutez make oldconfig. si le module appartient à la source du noyau, vérifiez s'il a été activé en appelant make menuconfig, en recherchant le module et en appliquant la lettre 'M' si nécessaire
  4. racine source du noyau Makefile doit être modifié avec les composants de version exacts correspondant à celui en cours d'exécution (vous pouvez vérifier avec make kernelversion s'il correspond exactement au uname -run)
  5. il y a eu une forte suggestion de créer des scripts avant avec make scripts
  6. make prepare et make modules_prepare doit être exécuté avant la construction réelle du module
  7. Module.symvers doit être copié à partir du dossier des en-têtes du système cible correspondant à la version du noyau en cours d'exécution /usr/src/linux-headers-`uname -r`/Module.symvers (exemple: /usr/src/linux-headers-3.13.0-117-generic/Module.symvers ) dans la source de module nouvellement créée dossier de fichiers préparé pour la compilation du module (celui supplémentaire dans l'exemple).
  8. créer un nouveau Makefile dans le dossier de compilation source du module ayant la ligne suivante: obj-y += <module_source_file_name>.o ou si le code source est compliqué, utilisez les conseils de ici
  9. alors c'est le bon moment pour construire un module avec make -C <kernel source path> M=the_module_directory (exemple: make -C . M=extra/)
  10. Utilisez la commande modprobe --dump-modversion <module_name>.ko pour vérifier la correspondance CRC entre l'API d'exportation de module et les valeurs correspondantes dans Module.symvers . en cas d'échec, utilisez la commande modinfo <module_name>.ko au lieu
  11. vérifiez si le contenu du fichier kernel.release correspond exactement à celui des en-têtes de la version en cours d'exécution. si vous découvrez + ajouté à la fin, cela signifie que vous avez compilé la source connectée à git et que vos modifications expérimentales ont amené le système de construction à compromettre la version locale chaîne en ajoutant + à la fin.
  12. si seulement + a été découvert à la fin de kernel.release stocké la valeur et c'est un décalage avec le nom exact du noyau en cours d'exécution cible,

la solution serait la suivante:

validez toutes vos modifications, forcez la balise release à se déplacer au-dessus de vos modifications avec le git tag -a <tag version> -f commande. puis reconstruisez vos modules à partir de l'étape 8

10
Oleg Kokorin

Vous pouvez passer le chemin vers le nom du module ou le répertoire du module pour faire comme paramètre.

make path/to/the/module/itself.ko
make path/to/the/module/directory/
7
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

https://askubuntu.com/questions/515407/how-recipe-to-build-only-one-kernel-module

3
rocky

Dans le cas où vous avez modifié uniquement le code dans le fichier drivers/net/ethernet/intel/e1000/e1000_main.c

Construisez le module.

make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000

Installez le module.

cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
0
siz