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 コマンドによって作業を開始することをお奨めします。その場合には、すべての設定ファイルと、ソースツリーの周りに散らばっている可能性のある以前のビルドの残存物が削除されることになります。そこで新しいカーネルに組み込むコンポーネントを決定するために、設定ファイルを作成しなければなりません。カーネル設定のために利用できる手段を以下にリストします。
make config -- 対話式テキストプログラム。コンポーネントが表示されるので、[Y] (yes)、[N] (no)、または [M] (モジュール) と応答してください。
make menuconfig -- グラフィカルな、メニューで操作するプログラム。コンポーネントはカテゴリのメニューの中に表示されるので、Red Hat Linux のインストールプログラムの場合と同じ方法で目的のコンポーネントを選択します。組み込む項目と対応するタグをトグルします。 [Y] (yes)、[N] (no)、または [M] (モジュール)。
make xconfig -- X Window System プログラム。コンポーネントは異なるレベルのメニューの中にリストされ、マウスによって選択を行います。ここでも、[Y] (yes)、[N] (no)、または [M] (モジュール) を選択します。
make oldconfig -- これは対話式スクリプトではなく、Makefile のデフォルト設定をセットアップするものです。パッチ適用済の Red Hat カーネルを使用している場合は、ボックスセット用に出荷されたカーネルのものと同じになるように設定がセットアップされます。これは、既知の有効なデフォルト設定に合わせてカーネルをセットアップし、その後で望ましくない機能を無効にする場合に便利です。
注意 | |
---|---|
kmod (詳細については 「 カーネルモジュールのロード - Chapter 3 」 を参照) とカーネルモジュールを使用するためには、設定時に kmod support と module 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 に詳細が見つかります。
Makefile を編集し、EXTRAVERSION = の行を変更して「一意の」名前と一致させる (EXTRAVERSION = -2.5.0sjs などのように、文字列の末尾に自分のイニシャルを追加するなど)。そうすることで、有効な古いカーネルと新しいカーネルを同時にシステム上に存在させることができます。
make bzImage によってカーネルを構築する。
make modules によって、設定したすべてのモジュールを構築する。
make modules_install によって、新しいモジュールをインストールする (まったく構築しなかった場合でも)。この場合は、Makefile で指定したパス名が使用され、ファイルパス /lib/modules/ にカーネルモジュールがインストールされます。例では /lib/modules/2.2.15-2.5.0sjs/ となります。
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 を押します。
以下にステップのまとめを記します。
Makefile に対して以前に行った変更の結果である名前を使用して、コンパイル済カーネルを /boot ディレクトリにコピーします。以下に例を示します。
cp -p /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.15-2.5.0sjs |
/etc/lilo.conf を編集します。
必要に応じて新しい初期 RAM ディスク、initrd イメージを作成します (「 initrd イメージの作成 」 を参照)。
/sbin/lilo を実行します。問題があると思われる場合には、lilo に -v フラグを追加して、より詳細なレポートを取得することができます。
新しいカーネルをテストするには、コンピュータをリブートし、メッセージを観察して、ハードウェアが正しく検出されたことを確認します。
initrd イメージは、ブート時に SCSI モジュールをロードするために必要です。initrd イメージが必要なければ、このイメージを作成したり、lilo.conf を編集してこのイメージを組み込んだりしないでください。
以下の条件が満たされる場合には、シェルスクリプト /sbin/mkinitrd によって使用マシンに適した initrd イメージを構築することができます。
ループバックブロックデバイスを利用することができます。
/etc/conf.modules ファイルには SCSI アダプタ用の行が含まれています。たとえば、
alias scsi_hostadapter BusLogic |
新しい initrd イメージを構築するには、以下のようなパラメータを指定して /sbin/mkinitrd を実行します。
/sbin/mkinitrd /boot/newinitrd-image 2.2.15 |
ここで、/boot/newinitrd-image は新しいイメージ用に使用するファイルであり、2.2.15 は initrd イメージで使用すべきモジュール (場所は /lib/modules) を含むカーネルです (現時点で動作しているカーネルのバージョンと同じである必要はありません)。
monolithic カーネルを構築する場合は、2、3 の例外を除き、モジュール形式カーネルの構築と同じステップを実行します。
質問に対して [Yes] および [No] と答えるだけでカーネルを設定する場合 (モジュール化をまったく行わない)。また、設定時には、kmod support と module version (CONFIG_MODVERSIONS) support に対して [No] と答える必要があります。
以下のステップを省略します。
make modules make modules_install |
lilo.conf を編集し、append=nomodules の行を追加します。