Linux Kernelの再構築

ここでは、Linux Kernelの再構築である。kernelとはOSの部分である。 OSをコンパイルしてもう一度作り直そうというものである。 といっても難しく考える必要はなく、コンパイルするぐらいは、いくらで もやってみてなれた方がいいでしょう。 インストールするときも今は、grubというものもあるし便利な時代になり ました。

折角フリーのOSを使っているのだから、多少の改造とかupgradeは自分でやっちゃうぞ ぐらいの勢いがあってもよい。

ここでは、grubを前提にしていますが、一応liloでの設定方法も書いてお きます。ですが、私の環境はgrubで起動されるので、そちらで確認を行なっ ています。もし、liloでうまくいかない場合は、連絡してください。 直せるように努力します。

もどる

kernelソースの入手。

kernelのソースは、

The Linux Kernel Archives

から入手できる。バージョンが2.4.18とかついているが、 2番目の数字に意味があり、偶数番になっていれば安定バージョンで、 奇数番になっていれば開発バージョンである。 つまり2.4.18は安定版の18回目のリリースとなる。 2.5.3は開発版の3回目のリリースとなる。 ソースコードは、2.0、2.2、2.4とおいてあるが、 このバージョンの違いによりシステムがかなり違ってくるので、 2番目の数字をあげる時は、アプリケーション自体もインストールし直さ なければならないものがでてくるかも知れない。

今回は、RedHat7.2の2.4.9のkernelを2.4.18にアップグレードするために 再構築を行なう。

linux-2.4.18.tar.gzをダウンロードしてきたら、展開する。 他のソースと重ならないように注意するため、もし、 /usr/srcにすでに linuxディレクトリがある場合は、そのディレクトリを変更して、 動かしておきます。ls -lでみればわかるように、linuxディレクトリはリンクファイル であり、削除するだけでよい。リンクじゃなかった場合はディレクトリ名 を変更する。 僕の場合は以下の用になっており、linuxではなく、linux-2.4というディ レクトリでした。

# cd /usr/src
# ls -l
合計 29460
lrwxrwxrwx    1 root	 root		14  4月 12 14:43 linux-2.4 -> linux-2.4.7-10/
-rw-r--r--    1 root	 root	  30108170  5月 11 09:45 linux-2.4.18.tar.gz
drwxr-xr-x   16 root	 root	      4096  4月 12 14:42 linux-2.4.7-10/
drwxr-xr-x    7 root	 root	      4096  2月 16 00:31 redhat/
# gtar xvfz linux-2.4.18.tar.gz
	  

このあと、他のバージョンと重ならないようにディレクトリ名を変更して リンクをしてあげる。

# mv linux linux-2.4.18
# ln -s linux-2.4.18 linux
	  

ここまで終ったら準備は完了です。続いてはコンフィギュレーションです。

コンフィギュレーション

ここからコンフィギュレーションです。cd /usr/src/linuxでソースのルー トディレクトリに移動する。その後、

# make mrrproper
	  

として、今までconfigで設定した内容の消去を行う。これによって、 Configurationはデフォルトの状態に戻される。 もとのままでいきたい場合は上記は必要ない。

次がいよいよ、kernelコンフィギュレーションである。 kernel コンフィギュレーションには、

# make config
	  

とするのであるが、これは対話型にコンフィギュレーションするモードで この他に

# make menuconfig
	  

というmenuベースのコンフィギュレータ(下)と

# make xconfig
	  

というXベースのコンフィギュレータ(下)がある。

また、この他に以下のような昔の設定をそのまま 使って、新しい設定だけを問い合わせてくるというものがある。

# make oldconfig
	

これを使うと、そのディレクトリにある.configをからデータを とって、それ以外の部分だけ聞いてくるのである。 なので、古いバージョンでkernelの再構築をしたことがあるならば、 そのディレクトリから、.configをとってきてコピーしてから 上記を実行すると古い設定が有効になるので便利である。

xconfigが初心者には一番わかりやすくていいと思う。xconfigでは、最初 の「Code maturity ... 」からnextで進めていけば、configでやっている のと同じことができる。

