Red Hat Linux 7.1へのkernel 2.4.xの組み込みとカスタマイズ

1.はじめに

Redhat等のパッケージ製品には、特別に修正されたバージョンのカーネルが使用されています。このため状況によっては、デバイスドライバやカーネルの研究、開発には適していませんし、最新のカーネル機能についてもRedhat等のパッケージ配布元からの正式リリースが出るまで利用できません。また、カーネルにPatchを当てるような形式で配布されている追加モジュールや、各種デバッグ機能も利用できません。このような事から、Redhat等の市販のパッケージ製品を使って、デバイスドライバやカーネルの研究、開発を行うためにはまず、市販のパッケージ製品に対して、Linuxカーネル開発元総本山であるkernel.orgから配布されている、カーネルを組み込んで利用する事が必要になります。

ここでは、Linuxのデバイスドライバ開発の基本とも言える、kernel.orgからダウンロードした「素」の純正カーネルを、市販パッケージ環境に対して組み込んで、動作させる方法を紹介します。環境としては、別項で紹介する手順でインストールしたRedhat Linux 7.1にkernel.orgからダウンロードしたカーネルkernel-2.4.18を組み込む場合を例に説明しますが、他の多くのLinux環境でもほぼそのまま利用できるのではないかと思います。

2.新カーネルのダウンロードとコンパイル、コピー

まず最初に、kernel.orgからkernel-2.4.18をダウンロードします。ダウンロードする方法は何でも構いませんが、ダウンロード先はできればミラーサイトの方がいいでしょう。ダウンロード方法は、WindowsであってもFTPツールであっても、これから開発しようとするマシン上ののNetscapeでもOKです。
一般的な方法を用いて、組み込むためのカーネルをダウンロードし、カーネルをコンパイル、リンクして作成します。
以下は、ダウンロードしたkernel-2.4.18を、/usr/src/linux-2.4.18に展開してコンパイルする場合の操作例です。

3.カーネルのソースツリー

カーネルのソースコード・ツリー(ツリー状に管理している各バージョンのカーネルのソースコードとオブジェクトコード)は、/usr/src 以下のディレクトリに、通常各バージョンを示すディレクトリ名をつけて保管しておきます。
以下に、/usr/src以下にあるRedhat 7.1オリジナルと、tarによって展開したkernel-2.4.18の様子を示しています。
kernel周りのインクルードファイルを処理する関係で、通常は/usr/src/linux (Redhatの場合は/usr/src/linux-2.4というシンボリックリンク)を、現在動作しているカーネルのソースコード・ツリーに対して張っておきます。

4.カーネルのコンパイルとリンク手順概略

カーネルのコンパイル・リンクに関しての説明はいろいろな所で解説されています。なかには、'make boot' 'make bzlilo'等のコマンドによって、一挙にbzImageやmodule関係まで含めてmakeする手法を解説している例もあります。ここではカーネルやデバイスドライバの開発者向けに、各ステップでエラーが発生する場合を考慮して、ステップ毎にコンパイル、リンクする方法をkernel-2.4.18を組み込む場合を例にして紹介します。このようにすればmakeの仕組みによって、エラーが起きた場合にはそのステップから最小限度のコンパイル手順で復旧させる事ができるはずです。

以下の全ての作業はrootでログインしてX-Windowを立ち上げた後、ターミナル・ウインドウを開いて行います。

# cd /usr/src/linux-2.4.18
# make mrproper
# make xconfig
# make dep
# make clean
# make bzImage
# make modules
# make modules_install
# cp -p System.map /boot/System.map-2.4.18
# cp -p arch/i386/bzImage /boot/vmlinuz-2.4.18
# cd /boot
# rm vmlinuz System.map
# ln -s vmlinuz-2.4.18 vmlinuz
# ln -s System.map-2.4.18 System.map
# mkinitrd initrd-2.4.18.img 2.4.18
# cd /etc
# vi lilo.conf
# llilo -v

これらの手順は、常に毎回繰り返すのではなく、開発の目的や必要に応じて各ステップを実行します。
また新しくカーネルやデバイスドライバの開発、組み込みを行う前に、正しく動作する環境は保管しておいて、新しく生成するカーネルや作業用のディレクトリに別のバージョン名をつけるというような注意が必要です。バージョン名管理については、別項で解説しています。

5.各ステップの簡単な解説

# cd /usr/src
# rm linux-2.4

/usr/srcに移動して、Redhatで設定されている、linux-2.4のシンボリックリンクを削除します。

# tar xjf /home/tar/linux-2.4.18.tar.bz2

/home/tar/linux-2.4.18.tar.bz2としてダウンロードしてあるbz2形式圧縮のカーネルを伸張しながら展開します。

# mv linux linux-2.4.18
# cd /usr/src/linux-2.4.18

