以下の場合、Linuxカーネルをコンパイルすることを検討する必要があります。
- 必要なデバイスドライバがLinuxカーネルに含まれていない場合
- 使用しているハードウェアに最適化したカーネルを利用したい場合
- Linuxカーネルの最新機能やデフォルトでは組み込まれていない機能を使いたい場合
Linuxカーネルコンパイルの手順
Linuxカーネルのコンパイルは以下の手順で実施します。
- カーネルソースの入手
- カーネルコンフィグレーションを設定
- カーネルをコンパイル
- カーネルモジュールをコンパイル
- カーネルモジュールを配置
- カーネルを配置
- ブートローダの設定を変更
1.カーネルソースの入手
まずはLinuxの公式サイトで最新のカーネルをダウンロードします。ダウンロードするカーネルは、安定版であるstableをおすすめします。
そして、ダウンロードしたカーネルは一般的には「/usr/src/linux」ディレクトリに展開します。
なお、「/usr/src/linux」には下記のようなファイル、ディレクトリがあります。
/usr/src/linux内のファイル・ディレクトリ
【ファイル】 | 【説明】 |
.config | カーネルのビルド設定ファイル。「make config」や「make menuconfig」などで設定したカーネルをビルドするための各種設定が保存されている。 |
Makefire | makeコマンドの動作やカーネルバージョンが書かれている。 |
【ディレクトリ】 | 【説明】 |
kernel/ | カーネル本体 |
Documentaion/ | ドキュメント類 |
arch/ | アーキテクチャ(i386,x86_64など)固有のコード |
drivers/ | デバイスドライバ |
fs/ | ファイルシステム |
include/ | インクルードファイル(他のファイルから呼び出すコードのまとまり) |
mm/ | メモリ管理 |
net/ | ネットワーク |
2.カーネルコンフィグレーションを設定
続いて、カーネルコンフィグレーションの設定です。カーネルコンフィグレーションの設定は、以下の手順で実施します。
- 「make mrproper」でディレクトリを初期化する
.configファイルと前回のカーネルコンフィグレーションの際に生成された全てのファイルを削除します。 - カーネルコンフィグレーションの作成を行う
現在の.configから設定を引き継ぐ場合は、「make oldconfig」を実行します。その他の設定は、「make config」や「make menuconfig」で行います。
makeコマンド
makeコマンドは、カーネルをビルドするためにLinuxで頻繁に使われるコマンドです。オプション(ターゲット)なしで実行すると、カーネルのコンパイルとカーネルモジュールのコンパイル両方が実行されます。
【オプション(ターゲット)】 | 【説明】 |
make config | 対話的に設定を行う |
make menuconfig | ターミナル上のGUIで設定を行う |
make xconfig | X(X Window System)上のGUIで設定を行う |
make defconfig | デフォルト状態の設定ファイルを作る |
make oldconfig | 現在のカーネルの設定を引き継ぐ、新しいバージョンで追加された機能だけを対話的に設定することができる |
make cloneconfig | oldconfigと同じ |
make clean | 設定ファイルを除いて一時ファイル等を削除 |
make mrproper | 設定ファイルを含めて一時ファイル等を削除 |
【ビルド対象に関連したオプション】 | 【説明】 |
make all | カーネルとカーネルモジュールをビルド |
make install | ビルドしたカーネルをインストール |
make modules | カーネルモジュールをビルド |
make modules_install | カーネルモジュールをインストール |
make rpm | ビルド後にrpmパッケージを作る |
make binrpm-pkg | バイナリrpmパッケージを作る |
make deb-pkg | Debianパッケージを作る |
カーネルをコンパイル
カーネルをコンパイルするには、「make bzImage」を実行します。
make bzImageを実行すると、vmlinuxとSystem.mapとarch/i386/boot/bzImage が作成されます。
vmlinuxとarch/i386/boot/bzImageは、カーネル本体(カーネルイメージ)です。
vmlinuxは非圧縮のもので、bzImageの方が圧縮されたものです。
カーネルモジュールをコンパイル
カーネルモジュールは、カーネルにあったものが必要であるため、「make modules」でカーネルモジュールもコンパイルを実施します。なお、「make」をパラメータなしで実行すると、カーネルとカーネルモジュール両方のコンパイルが行われます。
カーネルモジュールを配置
「make modules_install」で前の手順でコンパイルしたカーネルモジュールを適切なディレクトリにインストールします。
カーネルを配置
「make install」で、カーネルをインストールします。
ブートローダの設定を変更
新しいカーネルで起動できるよう、にブートローダに新しいエントリを追加します。
※新しいカーネルで問題が発生しないことを確認できるまでは前のエントリは残しておく
make installの動作
make installを実行すると、以下のような動作が行われます。
- ビルドされたカーネルイメージをvmlinuzのような名称で/bootに移動する
- バージョンがファイル名に付くようカーネルイメージ等をリネームする
- ブートローダの設定ファイルに、新しいカーネルを使う設定が追加される
- カーネルに組み込まれているモジュールの情報から判断して、必要ならば初期RAMディスクイメージを作成し、段階的なブートを行う設定にする
DKMS(Dynamic Kernel Module Support)
DKMSとは、マシンにインストールされている個々のカーネル(バージョン/リリース)ごとにカーネルモジュールパッケージをビルドして用意するのではなく、自動的にモジュールをインストールして配置、管理するための仕組みです。
Linuxカーネルをアップデートした際はカーネルモジュールもアップデートする必要がありますが、DKMSを使うと、カーネルアップデートの際にカーネルとは独立して自動的にカーネルモジュールをコンパイルし、インストールされます。そのため、現在は多くのディストリビューションがDKMSをパッケージに含んでいます。
主要な設定ファイルは、各モジュールの設定を行う「dkms.conf」と、全体の設定を行う「etc/dkms/framework.conf」です。
初期RAMディスク
初期RAMディスクは、ファイルとして用意されているファイルシステムをRAMディスクとしてメモリ上に展開し、それを暫定的なルートファイルシステムとしてカーネルを起動し、その後本来のルートファイルシステムをマウントするという方法を取ることができ、この時のRAMディスクを初期RAMディスクと呼びます。
初期RAMディスクには、以下の形式があります。
- initrd・・・ファイルシステムイメージを圧縮した初期RAMディスク
- initramfs・・・cpioアーカイブを圧縮した初期RAMディスク
初期RAMディスクを作成するコマンドは以下があります。
- mkinitrd
書式・・・mkinitrd RAMディスクイメージファイル カーネルバージョン - mkinitramfs
書式・・・mkinitramfs -o RAMディスクイメージファイル カーネルバージョン - dracut
書式・・・dracut 出力ファイル名 カーネルバージョン
おわりに
makeコマンドはオプションが沢山あり覚えるのが大変ですが、カーネルをコンパイルする手順にを覚えると、どの段階でどのコマンドが必要になるかがわかり覚えやすいと思います。
次の記事では、カーネル実行時における管理とトラブルシューティングについて書いていきたいと思います。
コメント