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問題はありません。

関連情報