Linuxカーネルの再構築


Linuxとは?

LinuxはOSです。
正確にはOSのカーネル(中心部)を指してそう呼びます。

最近はすっかり「リナックス」で通っているようですが、私が使い始めた頃(と言っても入れたり潰したりを繰り返していただけですが)、当時の本には「リヌクス」と呼ぶと書いてありました。しかし、実際は、呼び名がはっきりと決まっているわけではないようです。

「Linuxとは?」 とか 「PC-UNIXとは?」 といった事は、あえて私が説明しなくてもネット上に解説が豊富に存在するので、そちらを参照してください。
以下のサイトなどが一例です。

●PC-UNIXとは
http://www.myu.ac.jp/~hagi/unix/pcunix.html

●Linux とは
http://www.linux.or.jp/general/linux.html

●特集1 NTしか知らなくていいの?NTから見たLinux vol.01
http://linux.ascii24.com/linux/allascii/ntmag/1999/07/02/155328-000.html

●OSを選ぼう(笑)
http://www2k.novel.ac/~yaji/dosv/html/1008.htm



カーネルの再構築を行う理由は?
 別にOSインストール時のカーネルのままでもよいのですが、出来ることならハードウェア構成に適したカーネルを作り直したほうがBetterなわけです。カーネルのバージョン番号は3セクションに分かれていて、2.0.36 や2.2.19のようになっています。頭から「メジャーバージョン」、「パッチレベル」、「サブレベル」と呼びます。パッチレベルが偶数(0や2)のものが安定版で、奇数(1や3)のものが開発版です。奇数バージョンは一般の利用には適していません。
 再構築には2通りのパターンが考えられ、1つは、カーネルのバージョンを上げる場合、もう1つは、同バージョンで設定を変えてコンパイルし直す場合です。ここでは、後者の同バージョンで設定を変えた場合を取り上げています。ディストリビューションはPlamo Linux 1.41で2.0.36カーネルです。 2.0.x から2.2.x へといった異なるパッチレベルへのバージョンアップは、かなり煩雑な作業が必要となるため、避けた方が無難でしょう。

 同バージョンで設定を変える目的は、次の通りです。
■APM機能を効かせる、デュアルCPU対応にするなどの最適化。
■現在の使用環境に必要な機能だけに絞って、メモリの消費を抑える。

 カーネルのバージョンアップをする目的は、次の通りです。
■利用したいデバイスなどが現在のカーネルでサポートされていない。
■新カーネルでバグやセキュリティホールが解決している

このように、カーネルの再構築は運用上避けて通れないものと言えますが、逆に避けて通れるなら避けた方が良いものとも言えます。直接ネットに繋がっていない場合など、無理に手を加えないほうが良い場合もあります。



