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

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

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

Note注意
 

ここの例では、カーネルバージョンとして2.4.2-0.1.21を使っています。お使いのバージョンは、これとは異なるかもしれません。カーネルバージョンは、uname -rコマンドを使って調べることができます。2.4.2-0.1.21を実際のバージョンに読み替えてください。

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

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

  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カーネルを使っている場合は、お使いのコンピュータアーキテクチャ向けに出荷されているカーネルと同じになるように設定されます。いったん間違いのないデフォルトに設定し、そのあとで不要な機能を無効にするといった使い方ができます。

    Note注意
     

    kmod(詳しくは、the section called カーネルモジュールのロードを見てください)とカーネルモジュールを使うときは、設定の際、Yesと入力しなければなりません。kmod supportmodule version (CONFIG_MODVERSIONS) support に対して

  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(日本語の情報についてはJF プロジェクトのhttp://www.linux.or.jp/JF/JFdocs/INDEX-kernel.htmlなどもあります)か、お使いのLinuxシステム上の/usr/src/linux-2.4にあるMakefileを参照してください。

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

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

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

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

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

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

  14. 今作ったばかりのカーネルは動かない可能性もありますから、元のカーネルを利用可能な状態のままにし、冗長ブートソースとする必要があります。それには、まず/etc/lilo.confファイルを更新し、/sbin/liloを実行します。

    デフォルトの/etc/lilo.confファイルは、およそ次のようになっています。
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    message=/boot/message
    linear
    default=linux
    
    image=/boot/vmlinuz-2.4.2-0.1.21
     label=linux
     initrd=initrd-2.4.2-0.1.21.img
     read-only
     root=/dev/hda5
    新しいカーネルをLILOに追加するには、既存のセクションをコピーし、それを編集して新しいカーネルイメージ(SCSIデバイスがありinitrdイメージを作ったのであれば、そのinitrdイメージも)を起動するように変更します。さらに、従来のカーネルのラベルをlinux-oldなどと付け替えます。編集後の/etc/lilo.confは、次のようになっているはずです。
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    message=/boot/message
    linear
    default=linux
    
    image=/boot/vmlinuz-2.4.2-0.1.21-12feb2001
    label=linux
    initrd=initrd-2.4.2-0.1.21-12feb2001.img
    read-only
    root=/dev/hda5
    
    image=/boot/vmlinuz-2.4.2-0.1.21
    label=linux-old
    initrd=initrd-2.4.2-0.1.21.img
    read-only
    root=/dev/hda5

  15. そして、/sbin/liloを実行して、この変更を有効にします。作業が順調であれば、次のようなメッセージが表示されます。
    
Added linux *
    Added linux-old
    ここで、「linux」のあとにある「*」は、linux というラベルのセクションがLILOのブートするデフォルトカーネルだということを表します。

  16. これ以降、システム起動時にlinuxlinux-oldという2つのLILOブートオプションが表示されるようになります。

    新しいカーネル(linux)を起動するには、単にEnterキーを押すか、LILOの時間切れを待ちます。従来のカーネル(linux-old )を起動するときは、linux-oldを選び、Enter キーを押します。

  17. コンピュータを再起動して、新しいカーネルの動作確認を始めます。ハードウェアが正しく検出できたかどうか、メッセージをよく見ます。