カスタムカーネルの構築

Linux は初めてという人の多くが「なぜ独自のカーネルを構築する必要があるのか?」という疑問を持っています。カーネルモジュールの効用に進歩があったと仮定すると、その疑問に対する最も正確な答えは、「独自のカーネルを構築することが必要な理由を知らないのであれば、おそらく構築する必要はない」となります。したがって、カスタマイズしたカーネルを構築する特段の理由がなければ (または特に興味がなければ)、 Sendmail までスキップしてもかまいません。

以前は、システムに新しいハードウェアを追加した場合にはカーネルをリコンパイルする必要がありました。言い換えると、カーネルは静的なものでした。Linux 2.0.x カーネルが改良されたため、ハードウェア用ドライバの多くをコンポーネント群へとモジュール化し、要求があった場合にのみ組み込むことが可能になっています。ただし、別々の改良点に対応してコンパイルした複数のカーネルがシステム上にある場合には大きな問題がありました (良い例が SMP カーネルと UP カーネルです)。しかし 2.2.x カーネルのモジュール化方式がさらに進歩したため、複数モジュールの共存が容易になりました (ただしモジュールを共有することはできません)。

カーネルモジュールの取り扱いについては、 「 カーネルモジュールのロード - Chapter 3 」 を参照してください。カスタマイズしたカーネルをシステムに合わせてリコンパイルする場合を除き、ほとんどの変更内容は隠されています。

モジュール形式カーネルの構築

以下の指示に従うことによって、カーネルのモジュール化によってもたらされる力と柔軟性を利用することができます。モジュール形式を利用したくない場合は、monolithic カーネルの構築とインストールの側面の説明について 「 monolithic カーネルの構築 」を参照してください。ここでは、すでに kernel-headers パッケージと kernel-source パッケージがインストール済であり、すべてのコマンドを /usr/src/linux ディレクトリから発行することを前提とします。

最も重要なステップは、以下の作業でミスをした場合に備えて、有効な緊急ブートディスクがあることを確認することです。インストール時にブートディスクを作成しなかった場合は、mkbootdisk コマンドによって作成してください。標準的なコマンドは、mkbootdisk --device /dev/fd0 2.2.x と同様です。作成したら、そのブートディスクをテストして、システムがブートすることを確認してください。

既知の条件の下で、ソースツリーによってカーネル構築を開始することが重要です。したがって、make mrproper コマンドによって作業を開始することをお奨めします。その場合には、すべての設定ファイルと、ソースツリーの周りに散らばっている可能性のある以前のビルドの残存物が削除されることになります。そこで新しいカーネルに組み込むコンポーネントを決定するために、設定ファイルを作成しなければなりません。カーネル設定のために利用できる手段を以下にリストします。

注意注意
 

kmod (詳細については 「 カーネルモジュールのロード - Chapter 3 」 を参照) とカーネルモジュールを使用するためには、設定時に kmod supportmodule version (CONFIG_MODVERSIONS) support に対して [Yes] と答えなければなりません。

すでに上記のいずれかの手段によって作成した設定ファイル (/usr/src/linux/.config - このファイルは上記のいずれかの手段を実行すると作成されます) を使用してカーネルを構築したい場合は、make mrproper コマンドと make config コマンドの使用を省略し、make dep コマンドの後に make clean コマンドを使用することで構築用ソースツリーの準備を行うことができます。

モジュール形式カーネルを作成するための次のステップは、単純に /usr/src/linux/Makefile を編集し、ソースコードコンポーネントをコンパイルして、マシンのブート時に使用可能な有効なプログラムの中に組み込むことです。ここで説明する手段を使用すれば、災難からの回復が最も容易になります。他の可能性に興味がある場合は、Kernel-HOWTO または Linux システムの /usr/src/linux に含まれる Makefile に詳細が見つかります。

SCSI アダプタを使用する場合に SCSI ドライバをモジュール形式にした場合は、新しい initrd イメージを構築してください ( initrd イメージの作成 を参照。 カスタムカーネルにおいて SCSI ドライバをモジュール形式とする現実的な理由はほとんどないことに注意してください)。initrd イメージを作成する特段の理由がなければ、このイメージを作成したり、それを lilo.conf に追加したりしないでください。

新しいカーネルにおいて発生する可能性のあるエラーから保護することを目的とした冗長ブートソースを用意するために、元のカーネルを利用可能な状態に保つ必要があります。カーネルを LILO メニューに追加することは、/boot で元のカーネルの名前を変更すること、新しいカーネルを /boot にコピーすること、 /etc/lilo.conf に 2、3 の行を追加すること、および /sbin/lilo を実行することと同じ程度に簡単です。以下に、Red Hat Linux と共に出荷されるデフォルトの /etc/lilo.conf ファイルの例を示します。

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=linux

linear

image=/boot/vmlinuz-2.2.15-2.5.0
     label=linux
     initrd=/boot/initrd-2.2.15-2.5.0.img
     read-only 	      
     root=/dev/hda8

other=/dev/hda1
        label=dos
	

ここで /etc/lilo.conf を更新しなければなりません。新しい initrd イメージを構築した場合は、それを使用することを LILO に通知しなければなりません。この /etc/lilo.conf の例では、ファイルの中央部分に 4 行を追加して、別のカーネルからブートすることを指定しています。/boot/vmlinuz の名前を /boot/vmlinuz.old に変更し、そのラベルを old に変更しています。新しいカーネルのために initrd という行も追加しています。

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=linux

linear

image=/boot/vmlinuz-2.2.15-2.5.0
     label=linux
     initrd=/boot/initrd-2.2.15-2.5.0.img
     read-only
     root=/dev/hda8

image=/boot/vmlinuz-2.2.15-2.5.0sjs
        label=test
        initrd=/boot/initrd-2.2.15-2.5.0sjs.img
        read-only
        root=/dev/hda8

other=/dev/hda1
        label=dos
	

以降は、システムのブート時に LILO の boot: プロンプトに対してTab を押すと、利用可能な選択肢が表示されるようになります。

LILO boot:
linux test dos

古いカーネル (linux) をブートするには、単純に Enter を押すか、LILO がタイムアウトするまで待機します。新しいカーネル (test) をブートするには、[test] と入力してから Enter を押します。

以下にステップのまとめを記します。

新しいカーネルをテストするには、コンピュータをリブートし、メッセージを観察して、ハードウェアが正しく検出されたことを確認します。

initrd イメージの作成

initrd イメージは、ブート時に SCSI モジュールをロードするために必要です。initrd イメージが必要なければ、このイメージを作成したり、lilo.conf を編集してこのイメージを組み込んだりしないでください。

以下の条件が満たされる場合には、シェルスクリプト /sbin/mkinitrd によって使用マシンに適した initrd イメージを構築することができます。

新しい initrd イメージを構築するには、以下のようなパラメータを指定して /sbin/mkinitrd を実行します。

/sbin/mkinitrd /boot/newinitrd-image 2.2.15

ここで、/boot/newinitrd-image は新しいイメージ用に使用するファイルであり、2.2.15initrd イメージで使用すべきモジュール (場所は /lib/modules) を含むカーネルです (現時点で動作しているカーネルのバージョンと同じである必要はありません)。

monolithic カーネルの構築

monolithic カーネルを構築する場合は、2、3 の例外を除き、モジュール形式カーネルの構築と同じステップを実行します。