実際の作業上のポイント
 ここでも、詳細な説明は省くとして、実際に作業をしてみた結果、注意しておいた方が良い点を中心に話をしていきたいと思います。
 カーネルの再構築作業で、初心者が一番困るのは、大量のビルドオプション(設定項目)の意味がわからない、どのような設定にしたら良いのか迷う、と言ったことだと思います。こちら(http://www.linux.or.jp/JF/JFdocs/Configure.help/)のサイトは、日本語化したヘルプファイルをダウンロードできるようになっていますが、慣れていないと、Kernel Configurationのヘルプファイルを日本語で見る所まで漕ぎ着けるのは、かなり困難です(私の場合は、日本語ヘルプファイルに差し替えて、menuconfigを立ち上げたら文字化けしていました・・・面倒くさいので、そこであきらめましたが・・・)。ですので、できればビルドオプションが丁寧に解説されている書籍を探した方が良いかと思います。実際この作業に当たった2.0.36カーネルは、「Linuxインストールキット 第2版/株式会社トッパン」という書籍にパーフェクトなビルドオプションの解説が載っていました。
 それと、当たり前の事なのですが、カーネルのバージョンが上がるほど設定項目は増えて行くので、その点は覚悟しておいてください。また、旧バージョンと同じ設定項目なのにタイトルが変わってしまっている事が多分にあるので、ビルドしようとしているバージョンに見合った解説をさがしておいた方が良いでしょう(最新の2.4系などはネット上に解説があるようです)。
 以下は、私が実際に再構築をしてみた内容ですが、事前に注意した点が2つあります。

■「/usr/src/linux/include以下のヘッダファイル」を参照している「/usr/include以下のヘッダファイル」のシンボリックリンクを張りなおすというもので、下記のようにしろというものです。
# cd /usr/include
# rm -f asm linux scsi
# ln -s /usr/src/linux/include/asm-i386 asm
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi
しかし、これはカーネルのバージョンを更新した場合、念のため・・・というもので、今回はバージョンを更新していないので無視しました。

■同バージョンでカーネルを作り直す場合、”make modules_install”の前に/lib/modules/`uname -r`以下を削除しておけというものですが、(今回は)削除ではなくリネームしておきました(ドライバを残しておきたい為)。



 カーネルの再構築と言っても、コンパイル自体はコンピュータが勝手にやってくれるので、エラーで止まるかどうかなどをチェックしていれば良いわけです。その前にビルドオプションでカーネルに組み込む機能とドライバを指定する必要があり、Kernel Configurationという設定画面を呼び出す必要があります。設定の仕方には以下の3種類があり、今回は、menuconfigを使用しました。

■”make config”を実行する。
 コンソール上の設定で、対話形式で1項目づつ設定を進めていくわけですが、正直言って私は苦手なので使いません。多大な設定項目なのに全体が把握できない事により不安になるし(バージョンを上げる時はなお更)、わかる部分からやっていくといったことも出来ません。menuconfigやxconfigの方が楽なので、こちらはあまりおすすめしません。

■”make menuconfig”を実行する。
 こちらもコンソール上からの設定ですが、一昔前のPC-UNIX、特にFreeBSDやSlackwareのインストーラのような感覚で、比較的楽だと思います。”make config”の時と違って、全体が把握できるし、好きな所から設定していく事ができます。ただし、ncursesライブラリが必要となります。インストールされているかどうかは[# find / -name "ncurses" -print]で検索できます。

■”make xconfig”を実行する。
 X Window上から行う設定で、Wish(Tcl/Tk)が必要です。menuconfigと同じく楽な上に、見た目もきれいです。ただし、Wish以外に必要なものがインストールされていないと、やはり画面が立ち上がらないという事になるでしょう。そうなると初心者は、はまってしまう可能性があるので、menuconfigにした方が良いかもしれません。




main menu.gif (41468 バイト)
下記は、私が実際に選択したビルドオプションをWindows98上(Tera Term Pro)から眺めたものです。スクロールしないと見えない部分は張り合わせてあるので、実際とは違いますが、雰囲気はわかってもらえると思います。ちなみに今回初めて、カーネル再構築の最初から最後までの全てをWindows上から行いました。


Code maturity level options 画像サイズ=25.7KB
Loadable module support 画像サイズ=29.1KB
General setup 画像サイズ=35.1KB
Floppy, IDE, and other block devices 画像サイズ=53.7KB
Networking options 画像サイズ=56.7KB
SCSI support 画像サイズ=36.0KB
Networking device support 画像サイズ=102KB
ISDN subsystem 画像サイズ=23.7KB
CD-ROM drivers (not for SCSI or IDE/ATAPI device) 画像サイズ=25.9KB
Filesystems 画像サイズ=79.3KB
Character devices 画像サイズ=59.9KB
Sound 画像サイズ=23.6KB
Kernel hacking 画像サイズ=23.9KB


ダイヤルアップサーバとして使うので、ネットワーク関係の設定は特に重要です。ファイアウォールとしての設定などは不可欠ですが、<masquerding>は、今回アプリケーションレベル(PPxP)で行うので、カーネルレベルでは関係が無いという事でした(チェックはついていますが)。
 また、<PPP support>もモジュール化していますが、PPxPを使う場合には関係ありません。
 補足として、<ISDN support>は、ISDNカードに対する指定で、シリアル経由の日本のISDNには関係ないという事です。



実際の作業
 以前に参考書籍の内容をまとめ、実際にやってみて落とし穴になるような部分や、注意点についてチェックしておいたメモを残しました。それを大幅に改正したものが、下記の作業手順ですが、わずかに不明瞭な部分が残っていることはご了承ください。比較的古い、2.0系や2.2系のカーネルで再構築を行ったときの記録です。下記表のSlackware系はPlamo Linux 1.41(2.0.36kernel)、Plamo Linux 2.2(2.2.19kernel)での記録であり、RedHatはRedHat Linux 5.2(2.0.36kernel)、Vine Linux 1.1(2.0.36kernel)、Turbo Linux Server 6.0(2.2.13kernel)などで再構築を行ったときの記録です。ちなみにDebian Linuxではまだ再構築を行ったことはありません。

カーネルの再構築作業は[/usr/src/linux]に移動し、root権限で行います。

Slackware系

RedHat系

# make mrproper (古い作業ファイルの削除)

# make menuconfig

又は
# make xconfig

Kernel Configurationの設定を行う。
2.0.36等はAPMが効くようになる(RedHat系でも同じ事)。
 xconfig上では、ボタンがフリーズするなどのトラブルがあるかもしれないので注意する。


# make dep; make clean (依存関係のチェック、古い作業用ファイルの削除)

# make (実際のコンパイルの実行となっているが、「Linuxインストールキット 第2版」以外では見かけない操作)

# make modules (時間がかかる)
 エラーが出た場合は、bzImage(zImage)が/usr/src/linux/arch/i386/boot/に作られない。設定がおかしい場合は最初からやり直す。

※注 同バージョンで設定だけ変えた場合/lib/modules/`uname -r`以下削除。

# make modules_install (実際にドライバがインストールされる)

# depmod -a 2.0.36 ← 使用するバージョンに読み替える(やはり「Linuxインストールキット 第2版」以外では見かけない)。

※注 # make bzlilo等の前に/etc/lilo.confを確認し、問題がなければカーネルをインストールする。既存の/vmlinuzは/vmlinuz.oldに改名されるので、すでに/vmlinuz.oldが存在している場合は上書きされてしまう。既存の/System.mapは/System.oldになる。
# make bzlilo ← HDDへのインストール(時間がかかる、# make bzImage はLOADLINを使っている場合と言っている、やはり「Linuxインストールキット 第2版」だけの話)
# make bzdisk ← FDへのインストール
又は
# make zlilo(# make zdisk)
 ドライバを組み込み過ぎてカーネルが512Kバイト以上の時にはbz〜を実行する。z〜でエラーが出た場合次のようなメッセージが出る。
System is too big
make[1] : ***[zImage] Error 1







# make mrproper (古い作業ファイルの削除)

# make menuconfig

又は
# make xconfig

Kernel Configurationの設定を行う。
※注 SCSI driverはモジュールにしてRAM diskを使う。RedHat系の場合、initrdを使うのが一般的。<RAM Disk support>と<Initial RAM Disk support>の項はチェックする。<Loopback device support>もチェックする(モジュールの方がよい)。

# make dep; make clean (依存関係のチェック、古い作業用ファイルの削除)




# make modules (時間がかかる)
 エラーが出た場合は、bzImage(zImage)が/usr/src/linux/arch/i386/boot/に作られない。設定がおかしい場合は最初からやり直す。

※注 同バージョンで設定だけ変えた場合/lib/modules/`uname -r`以下削除。

# make modules_install (実際にドライバがインストールされる)








# make bzImage ← HDDへのインストール、Imageの頭文字だけ大文字(時間がかかる)。

# make bzdisk ← FDへのインストール
又は
# make zImage(# make zdisk)

# mkinitrd /boot/initrd-2.0.36.img 2.0.36 ← 使用するバージョンに読み替える(SCSI機器が無い場合、作らなくてよいと言っている)。
 ループバックデバイスがないと言われた場合、次のコマンドを実行。
# insmod /lib/modules/`uname -r`/block/loop.o
★★ loop.oが無い場合、最初からやり直す。

※注 /etc/lilo.confの確認。 → 新カーネルは、/boot/vmlinuzとなる。
# /sbin/installkernel 2.0.36 arch/i386/boot/bzImage(zImage) System.map ← 使用するバージョンに読み替える。
installkernel コマンドは2.2.xには無い?

Back