web-dev-qa-db-ja.com

カーネルのコンパイル:modules.depおよびマップファイルの生成

DebianストレッチでLinuxカーネルをコンパイルしています:

cd linux-4.9.59/
make menuconfig
make

ここまでは順調ですね。

通常は、make modules_installを発行して、モジュールを/lib/modules/にコピーします。

しかし、このカーネルは別のマシンを対象としているため、モジュールをローカルにコピーしたくありません。その上、私はルートとしてコンパイルしていないので、/lib/modules/への書き込みはとにかく機能しません。

export INSTALL_MOD_PATH="../MY_NEW_KERNEL"
mkdir -vp "${INSTALL_MOD_PATH}

make modules_install

上記は、新しくコンパイルされたモジュールをディレクトリ../MY_NEW_KERNEL/lib/modules/にコピーします。ただし、../MY_NEW_KERNEL/lib/modules/にmodules.depファイルとマップファイルは生成されません。

通常、これが現在カーネルを実行している場合は、depmodを実行して/lib/modules/で生成できます。しかし、現在のマシンではこのカーネルを実行していません。

また、bzImageとモジュールをターゲットマシンにコピーする場合でも、最初に新しいカーネルで再起動してから、depmodを実行する必要があります。

しかし問題は、depmodを実行しなかったため、モジュールが見つからないためカーネルが起動しないことです。

カーネルが現在実行されていないときに、カーネルモジュールに対してdepmodを実行するにはどうすればよいですか?

3
Martin Vegter

あなたの質問に答えるために、これはうまくいくはずです。 System.mapは、ビルドしたばかりのソースディレクトリに作成され、必須です。

$ depmod -b "$INSTALL_MOD_PATH" -F System.map 4.9.59

ここで、4.9.59は、実行していない新しいカーネルのバージョンです。

今では、プレーンなVanilla Linuxカーネルソースでさえ、Debianパッケージをビルドすることができます。

$ make help|grep deb
  deb-pkg             - Build both source and binary deb kernel packages
  bindeb-pkg          - Build only the binary kernel deb package

e、g:makeおよびmake modules_installの代わりに(通常のユーザーとして、rootは必要ありません):

stretch-AMD64:~/linux-source-4.13.10$ make bindeb-pkg -j4

[...後で...]

stretch-AMD64:~/linux-source-4.13.10$ $ ls -1 ../*4.13.10*deb
../linux-headers-4.13.10_4.13.10-1_AMD64.deb
../linux-image-4.13.10_4.13.10-1_AMD64.deb
../linux-libc-dev_4.13.10-1_AMD64.deb

もちろん、これにはdpkg-devfakerootなどのいくつかの追加のDebianパッケージと関連するいくつかのパッケージが必要になる場合がありますが、宛先もDebianの場合は、おそらくそこにインストールする方が簡単です。

5
A.B