Come (ricetta) creare un solo modulo del kernel?

24

Ho un baco in un modulo del kernel di Linux che fa sì che il kernel di Ubuntu 14.04 sia in esecuzione su oops (crash).

Questo è il motivo per cui desidero modificare / patch l'origine solo del singolo modulo del kernel per aggiungere ulteriori output di debug. Il modulo del kernel in questione è mvsas e 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 la confusione tra setup e build process. Ho bisogno di due ricette:

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

Le fonti che sono state utilizzate sono:

posta Pro Backup 24.08.2014 - 13:50
fonte

1 risposta

24

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

Imposta una volta
$ cd ~
$ apt-get source linux-source-3.13.0 

Sono troppo pigro per copiare i file di origine dei driver specifici di mvsas; copiarli tutti nella directory di lavoro corrente. Se apt-get restituisce un messaggio di errore su URI di origine mancanti , vedi la nota n. 4 in basso.

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

Questo preparerà alcuni file necessari per costruire 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 di 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 che il messaggio " nessuna versione di simbolo per module_layout " durante il caricamento del 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 del kernel originale (Ubuntu build) per assicurarti che venga caricato quello personalizzato patchato.

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 modulo del kernel .ko file usando la configurazione del kernel dalla tua distribuzione di Ubuntu di magazzino come memorizzata in /lib/modules/$(uname -r)/ .

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

Questo installerà il modulo del kernel in /lib/modules/$(uname -r)/extra/ , non sovrascrivendo 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 questo produce risultati, il modulo mvsas ha bisogno di scaricare con ( modprobe -r mvsas ).

$ sudo modprobe -v mvsas

Questo dovrebbe caricare il nuovo modulo del kernel.

Controlla l'output per verificare che /lib/modules/.../extra/mvsas.ko sia in fase di caricamento.

Errore Modprobe: impossibile inserire

In alcuni casi potresti provare un modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg) mentre nell'output di modprobe dettagliato vedi che insmod sta provando a caricare il modulo dal percorso predefinito del kernel. Ad 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, devi eseguire manualmente depmod e provare a caricare di nuovo il modulo:

# depmod
# sudo modprobe -v mvsas

Note

  1. Potrebbe accadere che i risultanti file del modulo .ko siano molto (per esempio 20 volte) di dimensioni maggiori rispetto ai file del modulo originale distribuiti da Ubuntu; in quel caso il passo make prepare avrebbe potuto creare un programma di debug del kernel con gli sviluppatori Linux e tu stai costruendo dalla directory sorgente. Il tuo parametro -C potrebbe non funzionare come previsto.
  2. Ho visto le guide con altri comandi come make modules_prepare e make M=scripts/mod , ma non penso che siano necessari in questo caso.
  3. Puoi usare gli sviluppatori di Linux per eseguire il debug di configurazione sostituendo -C /lib/modules/$(uname -r)/build con -C /usr/src/linux-headers-$(uname -r)
  4. In un'impostazione predefinita, apt-get source linux-sources restituirà l'errore E: You must put some 'source' URIs in your sources.list . Per risolvere questo problema, puoi modificare il file /etc/apt/sources.list rimuovendo il commento (rimuovendo il # iniziale da) la prima riga deb-src . Esempio per Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted . eseguire sudo apt-get update , quindi il comando fornirà le risorse per te. Vedi anche questa domanda dove Anche il metodo GUI per fare ciò è descritto.
risposta data Pro Backup 24.08.2014 - 13:50
fonte

Leggi altre domande sui tag