Como (receita) construir apenas um módulo do kernel?

35

Eu tenho um bug em um módulo do kernel do Linux que faz com que o kernel do Ubuntu 14.04 de estoque opa (falha).

É por isso que eu quero editar / corrigir a fonte apenas desse único módulo do kernel para adicionar uma saída de depuração extra. O módulo do kernel em questão é mvsase não é necessário inicializar. Por esse motivo, não vejo necessidade de atualizar nenhuma imagem initrd.

Eu li muitas informações (como mostrado abaixo) e encontro a configuração e a confusão do processo de compilação. Eu preciso de duas receitas:

  1. para configurar / configurar o ambiente de construção uma vez
  2. etapas a serem executadas após editar qualquer arquivo de origem deste módulo do kernel ( .ce .h) e converter essa edição em um novo módulo do kernel ( .ko)

As fontes que foram usadas são:

Pro Backup
fonte
Possível duplicata de Como eu construo um único módulo do kernel na árvore?
Ciro Santilli respondeu
talvez este artigo também ajude: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Respostas:

33

A receita para criar um módulo personalizado pode precisar ser dividida em três seções.

Configurar uma vez

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

Estou com preguiça de copiar os arquivos de origem do driver específico do mvsas; basta copiá-los todos para o seu diretório de trabalho atual. Se apt-getresultar em uma mensagem de erro sobre a falta de URIs de origem , consulte a nota 4 na parte inferior.

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

Isto irá preparar alguns arquivos necessários para construir um módulo do kernel.

Cada versão do kernel

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

Isso instalará os cabeçalhos e o arquivo de configuração do kernel do Ubuntu para essa versão do kernel em / lib / modules.

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

Isso evita a mensagem " sem versão de símbolo para module_layout " ao carregar o módulo com 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

Isso renomeará o módulo do kernel original (compilação do Ubuntu) para garantir que o patch personalizado seja carregado.

Cada edição

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

Estes são para as edições.

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

Isso irá compilar e construir o .koarquivo do módulo do kernel usando a configuração do kernel da sua distribuição padrão do Ubuntu, conforme armazenado em /lib/modules/$(uname -r)/.

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

Isso instalará o módulo do kernel /lib/modules/$(uname -r)/extra/, não substituindo o módulo de distribuição, caso você não renomeie o arquivo do módulo de distribuição. Nesse caso, o mvsas também executará o depmod .

$ lsmod | grep mvsas

Se isso resultar em alguma saída, o módulo mvsas precisa ser descarregado modprobe -r mvsasprimeiro com ( ).

$ sudo modprobe -v mvsas

Isso deve carregar o novo módulo do kernel.

Verifique a saída para verificar se /lib/modules/.../extra/mvsas.koestá sendo carregado.

Erro do Modprobe: não foi possível inserir

Em alguns casos, você pode experimentar um modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)pouco na saída detalhada do modprobe que vê que insmodestá tentando carregar o módulo a partir do local padrão do kernel. Por exemplo:

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

Nesse caso, você precisa executar manualmente o depmod e tentar carregar o módulo novamente:

# depmod
# sudo modprobe -v mvsas

Notas

  1. Pode ser que os .koarquivos do módulo resultantes sejam muito (por exemplo, 20 vezes) maiores em tamanho do que os arquivos originais do módulo distribuídos pelo Ubuntu; nesse caso, a make prepareetapa poderia ter criado um arquivo de configuração do kernel de depuração para desenvolvedores Linux e você está construindo a partir do diretório de origem. Seu -Cparâmetro pode não funcionar como esperado.
  2. Eu já vi guias com outros comandos como make modules_preparee, make M=scripts/modmas não acho que sejam necessários para este caso.
  3. Você pode usar a configuração de depuração dos desenvolvedores do Linux substituindo -C /lib/modules/$(uname -r)/buildpor-C /usr/src/linux-headers-$(uname -r)
  4. Em uma configuração padrão, apt-get source linux-sourcesretornará um erro E: You must put some 'source' URIs in your sources.list. Para corrigir esse problema, você pode modificar o arquivo /etc/apt/sources.listdescomentando (removendo o principal #) da primeira deb-srclinha. Exemplo para o Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. executar sudo apt-get updatee, em seguida, o comando fornecerá fontes para você. Veja também esta pergunta, onde também é descrito um método GUI para fazer isso.
Pro Backup
fonte
Eu recebi o erro: / bin / sh: arm-none-linux -gnueabi-gcc: não encontrado
Dr.jacky
$(uname-r)aparentemente está errado ... Você precisa chamar o shellbuilt-in:$(shell uname -r)
Albus Dumbledore
2
@AlbusDumbledore Também vejo casos em $(shell uname -r)que não funciona . Por $(uname -r)que parece tão errado?
Pro Backup
Eu também tive que ligar echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confpara depmodver o arquivo recém-atualizado .../extra.
Martin Pecka
11
O que fazer com o erro de assinatura do módulo, como evitá-lo? `` INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko At main.c: 158: - Erro SSL: 02001002: biblioteca do sistema: fopen: nenhum arquivo ou diretório: bss_file.c: 175 - Erro SSL: 2006D080: rotinas BIO: BIO_new_file: não existe esse arquivo: bss_file.c: 178 arquivo de sinal: certs / signature_key.pem: nenhum arquivo ou diretório `` ``
Envek