Comment construire un seul module de noyau dans l'arborescence?

37

Linux-source -... a un module qui est désactivé dans config /boot/config-3.4-trunk-686-pae afin qu’il ne fasse pas partie de linux-image -... (ceci est sur Debian, mais la solution devrait être la même pour Ubuntu, ou?), par exemple

# CONFIG_CAN_PEAK_USB is not set

Comment compiler simplement ce module du noyau, de sorte qu'il puisse être utilisé avec le noyau distribué?

Le paquet linux-source -... correspondant est déjà installé, décompressé et lié à / usr / src / linux. /boot/config-3.4-trunk-686-pae est copié dans /usr/src/linux/.config et modifié avec

CONFIG_CAN_PEAK_USB=m

Avec

make
make modules

il est possible de compiler le noyau et tous les modules. Mais comment ne compiler que ce module spécifique?

(Note: aussi les besoins du noyau à compiler avant, sinon vous obtenez l'erreur suivante: no symbol version for module_layout)

mab
la source
veuillez fermer comme un double de 14627. La réponse de l'utilisateur 'Radu C' répond à la question.
Mab
Avez-vous essayé depmod -aavant modbrobe?
Nadia
1
considérez également l'article suivant: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Réponses:

38

J'ai eu le même problème. Je suppose que vous devez non seulement copier .config mais aussi Module.symvers

mes étapes pour compiler le module ft1000 (exécutant Debian Wheeze 7.1.0; noyau 3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000
Maros Michalik
la source
4
Je ne suis pas sûr si SUBDIRS est toujours correct. Il a été ignoré pour moi. Après avoir lu kernel.org/doc/Documentation/kbuild/modules.txt, j’ai essayé d’utiliser make M=/path/to/modulece qui semblait fonctionner.
harmic
J'essaie de modifier un module différent (ajoute simplement un identifiant USB à un module existant) lorsque je le compile, je ne reçois aucune erreur, mais lorsque je l'insère, je reçois un format de module non valide, pourquoi?!
Zibri
14

Dans le répertoire source de niveau supérieur, indiquez simplement le chemin d'accès au nom ou au répertoire du module, par exemple:

make drivers/net/can/usb/peak_usb/

ou pour un exemple plus simple (pilote Ethernet Intel e1000):

make drivers/net/ethernet/intel/e1000/e1000.ko
ish
la source
Just make drivers/net/can/usb/peak_usb/pcan_usb.koDo : n'a construit que pcan_usb.o. Faire le make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kocompile, mais insmod se plaint Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module format. dmesg:peak_usb: no symbol version for module_layout
mab
Exécutez-vous ce noyau spécifique et l'avez-vous déjà compilé une fois? S'il vous plaît essayer avec modprobeaussi.
ish
J'exécute le noyau empaqueté. La compilation du noyau complet fonctionne. mais j'essaye de ne pas compiler le noyau complet, juste le module de noyau spécifique. Existe-t-il une cible make qui "prépare" une compilation de module unique? modprobe montre la même erreur.
mab
6
Selon stackoverflow, vous pouvez simplement utiliser make modules SUBDIRS=drivers/net/can/usb/peak_usbou n’importe quel autre sous-répertoire. Cela fonctionne bien ici.
Treviño
0

Aussi simple que: (Cet exemple illustre le pilote ft1000, cela ne devrait prendre que quelques minutes, sinon quelques instants)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

Vous pouvez ensuite charger le module avec modprobeafterdepmod

Remarque: en fonction de la dépendance du module, il peut être nécessaire de reconstruire entièrement le noyau.

intika
la source