Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
Linuxのカーネルは、OSの心臓部であり、ハードウェアの制御やプロセス管理、メモリ管理など、システムの中核を担っています。通常、ディストリビューションが提供する汎用的なカーネルを利用しますが、特定のハードウェアをサポートしたり、特定の機能を最適化したりする場合、カーネルの再構築やカスタムモジュールが必要になることがあります。
この記事では、Linuxカーネルをソースコードから再構築する手順と、カスタムモジュールを導入する手順について、詳細に解説します。また、カーネル再構築の目的や、よく直面する課題、そしてトラブルシューティングのヒントもご紹介します。
※本記事は主にUbuntuやDebian系ディストリビューションを前提に説明しますが、RedHat系ではパッケージ名が異なる場合があります(例:linux-headersはkernel-develに相当)。ご自身の環境に合わせて適宜読み替えてください。
カーネルの再構築は、単に最新版にしたいという目的だけでなく、主に以下の目的で行われます。
カーネルを再構築するプロセスは、大きく分けて以下のステップで構成されます。
ソースコードの準備:
コンフィグレーション:
make menuconfigやmake oldconfigなどのコマンドを使って、カーネルに含める機能やモジュールを決定します。
make menuconfig:ncursesベースのグラフィカルなメニューインターフェースで、対話的に設定を変更できます。make oldconfig:既存の.configファイルをベースに、新しいカーネルの機能についてのみ質問形式で設定を決定します。既存の設定をほとんど変えたくない場合に便利です。.configという名前でソースディレクトリの直下に保存されます。コンフィグレーションの設定値は、一般的に以下の3つです。
<*>):カーネルに機能を組み込む<M>):モジュールとして機能をビルドする< >):機能を無効にするコンパイルとインストール:
O=オプションを使ってアウト・オブ・ツリービルドを行うとよいでしょう。make -j $(nproc):-jオプションは並列コンパイルの数を指定し、$(nproc)はCPUコア数を自動で取得するコマンドです。これにより、コンパイル時間を短縮できます。
実行例(アウト・オブ・ツリービルド):
make O=build -j"$(nproc)"
sudo make O=build modules_install
sudo make O=build install
/bootパーティションの両方の空き容量を事前に確認しておきましょう。また、新カーネルをインストールしても、既存のカーネルは削除しないでください。問題が発生した場合に、GRUBメニューの「Advanced options for...」から古いカーネルを選択して起動できるよう、バックアップを残しておくことが重要です。sudo make modules_install:コンパイルしたモジュールを/lib/modules/ディレクトリにインストールします。sudo make install:カーネルイメージ本体とinitramfs(初期RAMディスク)、grubの設定などをインストールします。多くの場合、make installの実行時に自動でinitramfsの生成やブートローダーの更新が行われます。
補足:ディストリビューションの環境によっては、update-initramfs(Debian/Ubuntu系)やdracut(RHEL系)、update-grubコマンドなどを手動で実行する必要がある場合もあります。
カーネル全体を再構築せずに、必要な機能だけをモジュールとして追加することも可能です。
ソースコードの準備:
kernel-develやlinux-headersといったパッケージ名)が必要です。モジュールのビルドとインストール:
Kbuildという仕組みが使われます。多くの場合、以下のコマンドを順に実行するだけで完了します。make -C /lib/modules/$(uname -r)/build M=$(pwd):このコマンドは、指定されたカーネルのビルドディレクトリ(-Cオプション)で、現在のディレクトリにあるモジュールソース(M=$(pwd))をコンパイルします。sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install:コンパイルしたモジュールを/lib/modules/にインストールします。make bindeb-pkg -j"$(nproc)"make rpm-pkg -j"$(nproc)"モジュールのロードと確認:
modules_install後、依存情報が正しく更新されていない場合は、sudo depmod -a を実行して依存関係を再構築する必要があります。insmodコマンドを使用します。依存関係のあるモジュールも自動でロードしたい場合はmodprobeコマンドを使います。
sudo insmod [モジュール名].kosudo modprobe [モジュール名]lsmodコマンドを使用します。lsmod | grep [モジュール名]
出力例:
$ lsmod | grep mymodule
mymodule 16384 0
dmesgコマンドでカーネルログを確認し、エラーが出ていないかチェックする習慣をつけましょう。| 困っていること | 解決策 |
|---|---|
| カーネルのコンフィグレーション項目が多すぎてわからない | make menuconfigで、必要な機能だけを<*>(組み込み)または<M>(モジュール化)に設定し、不要なものは< >(無効)にする。よくわからない項目は、デフォルトのままにしておくのが安全です。 |
| コンパイルが途中でエラーになる | 依存するパッケージ(build-essentialやlibssl-devなど)が不足していることが多いです。エラーメッセージを確認し、不足しているパッケージをインストールしてください。典型的なエラー例:fatal error: linux/kernel.h: No such file or directory など、ヘッダーファイルが見つからないエラーは、linux-headers(Debian/Ubuntu)やkernel-devel(RedHat)パッケージが不足している可能性が高いです。 |
| 再起動したらシステムが起動しなくなった | GRUBなどのブートローダーで、以前にインストールされていた古いカーネルを選択して起動してください。新しいカーネルに問題があった場合、古いカーネルに戻すのが最も安全な方法です。再起動後、意図したカーネルで起動しているか確認するには、uname -rコマンドを実行します。 |
| 外部から取得したモジュールがビルドできない | カーネルヘッダーがインストールされていないか、バージョンが一致していない可能性があります。uname -rで現在のカーネルバージョンを確認し、対応するヘッダーパッケージをインストールしてください。 |
| 新しいカーネルで特定のデバイスが動かなくなった | コンフィグレーションで必要なドライバを有効にしたか確認してください。モジュールとして設定した場合は、正しくロードされているかlsmodで確認しましょう。 |
insmodやmodprobeで「Required key not available」と出る |
Secure Bootが有効な環境では、未署名のモジュールはロードできません。scripts/sign-fileを使ってモジュールに署名し、MOK(Machine Owner Key)に鍵を登録する必要があります。 |
Linuxカーネルの再構築やカスタムモジュールの導入は、一見複雑で難しそうに感じるかもしれませんが、この記事で紹介した手順を一つずつ丁寧に進めていけば、確実に実行できます。特に、特定のハードウェアをサポートしたり、パフォーマンスを極限まで引き出したい場合には非常に強力な手段となります。
この記事が、Linuxシステムの奥深い世界への一歩を踏み出す一助となれば幸いです。
ご覧いただきありがとうございました。