展開後のカーネルソースは、どんなバージョンでもlinux以下のツリーとして作成されるので、展開後すぐにディレクトリの名前を変更しておきます。
その後、カーネル作成用のディレクトリにChange Directory します。

# make mrproper

カーネル・コンパイル環境を全て初期化するコマンドです。カーネルのCONFIG情報を保管してある'.config'ファイルまで削除してしまうので、使用する場合には注意が必要です
一般的に、初めての環境で最初にカーネル・コンパイルする時に実行する必要があるとされていますので、カーネル・コンパイルの本来の最初の手順であるという事を覚えておいた方がいいでしょう。実際では、動作確認したカーネル環境に対して、カーネルPatchを当てた後にも実行させます。

# make xconfig

X-Window上でCONFIGファイルを設定するGUIツールを呼び出して、これからコンパイルするカーネルのパラメータ情報を設定し、'.config' というファイルに保管します。
X-Windowが使えないが、カーソル制御が使えるキャラクタ端末画面上で実行する場合には、代わりにmake menu configを実行します。
カーソル制御も行えない端末環境では、旧式のmake configを実行します。
これらの、make *config コマンドによる、CONFIGファイルの編集作業に関しては、次項に解説しています。

# make dep

カーネルのCONFIG情報やすでに配置されているファイル情報に従って、カーネル・コンパイルに必要な前処理(特に依存性のチェックと組み立て)をおこないます。

# make clean

カーネル・コンパイルを新規に行うために、前回作成したオブジェクト・モジュール等の中間ファイルを削除します。

# make bzImage

bz2形式で圧縮されたカーネル本体を、コンパイル・リンク作業によって生成します。
普段は使われる事はありませんが、圧縮されないカーネルを作るコマンドは、make Imageです。また、Linux 2.0の頃まで使われていた、zip形式で圧縮されたカーネルを作るコマンドは、make zImageなので、古い文献でたまに見かけます。
マシン環境や設定したCONFIG内容にも依存しますが、Pentium!!! 800MHz程度のマシンで、終るまで15分ぐらいかかります。

# make modules

カーネルと動的にリンクして使用する各種カーネル構成モジュールやデバイスドライバをコンパイルして、生成します。
カーネル・コンパイル作業中最も時間がかかる手順です。マシン環境や設定したCONFIG内容にも依存しますが、Pentium!!! 800MHz程度のマシンで、終るまで20分〜30分ぐらいかかります。
カーネル・ツリーの中に登録してあるローダブル・モジュールのソースを修正して再コンパイルする場合には、この手順以降を繰り返します。

# make modules_install

make modulesで作成した各モジュールを、新しいカーネルから参照させるために、/lib/modules以下にインストール(コピー)します。このとき同時に各moduleと依存関係のリスト(modeles.dep)やモジュールのマップファイルを作成します。

# cp -p System.map /boot/System.map-2.4.19
# cp -p arch/i386/bzImage /boot/vmlinuz-2.4.19

作成したbz2圧縮されたカーネル本体とそのマップファイルを、起動用の/bootディレクトリにコピーします。

# cd /boot
# rm vmlinuz System.map
# ln -s vmlinuz-2.4.18 vmlinuz
# ln -s System.map-2.4.18 System.map

起動用ファイルを置いておく /bootディレクトリに移動して、デフォルトの「圧縮カーネル名」である、vmlinuzのシンボリック・リンクを削除して、最新版カーネル名へのリンクに張り替えます。
System.map ファイルは、カーネルのログ記録プログラム (kernel logger)やいくつかのデバッグ用ツールが、アドレスとモジュール名を関係付けるため必要とされているので、このシンボリック・リンクも一旦削除して、新しいサフィックスをつけて生成したマップファイルに張り替えます。
今回開発したカーネルが、本当に一時的なものである場合には、このシンボリック・リンクを張り替える作業を行わなくとも、新しいカーネルの起動テストを行なう事は可能です。

# mkinitrd initrd-2.4.18 2.4.18

initrd(立ち上がり時に利用するRAM-DISK)イメージを作成します。これは、主にSCSIやRAID、ext3を使用したシステムなどで、ブート時にローダブル・モジュールからデバイスドライバを読み込む必要がある場合に使用します。
ext2を使用していて、カーネルにビルドインしたドライバだけでファイルシステムをマウントできる場合には、このRAM-DISKイメージの作成と使用は必要ないかも知れません。

# cd /etc
# vi lilo.conf
# llilo -v

これらは、LILO(LInux LOder)の設定です。LILOは比較的古いために、カーネルが大きくなり、また新しく大容量のディスクが出る度にいくつかの問題を抱えてきましたが、WindowsやDOSとのマルチブートや、Linuxの各バージョンのカーネルやブートモードを起動時に切り替えるといった基本的な機能を提供しています。
/etc/lilo.confというファイルでLILOの設定が管理されているので、カーネル(vmlinuz)を作り直す度に、このファイルを修正確認して、lilo -vを実行する必要があります。lilo.confの設定に関しては、別項で紹介します。

