저는 외부 커널 모듈을 위한 간단한 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
하지만 헤더만 설치된 경우, 즉 존재하지 않기 때문에 실패합니다 .all
clean
modules_install
modules.order
그러나 *.ko를 복사하고 실행하여 외부 모듈을 설치하면 depmod -a
문제가 없습니다.