カーネルの再構築

Author:Liangzhi Zou
Date:2002/6/13


    「カーネルの再構築」とは現在使用中のカーネルに新しい機能を追加したり不要な機能を減らしたりすることを言います。一方、アップグレードとは、現在使用中のカーネルには無い機能が必要な場合やパフォーマンスの向上、セキュリティの向上などを目的に新しいバージョンのカーネルソースを入手し、アップグレードすることを言います。ここではkernel-2.2.16の再構築手順を紹介します。
    まず/usr/src/linuxに入ります。
    1)  適切な構成テンプレートの用意:既存のカーネルを再構築する場合だけ、しかも大幅な変更を行なわない場合は必要ないかもしれませんけど、RedHat 7.x系のLinuxでは必須みたいので、一応実行します。これを実行することにより.configやオブジェクトファイルが削除されデフォルトの状態に戻ります。(次に、自分のハードウェアに適するものをarch/i386/defconfigにコピーします。最後に、make oldconfigと入力して、当初の/usr/src/linux/.configファイルを作成します。既存の.configの設定を活かしたい場合は.configをバックアップしておいたほうがいいでしょう。

        make mrproper
(cp -p configs/kernel-2.2.16-i686.config arch/i386/defconfig
make oldconfig)
    2)  .config設定ファイルのカスタマイズ:利用できる設定オプションは何百とあります。そのため、各種のオプションとその従属関係を整理するためのユーティリティがいくつかあります。一般には、各カーネルコンポーネントごとに、(1)そのコンポーネントを静的にコンパイルしてカーネルに組み込む、(2)そのコンポーネントを動的にロード可能なモジュールとしてインクルードする、(3)そのコンポーネントをカーネルから除外する、という3種類のオプションがあります。

        make xconfig(またはmake menuconfig、またはmake config)
	  
    3)  適切なエクストラバージョンの定義:カーネルバージョンは、トップレベルのMakefileに定義されます。必ずプロジェクトごとに一意のエクストラバージョンを定義してください。これにより、正しいカーネルに正しいモジュールライブラリをマッピングすることができます。

        /usr/src/linux/Makefileの行4を編集します。EXTRAVERSION= -zou
       (Redhat Linux 7.0であれば、gcc->kgccに変更したほうがいいかも)
	  
    4)  サブディレクトリ設定ファイルの作成:.configファイルに定義した設定とトップレベルのMakefileを、make depでサブディレクトリ設定ファイルに送ります。

        make dep clean
	  
    5)  カーネルのコンパイル:一般にLinuxのカーネルは、gzip圧縮されたイメージからロードされます。これはmake bzImageによって構築されるタイプの1つです。コンパイル後、圧縮されたカーネルイメージは/usr/src/linux/arch/i386/boot/bzImageになります。

        make bzImage
	  
    6)  カーネルモジュールのコンパイルとインストール:カーネルモジュールは、ベースカーネルと同じソースファイルからコンパイルされますが、これとは別のmake呼び出しによってコンパイルされます。モジュールは、modules_installのmake呼び出しによって/lib/modules/(version)ディレクトリにインストールされます。カーネルのバージョンが、すでにインストール済みのカーネルと競合するときは、以前のベースの上に新しい方のモジュールがインストールされていまいます。このためまったく新規にインストールする場合に比べて悪い影響が出ることがあります、このため、エクストラバージョンパラメータの設定が重要です。

        make modules modules_install
	  
    7)  カーネルのインストール:カーネルの名前や場所について特に制限はありませんが、Red Hatでは、カーネルは/bootパーティションにインストールし、適切なカーネルバージョンを用いた正確な名前を付けることを推奨します。圧縮されていないカーネルイメージの名前は慣習的にvmlinuxであり、圧縮されているイメージは一般にvmlinuzです。

        cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.16-zou
	  
    8)  初期RAMディスク:場合によっては、特定のカーネルコンポーネントをモジュールとして実装するのが望ましいことがあります(ブート時に必要な場合も)。もっとも代表的な例が、モジュール式SCSIドライバです。カーネルは、ファイルシステムが存在する前にモジュールをロードしなくてはならないので、モジュールがRAMディスクイメージに格納され、これをinitrdと呼びます。こうしておくとカーネルは、ブート時にこのRAMディスクからモジュールをロードすることができます。mkinitrdコマンドは、mkinitrdコマンドは、指定のカーネルのモジュールライブラリを調べて、ブート時に必要となる可能性のあるモジュール(通常はSCSIドライバやソフトウェアRAIDモジュール)があればインテリジェントに選択し、RAMディスクイメージを作成し、それらモジュールをRAMディスクに格納します。このためinitrdイメージは、ブート可能な場所、例えば/bootディレクトリに格納します。mkinitrdコマンドは2つの引数をとります。作成するRAMディスクイメージのファイル名、もう1つは、initrdに対応するカーネルバージョンです。この場合も、初期RAMディスクイメージの名前に制限はありませんが、長期的な観点から、正確な名前を付けておくことが推奨されます。

        mkinitrd /boot/initrd-2.2.16-zou 2.2.16-zou
	  
    9)  System.map:カーネルのコンパイル時には、さまざまなカーネルプロシージャ用のシンボルテーブルが作成され、ファイル/usr/src/linux/System.mapに格納されます。カーネルパニック時にはカーネルによってドロップされるデバッグ情報を解釈するうえでこのテーブルのコピーが必要となるので、カーネルとともに格納しておく必要があります。

        cp /usr/src/linux/System.map /boot/System.map-2.2.16-zou
	  
    10)  LILOを再設定する:/etc/lilo.confファイルを編集して、Liloコマンドを実行した後再起動すれば終わりです。

        vi /etc/lilo.conf
        lilo
        reboot
	  
Hosted by www.Geocities.ws

1