必要な項目をチェックしてコンフィギュレーションを変えてあげるとよい。 例えば、iptablesを使うには、Network options->Network packet filteringを有効にする。 しかし、一回やってしまえば、なれるので、再構築して起動してうまくい かなかったら、また再構築して起動するというのを繰り返すとよい。

ここではまるのは、ネットワークドライバのサポートで デフォルトの状態では、ネットワークはサポートされない カーネルとなる。自分のネットワークカードがどのドライバを 使っているか確認をして、 Network device support->Ethernet(10 or 100Mbit)の下の 必要なドライバをモジュールで入れておく。 モジュールで入れるのは、あとでドライバを変えたり、 HardWare自体を変えた時にいつでも、つかわないようにするためである。 もし、モジュールになっていなければ、その度に kernelの再構築をしなければならない。

RedHatが配布しているkernel-source-?.?.?-?.rpmの中に入っている ソースはRedHat向けにconfigができるようにconfigs/の中に RedHatのデフォルトをおいといてくれている。 なので、RedHatの設定を使いたい時は、現行のバージョンの kernel-sourc-?.?.?-?.rpmを持ってきて展開して make oldconfigを実行して、そこでできた.configを 新たに入れたいkernelのソースディレクトリに持っていって make oldconfigを実行すると便利である。 下記では、2.4.7-10(RedHat 7.2のもの)を持ってきて、それを 2.4.18に使う例である。

# rpm -ivh kernel-source-2.4.7-10.i386.rpm
# cd /usr/src/linux-2.4.7-10
...
...
*** End of Linux kernel configuration.
*** Check the top-level Makefile for additional configuration.
*** Next, you must run 'make dep'.

# cd ../linux-2.4.18
# make mrproper
# cp ../linux-2.4.7-10/.config .
# make oldconfig
何個か聞かれるがひとまずすべてリターンでよい。
	

これで、RedHatの設定を引き継げるのでやりやすい。 特にHardWareデバイスがモジュールで入ってきてくれるので 便利である。 もし、ここから変更を加えたい場合は、make xconfigを使って 変更がある場所だけ変更するとよい。

kernelのコンパイル

さー、コンフィギュレーションが終了したらいよいよ、コンパイルである。 まだ、システムがインストールされるわけでないので、 そんなに気にせずがんがん進みましょう。

まずは、configの内容をちゃんと反映させるため依存関係の 更新を行なう。

# make dep
	

つづいてkernelの構築である。

# make bzImage
	

これを実行すると、arch/i386/boot/bzImageできあがる。 bzImageというのは圧縮カーネルと呼ばれるもので、フロッピーに入る サイズに圧縮されており、自分でブート時に展開してしまうものである。

bzliloという、いきなりINSTALL_DIRにインストールしてしまう ものもあるが、上記でやってから これから説明するように手動でインストールしていった方が いいでしょう。

kernelのインストール

ここからがいよいよkernelのインストールである。へたをすると動かなく なる(起動すらできなくなる)ので、慎重に行ないましょう。 前のkernelを残しておくやりかたなので、もし立ち上がらなかっ たら前のkernelで立ち上げ直して、再構築し直して、再起動して と繰り返しましょう。どうしても面倒な人は、RedHatならば いつかはrpmでkernelの新しいバージョンを出してくれのでそれを待ちま しょう。 まー、ここまで読んできて面倒だという人はいないでしょう。

まずは、vmlinuzとSystem.mapのコピーです。System.mapはどうやら kernelのデバッグに使われるだけであまり必要がないようなのだが、 折角出来上がっているので、コピーしておく。

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

RedHatではこの他にmodules-infoというものがシンボリックリンクで /bootの下に存在するが、作り方がわからないのでそのままにしておく。 (誰か使う意味を知っていたら教えてください) これは、どうやらドライバの情報らしいのだが、何に使われているか はわかりません。

