Makefile: 외부 Linux 커널 모듈 설치

Makefile: 외부 Linux 커널 모듈 설치

저는 외부 커널 모듈을 위한 간단한 Makefile을 작성하고 있습니다.

빌드하세요:

obj-m += usbtherm.o

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

외부 모듈만 컴파일되므로 괜찮습니다.

하지만 설치할 때:

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

커널 소스 트리에 모든 모듈을 설치하지만 이 모듈을 drivers/usb/misc.

그래서 다음과 같이 모듈을 설치합니다.

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

외부 모듈만 설치합니다.

그러나 그것은 나에게 매우 우아해 보이지 않습니다. 내가 무엇을 놓치고 있습니까?

답변1

sudo로 설치하면

sudo -E make install

외부 모듈만 설치하고 depmod를 다시 실행했습니다.

환경 저장 플래그 없이 실행하면 커널 업데이트에 사용하는 커널 소스 트리에 내장된 모든 모듈이 다시 설치됩니다. 커널 트리를 변경할 때 sudo를 사용하면 PWD를 올바르게 설정하지 못할 수도 있지만 이 문제가 발생하는 다른 사람들에게 도움이 될 수 있습니다.

답변2

나는 다시 주의 깊게 살펴보았다 modules_install. 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

내가 이해한 것은 소스 트리가 필요하고, 기존 모듈을 제거하고, 정리를 수행한 다음 실행하여 scripts/Makefile.modinst모듈을 설치하고 외부 모듈을 설치해야 한다는 것입니다 extra.

# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra

실제로 커널 소스는 없지만 헤더가 설치된 시스템에서 외부 모듈을 빌드할 때 내장 모듈은 /usr/src/linux-headers-$(uname -r)심볼릭 링크 되고 대상은 성공 /lib/modules/$(uname -r)/build하지만 헤더만 설치된 경우, 즉 존재하지 않기 때문에 실패합니다 .allcleanmodules_installmodules.order

그러나 *.ko를 복사하고 실행하여 외부 모듈을 설치하면 depmod -a문제가 없습니다.

관련 정보