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 é mvsas
e 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:
- para configurar / configurar o ambiente de construção uma vez
- etapas a serem executadas após editar qualquer arquivo de origem deste módulo do kernel (
.c
e.h
) e converter essa edição em um novo módulo do kernel (.ko
)
As fontes que foram usadas são:
- construir um módulo do kernel - Pesquisa do Google
- http://www.linuxquestions.org/questions/linux-kernel-70/rebuilding-a-single-kernel-module-595116/
- https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module
- http://www.pixelbeat.org/docs/rebuild_kernel_module.html
- Como eu construo um único módulo do kernel na árvore?
- http://ubuntuforums.org/showthread.php?t=1153067
- http://ubuntuforums.org/showthread.php?t=2112166
- http://ubuntuforums.org/showthread.php?t=1115593
- construir um módulo do kernel ubuntu - Pesquisa do Google
- 'make + single + kernel + module' - sobrelinux
- 'make + kernel + module' - sobrelinux
- Meu makefile resulta em: Nenhuma regra para tornar o alvo `arch / x86 / tools / relocs.c ', necessário
- '"Formato de módulo inválido"' - sobrelinux
- Instalação do driver: compilando o código fonte para o kernel mais recente
- Modprobe: 'formato de nódulo inválido', ainda funciona após insmod
- "Symbol version dump" "is ausente" - Pesquisa do Google
- https://stackoverflow.com/questions/9425523/should-i-care-that-the-symbol-version-dump-is-missing-how-do-i-get-one
- https://askubuntu.com/questions/369051/where-can-i-find-the-corresponding-module-symvers-and-config-files-for-ubutunu
- "nenhuma versão de símbolo para module_layout" ao tentar carregar usbhid.ko
- Links quebrados dentro da pasta de arquivos de cabeçalho do Linux
- 'make modules_install' - sobrelinux
- 'modules_install' - sobrelinux
- Diretório de compilação vazio no kernel compilado personalizado
- https://askubuntu.com/questions/444345/not-able-to-see-pr-info-output
- https://askubuntu.com/questions/472496/in-which-directory-are-the-kernel-source-files-and-how-can-i-recompile-it
- Como posso compilar e instalar esse arquivo libata-eh.c atualizado?
- 'modules_install + depmod' - sobrelinux
- modules_install depmod - Pesquisa do Google
- "make modules_install" - Pesquisa do Google
- http://www.csee.umbc.edu/courses/undergrad/CMSC421/fall02/burt/projects/howto_build_kernel.html
- https://unix.stackexchange.com/questions/20864/what-happens-in-each-step-of-the-linux-kernel-building-process
- https://wiki.ubuntu.com/KernelCustomBuild
- http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html
- http://www.linuxforums.org/forum/kernel/170617-solved-make-modules_install-different-path.html
- "preparar" - Pesquisa do Google
- scripts "make prepare" "/ kconfig / conf --silentoldconfig Kconfig" - Pesquisa no Google
- http://ubuntuforums.org/showthread.php?t=1963515
- versão "make prepare" do ubuntu - Pesquisa do Google
- https://stackoverflow.com/questions/8276245/how-to-compile-a-kernel-module-against-a-new-source
- https://help.ubuntu.com/community/Kernel/Compile
- Como compilar um módulo do kernel?
- Como adicionar um driver personalizado ao meu kernel?
- https://askubuntu.com/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
Respostas:
A receita para criar um módulo personalizado pode precisar ser dividida em três seções.
Configurar uma vez
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 a falta de URIs de origem , consulte a nota 4 na parte inferior.Isto irá preparar alguns arquivos necessários para construir um módulo do kernel.
Cada versão do kernel
Isso instalará os cabeçalhos e o arquivo de configuração do kernel do Ubuntu para essa versão do kernel em / lib / modules.
Isso evita a mensagem " sem versão de símbolo para module_layout " ao carregar o módulo com insmod ou modprobe.
Isso renomeará o módulo do kernel original (compilação do Ubuntu) para garantir que o patch personalizado seja carregado.
Cada edição
Estes são para as edições.
Isso irá compilar e construir o
.ko
arquivo 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)/
.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 .Se isso resultar em alguma saída, o módulo mvsas precisa ser descarregado
modprobe -r mvsas
primeiro com ( ).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 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ê queinsmod
está tentando carregar o módulo a partir do local padrão do kernel. Por exemplo:Nesse caso, você precisa executar manualmente o depmod e tentar carregar o módulo novamente:
Notas
.ko
arquivos 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, amake prepare
etapa 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-C
parâmetro pode não funcionar como esperado.make modules_prepare
e,make M=scripts/mod
mas não acho que sejam necessários para este caso.-C /lib/modules/$(uname -r)/build
por-C /usr/src/linux-headers-$(uname -r)
apt-get source linux-sources
retornará um erroE: You must put some 'source' URIs in your sources.list
. Para corrigir esse problema, você pode modificar o arquivo/etc/apt/sources.list
descomentando (removendo o principal#
) da primeiradeb-src
linha. Exemplo para o Ubuntu 17.10:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted
. executarsudo apt-get update
e, em seguida, o comando fornecerá fontes para você. Veja também esta pergunta, onde também é descrito um método GUI para fazer isso.fonte
$(uname-r)
aparentemente está errado ... Você precisa chamar oshell
built-in:$(shell uname -r)
$(shell uname -r)
que não funciona . Por$(uname -r)
que parece tão errado?echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf
paradepmod
ver o arquivo recém-atualizado.../extra
.