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

24

Eu tenho um bug em um módulo do kernel Linux que faz com que o kernel do Ubuntu 14.04 fique fora do ar (crash).

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

Li muita informação (como mostrado abaixo) e descubro a confusão do processo de configuração e construção. Eu preciso de duas receitas:

  1. para configurar / configurar o ambiente de criação uma vez
  2. etapas a serem realizadas após a edição de qualquer arquivo de origem desse módulo do kernel ( .c e .h ) e a conversão dessa edição em um novo módulo do kernel ( .ko )

As fontes que foram usadas são:

por Pro Backup 24.08.2014 / 13:50

1 resposta

24

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

Configuração 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-get resultar em uma mensagem de erro sobre URIs de origem ausentes , 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)

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

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

Isto para evitar que a mensagem " nenhuma versão de símbolo para module_layout " esteja carregando 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 original do kernel (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

São para as edições.

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

Isto irá compilar e construir o arquivo .ko do módulo do kernel usando a configuração do kernel da sua distribuição Ubuntu, armazenada em /lib/modules/$(uname -r)/ .

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

Isto irá instalar o módulo do kernel em /lib/modules/$(uname -r)/extra/ , não sobrescrevendo o módulo de distribuição caso você não renomeie o arquivo de módulo do kernel de distribuição. Neste caso mvsas, ele também executará o depmod .

$ lsmod | grep mvsas

Se isto resultar em alguma saída, o módulo mvsas precisa descarregar com ( modprobe -r mvsas ) primeiro.

$ sudo modprobe -v mvsas

Isso deve carregar o novo módulo do kernel.

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

Erro 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) enquanto na saída detalhada do modprobe você vê que insmod está 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 depmod manualmente e tentar carregar o módulo novamente:

# depmod
# sudo modprobe -v mvsas

Notas

  1. Pode ser que os arquivos de módulo .ko resultantes sejam muito maiores (por exemplo 20 vezes) que os arquivos de módulo originais distribuídos pelo Ubuntu; Nesse caso, a etapa make prepare poderia ter criado um arquivo de configuração do kernel de depuração de desenvolvedores do Linux e você está construindo a partir do diretório de origem. Seu -C param pode não funcionar como esperado.
  2. Eu vi guias com outros comandos como make modules_prepare e make M=scripts/mod , mas não acho que isso seja necessário para este caso.
  3. Você pode usar a configuração de depuração dos desenvolvedores do Linux substituindo -C /lib/modules/$(uname -r)/build por -C /usr/src/linux-headers-$(uname -r)
  4. Em uma configuração padrão, apt-get source linux-sources retornará o erro E: You must put some 'source' URIs in your sources.list . Para corrigir esse problema, você pode modificar o arquivo /etc/apt/sources.list removendo o comentário (removendo o primeiro # ) da primeira linha deb-src . Exemplo para o Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted . execute sudo apt-get update e, em seguida, o comando fornecerá fontes para você. Veja também esta questão onde um O método GUI para fazer isso também é descrito.
por Pro Backup 24.08.2014 / 13:50