web-dev-qa-db-ja.com

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

これは外部モジュールのみをインストールします。

しかし、それは私にはあまりエレガントに見えません-私は何が欠けていますか?

3
Torsten Römer

Sudoをインストールしたとき

Sudo -E make install

外部モジュールだけをインストールし、depmodを再実行しました。

環境保護フラグなしで実行すると、カーネルの更新に使用したカーネルソースツリーに組み込まれているすべてのモジュールが再インストールされました。 Sudoを使用すると、カーネルツリーに変更を加えるまでに、PWDが正しく設定されていない可能性がありますが、これは、これに遭遇した他の誰かを助ける可能性があります。

1
dudebrobro

_modules_install_をもう1つ詳しく調べました。 Linux Makefileの場合:

_# 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_を実行して外部モジュールをインストールすると、正常に機能します。

1
Torsten Römer