おそらく/bootには、vmlinuzというのが存在していると思うが、 これは、これまたシンボリックリンクだと思うので、これを 削除して、シンボリックリンクし直す(シンボリックリンクでない 場合は、名前の変更をしましょう。)。これも必要な操作ではないと思わ れる。が、一応RedHatのディレクトリ構成がそうなっているのでそれに 合わせる。

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

/bootの下にmodule-infoというファイルがあるのだが、何に使われるか あまり良くわからない。TurboLinux3.0では設定ツールに使用していた と書いてあるのだが、他のディストリビューションでは何に使われるのか わからない。多分必要としていないので今回はこのままにした。

つづいてinitrdなるものを作る。これの役目は、SCSIなどを立ち上げ時に いきなり使う時に必要になる(例えばブートHDDがSCSIだとか)。 ので、一応作っておく。

# mkinitrd initrd-2.4.18.img 2.4.18
	

準備完了であるが、ブートローダを設定しなければならないので、まだ再 起動してはいけない。

ブートローダの設定

つづいてブートローダの設定に入る。 ブートローダとは、linuxが立ち上がる前に、立ち上がり、 どのOSを立ち上げるか選んでくれるものである。 これに設定しておけば、2つのOSをインストールしても切替えて 立ち上げることができる。

○ grub

grubブートローダは新しいブートローダでファイルシステムを理解する しかもコマンドラインからある程度ファイルを触ることができるので OSが立ち上がらなくなった時も多少なりとも修復できる。 RedHat7.2から採用されており、他のディストリビューションでも 採用されるでしょう。これについては、きっと一枚の原稿がかけるので あとにして、設定だけを確認する。

grubの設定ファイルは/boot/grub/menu.lst(grub.confがシンボリックリ ンクされている)でされる。

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.	This means that
#	   all kernel and initrd paths are relative to /boot/, eg.
#	   root (hd0,0)
#	   kernel /vmlinuz-version ro root=/dev/hda5
#	   initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.18)
	root (hd0,0)
	kernel /vmlinuz-2.4.18 ro root=/dev/hda5
	initrd /initrd-2.4.18.img
title Red Hat Linux (2.4.9-21)
	root (hd0,0)
	kernel /vmlinuz-2.4.9-21 ro root=/dev/hda5
	initrd /initrd-2.4.9-21.img
title Red Hat Linux (2.4.9-13)
	root (hd0,0)
	kernel /vmlinuz-2.4.9-13 ro root=/dev/hda5
	initrd /initrd-2.4.9-13.img

defaultというのは、defaultで何番目のOSを使うか決める。 今回は、太字のとおり、0番目にエントリーをしてあるので 0としておく。

○ lilo

新しい設定ファイルを以下のようにする。

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message.ja
linear
default=linux

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

image=/boot/vmlinuz-2.4.18
	label=linux
	read-only
	root=/dev/hda5
	initrd=/boot/initrd-2.4.18.img

上記のように、昔のバージョンをlinux-oldというラベルに変え、 defaultを新しい方にしておく。

liloは、ファイルシステムを理解しないブートローダである。 だから、コンパイルしたら、HDDのどこにおいてあるかをlilo が理解していないといけない。 それを理解させるのが、lilo -vというコマンドである。

# lilo -v
	

grubは、ファイルシステムを理解しているので、 デバイス名とディレクトリ(デバイスの中の)を指定するだけでこのような 作業を行なわなくても良いのである。

再起動

下記でうまくいくと思ったのですが、 僕の環境ではうまくフロッピーから起動できませんでした。 うまくいくまではここは保留です。

ここまできたらいよいよ再起動できる。その前に、起動用フロッピーを作 成しておくと良いでしょう。フォーマットすみのFDをFDDにさして

# cd /usr/src/linux
# make bzdisk
	

とするとフロッピーに圧縮したOSをインストールしてくれます。 これをしたあとに、フロッピーを入れたまま再起動してみましょう。 うまく動けば、さらにフロッピーをぬいてうまくいくか再起動してみましょ う。うまくいかないようならば、古い方のkernelで再起動して 何度も再挑戦してみましょう。

もどる


Kenji Ohmori
Last modified: Tue May 31 01:58:43 JST 2005