FATAL: Module hello.ko não encontrado

3

Estou usando CentOS-6.5 e o kernel padrão é 2.6.32-431.11.2.el6.x86_64 . Eu baixei 2.6.32 e construí esse kernel (em /lib/modules/2.6.32 ).

Eu escrevi um módulo para o programa hello world simples. Este programa está trabalhando sob o caso abaixo:

Makefile: /lib/modules/$(shell uname -r)/build (kernel padrão)

$ sudo insmod hello.ko

$ dmesg
module inserted..
hello world..

Meu programa não está funcionando para casos abaixo:

Makefile: /lib/modules/3.2.32/build (kernel recém-construído)

$ sudo insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format

dmesg: 
hello: disagrees about version of symbol module_layout

Eu tentei modprobe para ambos os casos, está abaixo do erro

FATAL: Module hello not found.

Como compilar meu módulo com 2.6.32 kernel?

    
por gangadhars 22.04.2014 / 08:19

2 respostas

2

O kernel do Linux contém estruturas de dados cujo layout varia não apenas de versão para versão, mas também dependendo das opções de compilação. Como conseqüência, quando você compila um módulo do kernel, você precisa ter não apenas os arquivos de cabeçalho da fonte do kernel, mas também alguns arquivos de cabeçalho que são gerados durante a compilação do kernel. Apenas descompactar a fonte do kernel não é suficiente.

Com os kernels criados com CONFIG_MODVERSIONS , o número da versão pode diferir, mas o layout das estruturas de dados deve ser o mesmo. Esta opção está ativada nos kernels do Ubuntu. Com essa opção, além dos cabeçalhos, os módulos precisam ser compilados com o arquivo Module.symvers adequado. O CentOS, como a maioria das distribuições, inclui este arquivo no mesmo pacote dos cabeçalhos do kernel resultantes da compilação. O pacote de cabeçalho do kernel do CentOS é chamado kernel-headers ; Certifique-se de instalar a versão que corresponde ao kernel que você está compilando. Veja também Visão geral dos pacotes do kernel na documentação do CentOS e < a href="http://wiki.centos.org/HowTos/I_need_the_Kernel_Source#head-7cb967afe95d0c9be0f9f1e1b874ecad494cb6ba"> Você não precisa da fonte completa do kernel no wiki.

Com os kernels construídos sem o CONFIG_MODVERSIONS (o que pode ser o caso se você compilou seu próprio kernel), a verificação ao carregar um módulo é uma simples verificação de versão. Você pode pegar o código-fonte do kernel descompactado, copiar o .config que foi usado durante a compilação do seu kernel em execução e executar make modules_prepare . O ônus está em você para verificar se qualquer patch que você tenha feito no kernel não afeta a compatibilidade binária.

    
por 23.04.2014 / 03:50
1

Onde você baixou o kernel 2.6.32?

Se você usar o CentOS, basta instalar fontes do seu kernel 2.6.32-431.11.2.el6.x86_64 do repositório do CentOS, já que o RedHat usa o kernel corrigido. Por favor, também certifique-se de que a configuração da árvore fonte do kernel que você construiu é exatamente igual à do kernel em execução.

Geralmente, há config-* arquivos no diretório /boot/ ou você pode tentar obter a configuração do kernel em execução a partir de /proc/config.gz .

Você também pode consultar as instruções oficiais do CentOS:

por 22.04.2014 / 08:41