Makefile: instalando o módulo externo do kernel do Linux

4

Eu estou escrevendo um Makefile simples para um módulo externo do kernel.

Construindo com:

obj-m += usbtherm.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

compila apenas o módulo externo, o que é legal.

Mas instalando com:

install:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules_install

instala todos os módulos na árvore de origem do kernel, e eu não sei como posso ter o módulo instalado em drivers/usb/misc .

Estou instalando o módulo assim:

install:
    cp $(shell pwd)/usbtherm.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/misc
    depmod -a

que instalará apenas o módulo externo.

Mas não parece muito elegante para mim - o que estou perdendo?

    
por Torsten Römer 08.06.2016 / 22:43

2 respostas

2

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.

    
por 11.06.2016 / 17:54
0

Quando eu instalei com o sudo

sudo -E make install

Instalado apenas meu módulo externo e reran depmod.

A execução sem os sinalizadores de preservação do ambiente resultou na reinstalação de todos os módulos construídos na árvore de origem do kernel que usei para atualizar meu kernel. Parece que o uso do sudo pode não ter o PWD configurado corretamente no momento em que você fizer alterações na árvore do kernel, mas talvez isso ajude alguém que depare com isso.

    
por 22.02.2017 / 03:12