6.CONFIGファイルの作成

CONFIGファイルとは、カーネル・コンパイルのルート・ディレクトリ(この場合は、/usr/src/linux-2.4.18)に配置しておく「.config」と言う名前のファイルです。このファイルに、作成すべきカーネルの各種パラメータや組み込むべきモジュールに関する情報が、全て記述してあります。このファイルは、カーネルのパラメータやコンフィグレーション情報を記述したテキストファイルなので、エディタを使って手作業で作成、編集する事も可能ですが、通常は前述のように、make *configというように、makeコマンドを使って編集ツールを立ち上げて編集を行います。また、この.configファイルのサンプルは、Redhat等のパッケージ製品の配布元から配布されているもの(厳密には違うバージョンのカーネル用のものですが)を簡易的に流用する事も可能です。

make xconfigでのCONFIGファイルの編集例を以下に示します。


xconfigを実行すると、上のようなGUI画面が現われますので、まず右下の「Load Configuration from File」をクリックします。
すると以下のようなダイアログが現われます。


この「Load Configuration from File」ダイアログでは、すでに正しく記述されているCONFIGファイルを読み込ませる事が可能です。
このLoad操作を行わない場合には、カーネル開発ルート・ディレクトリにある現在の「.config」ファイルが読み込まれますが、make mrproperをした後ではこの「.config」ファイルが無いために、最小限の設定しか行われません。
プレインストール・カーネルでは、make oldconfigによって、インストール時のカーネルのCONFIGファイルを.configとして作成させる事ができますが、「make mrproper」によって消えてしまうので、注意が必要です。

ここでは、Redhat等からプレインストール・カーネルとともに配布されている、カーネル・コンフィグレーション・ファイルを参照して読み込む方法を紹介します。Redhat 7.1では、kernel-2.4.2-2用のカーネル・コンフィグレーション・ファイルが、/usr/src/linux-2.4.2/configs以下のディレクトリにありますので、取りあえずはその中から現在のマシン環境に近いものを選択して読み込むといいでしょう。例えば、kernel-2.4.2-i686-smp.configという名前のファイルは、i686アーキテクチャ用(Pentium!!!, II, Celeron)用のマルチCPUマシン用に設定されているコンフィグレーション・ファイルです。例えば、AMDのAthlon/DuronのシングルCPUのマシンの場合には、マシン「Load Configuration from File」ダイアログに「configs/kernel-2.4.2-athlon.config」を指定してロードします。

コンフィグレーション・ファイルをロードした後は、新しいカーネル用にこのツールを使って、設定を変更する事が可能です。
例えば、IDEでもSCSIでもない旧型のCDROMドライブを接続する予定がなければ、「Old CD-ROM drivers (not SCSI, not IDE)」のメニューを選択して、モジュールの組み込みを「n」にして削除する事ができます。
例えば、通常はカーネルにスタティック・リンクで組み込まれるLinuxの標準シリアル・ポート・ドライバを改造して、ローダブル・モジュールのドライバとしてテストするためには、「Character devices」のメニューを選択して、以下の様に「Standard/generic (8250/16550 and compatible UARTs) serial support」の項目を、「y」から「m」にする事も可能です(★注意:このような改造とテスト作業を必要としない人は、この設定はしないで下さい)。
このように、各ドライバモジュール組み込みの選択設定画面では、「y」がカーネルにスタティック・リンクで組み込まれ、「m」がローダブル・モジュールとしてカーネルに組み込まれ(実際には使用されるまでは組み込まれる事はありません)、「n」がカーネルへの組み込みを行わない事を示してします。
「y」や「m」の項目が多いとカーネルは大きくなり、コンパイル時間がかかるようになります。また「n」を多くすると、Linuxが提供するいくつかの機能が使えなくなったり、いくつかの依存性のあるモジュールを必要とするデバイスドライバのローダブルモジュールの組み込みに失敗します。

コンフィグレーション設定ツールでは、前述のデバイスドライバの組み込み設定のほかに、カーネルの各種パラメータやコンパイル時のオプション等も設定する事ができます。「Help」で簡単な情報を見る事ができますが、わからない機能は変更しない方がいいでしょう。このカーネル・コンフィグレーションの設定方法に関しては、ネットで調べる事も可能ですが、コンフィグレーション内容は、カーネルのバージョンが違うと異なるので注意が必要です。

7.カーネルのバージョン番号の管理

カーネルやデバイスドライバ開発の基本としてまず最初に行う事は、開発のバージョンを決定、確認する事です。カーネルが使用するバージョン名は、開発のルート・ディレクトリのMakefile の最初に以下の様に記述してあります

VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 18
EXTRAVERSION =

KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
<以下略>

VERSION,PATCH-LEVEL, SUB_LEVELは必ず数字である事が要求され、表示ではピリオド「.」で区切られる事になっています。EXTRAVERSIONの表示上の扱いは、 SUB_LEVEL の後に直ぐに続ける事になっています。
例えば、2.4.18-debugという名前のカーネルを作るようにMakefile中で指定する場合には、EXTRAVERSIONとして'-debug'というようにハイフン「-」付の名前を指定する必要があります。このように、EXTRAVERSIONの名前付けには、英数字のほかに記号も使われる事になっています。

新しくオリジナルやテスト用のカーネルを作成する場合には、元とするカーネルのEXTRAVERSION以外を変更しない方がいいでしょう。これはLinuxカーネルでは、SUB_LEVELが1つでも違うと互換性が保証されないからです。そのために、カーネル内のソースコードでは#if のマクロでSUB_LEVELの大小の比較判定で使用している場合もあるからです。
Linuxカーネル・モジュールの上位、下位互換性が無い問題は、よその開発環境から入って来た人には非常に奇異に見えるかも知れませんが、Linuxでは常識となっていますので、注意して下さい。

以下はカーネルのバージョン番号名を管理するためのテーブルの例です。このようなメモを残しておけば、テストやデバッグ用にたくさんカーネルを作ってもわからなくなったり、システムが立ち上がらなくなる心配は無いと思います。

ディレクトリ名 カーネルサフィックス(vmlinux, System.map) Makefileと/lib/modulesでのVersion名 LILOのラベル 説明
linux-2.4.2 -2.4.2-2 -2.4.2-2 linux Redhat7.1インストール時に最初から入っているカーネルソース。2.4.2-2Redhat特別版。
linux-2.4.18 -2.4.18 -2.4.18 linux18 kernel.orgからダウンロードした純正の2.4.14カーネルソース。カーネルの動作確認のために、残しておく。
linux-2.4.18-kdb -2.4.18-kdb -2.4.18-kdb kdblinux 2.4.18にkdbデバッガ用パッチを当てたカーネルソース・ツリー。
linux-2.4.18-x -2.4.18-x -2.4.18-x linuxX 2.4.18をベースにして、現在開発中のバージョンのカーネルソース・ツリー。


8.LILOの設定

/etc/lilo.confファイルを編集して、LILOの設定を行います。

<==== 編集内容、ここから:2.4.18の起動設定を追加します。(8行目から13行目) ===>
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message.ja
linear
default=linux18

image=/boot/vmlinuz-2.4.18
label=linux18
read-only
root=/dev/hda2
initrd=/boot/initrd-2.4.18.img


image=/boot/vmlinuz-2.4.2-2
label=linux
read-only
root=/dev/hda2

other=/dev/hda1
optional
label=win
<====編集内容は、ここまで====>

★重要 lilo.confの編集後、必ず以下のコマンドを実行します。
# /sbin/lilo -v
OK ならば、今回作成した新しいカーネルのブートローダとアドレスがマスターブートレコードに記録されます。

9.システムの再起動と確認

ここまでの手順が無事に終了したらば、X-Windowを終了して次のコマンドによりシステムの再起動を行います。
# shutdown -r now

LILOによって表示される、RedHatのブート初期画面で、今回作成したカーネルのラベル名(lilo.confで設定した名前)を選択して、起動させます。

★注意:カーネルブート時にロードするローダブルモジュール(/lib/modules 以下)を同じ名前のままカーネルの構成を変えた場合、LILOでの名前とブートするカーネルの名前の整合性が取れていない場合、またはmake modulesでコンパイルエラーが出ているのにもかかわらず、作業を続行した場合には、起動時にモジュール・ライブラリの参照でエラーになります。その時には、正常に立ち上がるカーネルラベルを使用して立ち上げて、リカバリを行います。

10.ポイント

ポイントとしては、カーネルのコンパイル・リンク操作全てをX-Window上で行う事と、カーネルやデバイスドライバの開発では、バージョン番号名を正しく管理する事です。
ターミナル・ウィンドウのスクロールバッファ数を多めに設定しておけば、エラーが発生した場合に復旧するための手がかりとなります。それから、大した機能ではないのですが、make xconfigによるCONFIGファイル設定も、慣れてしまうと手放せません。以前は、Linux用に非力なマシンが利用される場合があり、カーネル・コンパイル作業がリソースを消費する事から、カーネル・コンパイルはX-Windowを使わずに行った方が良いと言われた事もありましたが、最近のマシン環境では関係無くなって来ています。

Last editted on 2/4/2003
Copyright(c) 2003, Device Drivers Limited 戻る→