【LPIC 201】Linuxカーネルのコンパイル

LPIC

以下の場合、Linuxカーネルをコンパイルすることを検討する必要があります。

  • 必要なデバイスドライバがLinuxカーネルに含まれていない場合
  • 使用しているハードウェアに最適化したカーネルを利用したい場合
  • Linuxカーネルの最新機能やデフォルトでは組み込まれていない機能を使いたい場合

コンパイルとは、人間がわかる内容で書かれたソースプログラムを、機械がわかる内容に翻訳することです。上記にあるような場合には、カーネルのソースプログラムを編集などしてコンパイルする必要があります。

Linuxカーネルコンパイルの手順

Linuxカーネルのコンパイルは以下の手順で実施します。

  1. カーネルソースの入手
  2. カーネルコンフィグレーションを設定
  3. カーネルをコンパイル
  4. カーネルモジュールをコンパイル
  5. カーネルモジュールを配置
  6. カーネルを配置
  7. ブートローダの設定を変更

1.カーネルソースの入手

まずはLinuxの公式サイトで最新のカーネルをダウンロードします。ダウンロードするカーネルは、安定版であるstableをおすすめします。

そして、ダウンロードしたカーネルは一般的には「/usr/src/linux」ディレクトリに展開します。

なお、「/usr/src/linux」には下記のようなファイル、ディレクトリがあります。

/usr/src/linux内のファイル・ディレクトリ

【ファイル】【説明】
.configカーネルのビルド設定ファイル。「make config」や「make menuconfig」などで設定したカーネルをビルドするための各種設定が保存されている。
Makefiremakeコマンドの動作やカーネルバージョンが書かれている。
【ディレクトリ】 【説明】
kernel/カーネル本体
Documentaion/ドキュメント類
arch/アーキテクチャ(i386,x86_64など)固有のコード
drivers/デバイスドライバ
fs/ファイルシステム
include/インクルードファイル(他のファイルから呼び出すコードのまとまり)
mm/メモリ管理
net/ネットワーク

2.カーネルコンフィグレーションを設定

続いて、カーネルコンフィグレーションの設定です。カーネルコンフィグレーションの設定は、以下の手順で実施します。

  1. 「make mrproper」でディレクトリを初期化する
    .configファイルと前回のカーネルコンフィグレーションの際に生成された全てのファイルを削除します。
  2. カーネルコンフィグレーションの作成を行う
    現在の.configから設定を引き継ぐ場合は、「make oldconfig」を実行します。その他の設定は、「make config」「make menuconfig」で行います。

makeコマンド

makeコマンドは、カーネルをビルドするためにLinuxで頻繁に使われるコマンドです。オプション(ターゲット)なしで実行すると、カーネルのコンパイルとカーネルモジュールのコンパイル両方が実行されます。

【オプション(ターゲット)】【説明】
make config対話的に設定を行う
make menuconfigターミナル上のGUIで設定を行う
make xconfigX(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-pkgDebianパッケージを作る

カーネルをコンパイル

カーネルをコンパイルするには、「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コマンドはオプションが沢山あり覚えるのが大変ですが、カーネルをコンパイルする手順にを覚えると、どの段階でどのコマンドが必要になるかがわかり覚えやすいと思います。

次の記事では、カーネル実行時における管理とトラブルシューティングについて書いていきたいと思います。

コメント

タイトルとURLをコピーしました