付録 A. カスタムカーネルの構築

Linuxは初めてという人は、「なぜ独自のカーネルを構築する必要があるのだろうか」という疑問をよく抱きます。現在ではカーネルモジュールが改善されているので、この疑問に対する最も正確な答えは次のようになるでしょう。「今、独自のカーネルを構築する必要性を感じていなければ、構築しなくてもよい。」

以前は、システムに新しいハードウェアを追加した場合にはカーネルを再コンパイルする必要がありました。つまり、カーネルは静的なものでした。しかし、Linux 2.0.xではカーネルが改良され、ハードウェアドライバの多くをコンポーネントとしてモジュール化でき、要求があった場合にのみ組み込めるようになりました。しかしそれでも、システムについての設定オプションを変えてコンパイルされたカーネルが複数ある場合には問題がありました(たとえばSMPカーネルとUPカーネル)。ところが、Linux 2.4.xのカーネルモジュール化方式がさらに改良され、複数モジュールの共存が簡単になりました(ただしモジュールを共有することはできません)。

カーネルモジュールの取り扱いについては、第24章を参照してください。このようにカーネルモジュールの処理方法は変遷してきましたが、これに気づくことはほとんどないでしょう。気づくのは、システムに合わせてカーネルをカスタマイズし再コンパイルするときぐらいです。

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

ここでは、モジュール形式カーネルの構築について解説します。モノリシックカーネルについては、モノリシックカーネルの構築を参照してください。モノリシックカーネルの構築とインストールについて、モジュール形式カーネルとは異なる点について説明してあります。

以下では、x86アーキテクチャ用のカスタムカーネルを構築する手順を説明します。

注意注意
 

