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
を実行するにはどうすればよいですか?
あなたの質問に答えるために、これはうまくいくはずです。 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-dev
、fakeroot
などのいくつかの追加のDebianパッケージと関連するいくつかのパッケージが必要になる場合がありますが、宛先もDebianの場合は、おそらくそこにインストールする方が簡単です。