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 [モジュール名].ko
sudo 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システムの奥深い世界への一歩を踏み出す一助となれば幸いです。
ご覧いただきありがとうございました。