Come (ricetta) costruire un solo modulo kernel?


35

Ho un bug in un modulo del kernel Linux che causa il kernel di Ubuntu 14.04 di serie (crash).

Questo è il motivo per cui voglio modificare / patchare la fonte di quel singolo modulo del kernel per aggiungere un ulteriore output di debug. Il modulo del kernel in questione è mvsase non è necessario per l'avvio. Per questo motivo non vedo alcuna necessità di aggiornare alcuna immagine initrd.

Ho letto molte informazioni (come mostrato di seguito) e trovo confusione nel processo di installazione e creazione. Ho bisogno di due ricette:

  1. per impostare / configurare l'ambiente di creazione una volta
  2. passi da fare dopo aver modificato qualsiasi file sorgente di questo modulo del kernel ( .ce .h) e aver convertito quella modifica in un nuovo modulo del kernel ( .ko)

Le fonti che sono state utilizzate sono:



forse questo articolo sarà di aiuto: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Risposte:


33

Potrebbe essere necessario suddividere la ricetta per creare un modulo personalizzato in tre sezioni.

Installa una volta

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

Sono troppo pigro per copiare i file sorgente del driver specifico mvsas; copiarli tutti nella directory di lavoro corrente. Se viene visualizzato apt-getun messaggio di errore relativo agli URI di origine mancanti, vedere la nota n. 4 in fondo.

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

Questo preparerà alcuni file necessari per compilare un modulo del kernel.

Ogni versione del kernel

$ apt-get install linux-headers-$(uname -r)

Questo installerà le intestazioni e il file di configurazione del kernel Ubuntu per quella versione del kernel in / lib / modules.

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

Questo per impedire il messaggio " nessuna versione di simbolo per module_layout " quando si carica il modulo con insmod o modprobe.

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

Questo rinominerà il modulo kernel originale (Ubuntu build) per assicurarsi che venga caricato quello con patch personalizzato.

Ogni modifica

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Questi sono per le modifiche.

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

Questo compilerà e costruirà il .kofile del modulo del kernel usando la configurazione del kernel dalla tua distribuzione Ubuntu di serie come memorizzata in /lib/modules/$(uname -r)/.

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

Questo installerà il modulo del kernel /lib/modules/$(uname -r)/extra/, senza sovrascrivere il modulo di distribuzione nel caso in cui non abbiate rinominato il file del modulo del kernel di distribuzione. In questo caso mvsas verrà eseguito anche depmod .

$ lsmod | grep mvsas

Se ciò comporta un output, il modulo mvsas deve prima essere scaricato con ( modprobe -r mvsas).

$ sudo modprobe -v mvsas

Questo dovrebbe caricare il nuovo modulo del kernel.

Controllare l'output per verificare che /lib/modules/.../extra/mvsas.kosia caricato.

Errore Modprobe: impossibile inserire

In alcuni casi potresti riscontrare un modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)po 'di tempo nell'output modprobe dettagliato che vedi che insmodsta provando a caricare il modulo dalla posizione predefinita del kernel. Per esempio:

# 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)

In tal caso è necessario eseguire manualmente depmod e provare a caricare nuovamente il modulo:

# depmod
# sudo modprobe -v mvsas

Gli appunti

  1. È possibile che i .kofile del modulo risultanti abbiano dimensioni (ad esempio 20 volte) maggiori rispetto ai file del modulo originale distribuiti da Ubuntu; in tal caso il make preparepassaggio avrebbe potuto creare un file di configurazione del kernel per il debug degli sviluppatori Linux e si sta costruendo dalla directory di origine. Il tuo -Cparametro potrebbe non funzionare come previsto.
  2. Ho visto guide con altri comandi simili make modules_preparee, make M=scripts/modma non penso che siano necessarie per questo caso.
  3. È possibile utilizzare la configurazione di debug degli sviluppatori Linux sostituendo -C /lib/modules/$(uname -r)/buildcon-C /usr/src/linux-headers-$(uname -r)
  4. In un'impostazione predefinita, apt-get source linux-sourcesverrà restituito un errore E: You must put some 'source' URIs in your sources.list. Per risolvere questo problema, puoi modificare il file /etc/apt/sources.listdecommentando (rimuovendo il comando #da) la prima deb-srcriga. Esempio per Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. eseguire sudo apt-get updatee quindi il comando fornirà le fonti per te. Vedi anche questa domanda in cui è descritto anche un metodo GUI per farlo.

Ho ricevuto l'errore: / bin / sh: arm-none-linux -gnueabi-gcc: non trovato
Dr.jacky

$(uname-r)è apparentemente sbagliato ... Devi chiamare il shellbuilt-in:$(shell uname -r)
Albus Silente,

2
@AlbusDumbledore Vedo anche casi in cui $(shell uname -r)non funziona . Perché è $(uname -r)così apparentemente sbagliato?
Pro Backup

Ho anche dovuto chiamare in echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confmodo da depmodvedere il file appena aggiornato .../extra.
Martin Pecka,

1
Cosa fare con l'errore di firma del modulo, come evitarlo? `` INSTALLA /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko su main.c: 158: - errore SSL: 02001002: libreria di sistema: fopen: nessun file o directory: bss_file.c: 175 - Errore SSL: 2006D080: routine BIO: BIO_new_file: nessun file simile: bss_file.c: 178 file-segno: certs / signing_key.pem: nessun file o directory `` `
Envek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.