Eu tive uma outra olhada mais de perto em modules_install
. No Makefile do Linux:
# Target to install modules
PHONY += modules_install
modules_install: _modinst_ _modinst_post
PHONY += _modinst_
_modinst_:
@rm -rf $(MODLIB)/kernel
@rm -f $(MODLIB)/source
@mkdir -p $(MODLIB)/kernel
@ln -s 'cd $(srctree) && /bin/pwd' $(MODLIB)/source
@if [ ! $(objtree) -ef $(MODLIB)/build ]; then \
rm -f $(MODLIB)/build ; \
ln -s $(CURDIR) $(MODLIB)/build ; \
fi
@cp -f $(objtree)/modules.order $(MODLIB)/
@cp -f $(objtree)/modules.builtin $(MODLIB)/
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
O que eu entendo é que ele espera uma árvore de fontes, desinstala módulos existentes, faz algumas limpezas e então executa scripts/Makefile.modinst
para instalar os módulos - que instala módulos externos em extra
:
# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
E, na verdade, ao criar um módulo externo em um sistema sem fontes de kernel, mas com os cabeçalhos instalados, o módulo é construído em /usr/src/linux-headers-$(uname -r)
, que é linkado por símile a partir de /lib/modules/$(uname -r)/build
e enquanto all
e clean
sucesso, modules_install
falha porque ou seja, modules.order
não existe se apenas os cabeçalhos estiverem instalados.
Mas a instalação do módulo externo copiando o * .ko e executando depmod -a
funciona bem.