変更要約: 初版(主題2.01・副主題2.01.1〜2.01.5に対応)
1.4Linuxカーネルのコンパイル
ソースからカーネルをビルドする一連の作業を学びます。設定ファイル .config とカーネル Makefile、設定用の make ターゲット(config/xconfig/menuconfig/gconfig/oldconfig)とビルド用ターゲット(all/bzImage/modules/modules_install)、クリーンアップの mrproper、パッケージ化ターゲット(rpm-pkg/binrpm-pkg/deb-pkg)、モジュールの配置先 /lib/modules/<kver>/、depmod や DKMS・Dracut(mkinitrd/mkinitramfs)との連携を押さえます。
独自パッチの適用や特定ハードウェア向けの最適化のため、ディストリ標準以外のカーネルを自前でビルドする場面が実務にあります。201 試験では、この設定→ビルド→インストールの一連のフローを make ターゲット単位で正確に理解しているかが問われます。
1.4.1設定ターゲットと.config
- ビルドの起点は
/usr/src/linux/.config(有効/無効な機能を1行1オプションで記録)と Makefile。設定用の make ターゲットは複数の UI を提供する:config(対話式・逐次質問)/menuconfig(テキストメニュー)/xconfig(Qt GUI)/gconfig(GTK GUI)。 - oldconfig=既存の .config を引き継ぎつつ、新しいカーネルバージョンで追加された項目だけを対話的に尋ねる。カーネルアップグレード時の定番ターゲット。
- mrproper=設定ファイルも含めてソースツリーを完全にクリーンな状態へ戻すターゲット(生成物・.config を含めて削除)。ビルドをやり直す前の徹底クリーンに使う。
1.4.2ビルド・インストール・パッケージ化ターゲット
- ビルド系ターゲット=
make all(デフォルトターゲット一式)・make bzImage(圧縮カーネルイメージのみ)・make modules(ロード可能モジュール群)。 - make modules_install=ビルドしたモジュールを
/lib/modules/<kver>/配下へインストールする。この後 depmod でモジュール間の依存関係インデックスを再構築するのが定石。 - パッケージ化ターゲット=
rpm-pkg・binrpm-pkg(RPM 系。前者はソース RPM も、後者はバイナリ RPM のみ生成)・deb-pkg(Debian 系 .deb を生成)。ビルド成果を配布可能なパッケージにまとめる。 - モジュールを自動管理する仕組み=DKMS(
dkms。カーネル更新のたびにサードパーティモジュールを自動で再ビルド)。ルートFS用の初期RAMディスク生成には Dracut(mkinitrd/mkinitramfs系ツール)を使う。
「既存設定を引き継いで差分だけ聞く=oldconfig」「完全にクリーンな状態へ=mrproper」「モジュールのインストール先=/lib/modules/<kver>/」「インストール後の依存関係再構築=depmod」 の対応が最頻出です。bzImage ターゲットと modules ターゲットは別工程(イメージ本体とモジュール群は別々にビルド・インストールされる)である点も繰り返し問われます。
カーネルアップグレードの実務手順を通しで確認しましょう。新しいカーネルソースを /usr/src/linux-<newver>/ に展開したら、稼働中カーネルの .config をコピーし、make oldconfig を実行します。これにより既存設定を引き継ぎつつ、新バージョンで追加された機能についてのみ質問されるため、ゼロから設定し直す必要がありません。設定を GUI で見直したいなら make menuconfig や make xconfig を使います。ビルドは make all(または make bzImage modules と個別指定)で行い、完了したら make modules_install で /lib/modules/<newver>/ へモジュールをインストール、続けて depmod -a でモジュール依存関係のインデックス(modules.dep)を再構築します。ルートファイルシステムの読み込みに独自ドライバが必要なら、この時点で Dracut 系ツール(mkinitramfs -o /boot/initramfs-<newver>.img <newver>)で initramfs を生成し、GRUB2 の設定(前節の grub2-mkconfig)に反映します。社内配布用にパッケージ化したい場合は make binrpm-pkg(RPM 系)や make deb-pkg(Debian 系)でビルド成果をパッケージにまとめます。サードパーティのカーネルモジュール(例:特殊なストレージドライバ)は、カーネル更新のたびに手動で再ビルドする代わりに DKMS に登録しておくと自動的に追従します。設定をやり直したい・ビルドが壊れた場合は make mrproper で完全に白紙へ戻してから再開します。
| makeターゲット | 分類 | 効果 |
|---|---|---|
| oldconfig | 設定 | 既存.configを引き継ぎ差分のみ質問 |
| mrproper | クリーンアップ | .config含め完全に白紙へ |
| bzImage / modules | ビルド | 圧縮イメージ/モジュール群を個別ビルド |
| modules_install | インストール | /lib/modules/<kver>/ へ配置(後でdepmod) |
| rpm-pkg / deb-pkg | パッケージ化 | 配布用パッケージを生成 |
ひっかけ: 「make modules_install を実行すればモジュールの依存関係も自動的に再構築される」は誤りです。modules_install はファイルを配置するだけで、依存関係インデックス(modules.dep)の再構築には別途 depmod の実行が必要です。また「make bzImage を実行すればカーネルモジュールもすべてビルドされる」も誤り=bzImage はイメージ本体のみで、モジュールのビルドには make modules が別途必要です。
1.4.3この節のまとめ
- 設定=oldconfig(差分引継ぎ)/menuconfig等(UI)/mrproper(完全クリーン)
- ビルド=bzImage/modulesは別工程/インストール後は/lib/modules/<kver>/+depmod/配布はrpm-pkg・deb-pkg等
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. 稼働中のカーネルの設定を引き継ぎつつ、新しいカーネルバージョンで追加された設定項目についてのみ対話的に確認したい。適切な make ターゲットはどれ?
Q2. make modules_install でモジュールをインストールした直後に、モジュール間の依存関係インデックスを最新化するために実行すべきコマンドはどれ?
Q3. カスタムビルドしたカーネルを社内の複数のRPM系サーバーへ配布したい。ビルドの最終段階で使うべき make ターゲットはどれ?

