私は外部カーネルモジュール用の簡単な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
問題はありません。