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
- 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 etapamake 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. - Eu vi guias com outros comandos como
make modules_prepare
emake M=scripts/mod
, mas não acho que isso seja necessário para este caso. - 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)
- Em uma configuração padrão,
apt-get source linux-sources
retornará o erroE: 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 linhadeb-src
. Exemplo para o Ubuntu 17.10:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted
. executesudo 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.