ここの例では、カーネルバージョンとして2.4.7-3を使っています。使用カーネルバージョンは異なる場合があります。カーネルバージョンを確認するには、uname -rコマンドを入力します。2.4.7-3を実際のバージョンに読み替えてください。

  1. 最も重要な手順は、以降の作業でミスをした場合に備えて、正常に動作する緊急ブートディスクを用意しておくことです。インストール時にブートディスクを作成しなかった場合は、mkbootdiskコマンドを使って、今すぐ作成してください。実際のコマンドは、通常、mkbootdisk --device /dev/fd0 2.4.xのようになります。ここで、2.4.xは、カーネルの完全なバージョン番号(2.4.7-3など)です。ブートディスクができたら、それを使ってシステムがブートできることを確認してください。

  2. まず、kernel-headersパッケージとkernel-sourceパッケージをインストールしておく必要があります。すでにインストールされている場合は、rpm -q kernel-headersコマンドとrpm -q kernel-sourceコマンドを実行してバージョンを確認してください。まだ、インストールしていない場合は、Red Hat Linux CD-ROM 1か、ftp://ftp.redhat.comにあるRed Hat FTPサイト(ミラーサイトの一覧は、http://www.redhat.com/mirrors.htmlにあります)からインストールしてください。RPMパッケージのインストールについては、第25章を参照してください。

  3. シェルプロンプトを開き、/usr/src/linux-2.4ディレクトリに移動します。これ以降のコマンドは、すべてこのディレクトリで実行しなければなりません。

  4. カーネルを構築するときは、ソースツリーをきれいな状態にしておくことが重要です。したがって、最初に、make mrproperコマンドで作業を始めるのがよいでしょう。このコマンドは、前回の構築作業がソースツリーに残した設定ファイルなどを削除します。すでに正常に機能する設定ファイル(/usr/src/linux-2.4/.config)があり、それを使う予定の場合は、このコマンドを実行する前に別のディレクトリに待避させ、実行後に戻してください。または、この次の手順は飛ばしてください。

  5. 次に、カーネルに組み込むコンポーネントを指定する設定ファイルを作ります。

    X Window Systemが使える環境なら、make xconfigコマンドを使うとよいでしょう。コンポーネントがボタンの形式で表示され、これをマウスで選んでいきます。選択肢は、Y(はい)とN(いいえ)とM(モジュール)の3つです。コンポーネントを選び終えたら、Save and Exitボタンをクリックします。これで、設定ファイル/usr/src/linux-2.4/.configが作られ、Linux Kernel Configurationプログラムは終了します。

    カーネルを設定する方法は、ほかにもあります。

    • make config—対話式のテキストプログラムです。コンポーネントが順次表示され、1つずつ選択の有無を指示していきます。この方法はX Window Systemを使いませんが、指示を遡って変更することはできません。

    • make menuconfig—テキストモードですがメニュー方式のプログラムです。コンポーネントは分類表示され、テキストモードのRed Hat Linuxインストールプログラムと同じ方法でコンポーネントを選びます。コンポーネントに対応するタグの印を切り替えて選択します。記号の意味は次のとおりです。[*](組み込む)、[](組み込まない)、<M>(モジュール)、<>(モジュール化可能)。この方法も、X Window Systemを使いません。

    • make oldconfig—これは非対話式のスクリプトで、設定ファイルにデフォルトを設定します。デフォルトのRed Hatカーネルを使っている場合は、コンピュータアーキテクチャ向けに出荷されているカーネルと同じになるように設定されます。いったん間違いのないデフォルトに設定し、そのあとで不要な機能を無効にするといった使い方ができます。

    注意注意
     

    kmod(詳しくは、第24章を参照)とカーネルモジュールを使うときは、設定の際、kmod supportmodule version (CONFIG_MODVERSIONS) supportに対してYesと入力しなければなりません。

  6. /usr/src/linux-2.4/.configファイルができたら、次にmake depコマンドを実行して、依存性を正しく設定します。

  7. make cleanコマンドを実行し、構築用にソースツリーの準備をします。

  8. モジュール形式のカーネルを構築する場合、次に/usr/src/linux-2.4/Makefileファイルを編集して、既存のカーネルを上書きしないようにします。ここで説明する方法を利用すると、トラブルの際、非常に簡単に回復させることができます。それ以外の用途について、詳しくはhttp://www.redhat.com/mirrors/LDP/HOWTO/Kernel-HOWTO.htmlか、Linuxシステム上の/usr/src/linux-2.4にあるMakefileを参照してください。

    /usr/src/linux-2.4/Makefile中のEXTRAVERSION =で始まる行を編集し、その文字列の終わりに日付を加えて、名前が一意になるようにします。たとえば、バージョン2.4.7-3のカーネルをコンパイルしているのであれば、次のようにします。 EXTRAVERSION = -0.1.21-jul2001。こうすれば、運用中のカーネルとバージョン2.4.7-3-12jul2001のカーネルという新旧2つのカーネルをシステムに同時に置くことができます。

  9. make bzImageを実行して、カーネルを構築します。

  10. make modulesを実行して、設定したモジュールをすべて構築します。

  11. make modules_installを実行して、カーネルモジュールをインストールします(構築していない場合も)。コマンドの途中にある下線(_)を忘れないようにしてください。これで、カーネルモジュールは、ディレクトリパス/lib/modules/KERNELVERSION/kernel/drivers以下にインストールされます。ここで、KERNELVERSIONは、Makefileで指定したパス名です。上記の例でいえば、/lib/modules/2.4.7-3-jul2001/kernel/drivers/となります。

  12. SCSIアダプタがありSCSIドライバをモジュール化した場合は、新たにinitrdイメージを構築します(initrdイメージの作成を参照。実用上、カスタムカーネルでSCSIドライバをモジュールにする理由はほとんどない点に注意)。initrdイメージは、これを作るべき特別な理由がない限り、作らないでください。また、それをlilo.confに追加しないでください。

  13. make installを実行して、新しいカーネルとそれに付随するファイルを適切なディレクトリにコピーします。

  14. カーネルが構築され、インストールされます。次に、ブートローダーを設定して、新しいカーネルを起動します。詳細情報については、ブートローダーの設定を参照してください。