この作業でやりたいこと、というのはカーネルの再構築、ということになるが、そもそもなぜカーネルを再構築するかというと、今後、このマシンで次のような運用を行うためである。
ということで、新しいカーネルの設定は、以下の条件を備えていなければならない
カーネル本体を軽くするため、機能を「モジュール」に分離して必要なときにその都度ロードするという機能がLinuxカーネルには備わっている。ところが、モジュールをロードするためにはモジュールがあるディレクトリが読めないといけないので、起動時にルートファイルシステムをマウントするときに必要な機能はモジュール化されていてはいけないのである。
最近のLinux標準のファイルシステムであるext2と互換性が高いext3というファイルシステムもジャーナリング機能を備えているが、Reiserfsのほうが性能が高いということをどこかで読んだのでせっかくなのでこちらに挑戦したい。
iptablesとは、カーネル2.2系で使用されているipchainsよりも柔軟な設定が可能なパケットフィルタであり、2.4以降の機能である。
ということで、早速作業を開始したい
Debian GNU/Linuxの特徴は、すべてのソフトウェアがパッケージと呼ばれる形で提供されることである。で、なんとLinuxカーネル自体も何種類もカーネルパッケージとして用意されているということなので、どんなものがあるのか調べることにした。
パッケージ選択ツールに、「dselect」というプログラムがある。rootになって、
root@host# dselect
でメニュー画面が起動する。
「Select」メニュに入ると、驚くほどのパッケージがリストアップされ、スクロールするだけでも何分もかかるような状態に。さすがにすごい。で、適当に探していると「opt」の「base」セクションに「kernel-image-」で始まるパッケージがいくつもあるのを発見した。
大きく分けて、2.2.20カーネルと2.4.18カーネル、そしてノート用のpcmciaサポートのある、ないで4通りの系統があった。というわけでもちろん2.4.18の、pcmciaサポートなしバージョンの中から、PenII最適化されたものを選んでインストール。dselectでは、+キーを押してパッケージを選択してから、Installメニューでインストールする、という手順になる。
インストール中に、起動FDを作るかどうか、また、liloでMBRを更新するかどうか聞かれる。そのときに、lilo.confを編集するように勧められたので、一回中断して /etc/lilo.conf をエディタで編集しておく。
image=/vmlinuz
label=Linux
read-only
initrd=/initrd.img #この行を追加する
# restricted
# alias=1
再度「Install」するとダウンロード済みのパッケージからカーネルイメージなどがコピーされ、インストール完了。あとは再起動するだけで2.4.18カーネルが起動する(はず)。
さて、カーネルの入れ替えが無事に終了したら(うちでは無事に完了した。ちょっと感動)、そのカーネルが最初に挙げた条件を満たしているかどうかを確認してみる。1つでも満たしていない条件があったら別の方法を考えなければ。
というわけで、まずはRAIDサポートである。まずは、モジュールとしてRAIDっぽいのがいないか確認。raidという文字が含まれたモジュールが存在するかどうか確認するには、
root@host# modprobe -l *raid*
でいい。そしたらいくつか出てきてしまったので確認作業は即終了。あんまり期待していなかったけど、やっぱり自分でraidサポートを組み込んだカーネルを作らないといけないようだ。それにしても、一発でアウトとは…。
自分でカーネルを作るといっても、せっかくDebianなんだからDebian風にやってみた。
ということで結局自分でConfigを作ってカーネルを用意しなければならないということに。まずはカーネルのソースコードを入手しなければならない。普通にFTPして www.kernel.org あたりから取ってきてもいいんだけど、せっかくなのでこれもパッケージから取得することにした。またまた dselect して、kernel-image-2.4.18 を選択。一緒に解凍ツールやカーネルパッケージ作成ツールなどもインストールするように勧められ、もちろん一緒に選択、インストールする。
エラーは出なかったが、カーネルソースのインストールって結局どうなるの?と思い探していたら、/usr/src/ に kernel-source-2.4.18.tar.bz2 というファイルができているのを発見した。これのようだ。
解凍とカーネルオプションの選択は一般ユーザーで行うことにした。一般ユーザーに戻って、
user@host$ cd /usr/src/
user@host$ tar jxvf kernel-source-2.4.18.tar.bz2
で解凍できるはずだったのだが、ここではエラーが出た。一般ユーザーは /usr/src/ ディレクトリへの書込権限がないのだ。rootになって解凍するのも嫌だったので調べてみると、このディレクトリの所有者は root:src に設定されている。つまり、わざわざrootにならなくても、ソース管理に使う一般ユーザーをsrcグループに加えておけばいいということのようだ。とはいえ、ユーザー権限を変更するにはroot権限が必要だが。
root@host# usermod -G src user userというユーザーをsrcグループに加える
またまた一般ユーザーでログインして(一回ログアウトしないとグループの変更が反映されないらしい)、再度解凍を試みるとうまく解凍できた。
早速カーネルオプションを構成する。
user@host$ cd kernel-source-2.4.18
user@host$ make menuconfig
テキストのメニューが起動するので、あとは最初の条件に合うようなコンフィグを自分で選ぶ。USBやサウンド、プリンタポートのサポートなどの使用しないであろう機能をことごとく切って、RAID1、Reiserfsのサポートをモジュール化するではなくカーネルに直接組み込む。あと、NetFilter(iptables)関連の機能はすべてモジュール化しておいた。あとはほとんどデフォルトのままっていうかよく覚えてません(ぉ
カーネルオプションを構成したら、普通なら make dep などの手順を踏むことになるが、ここからはDebian流で。この設定でコンパイルされたカーネルパッケージを作成するのだ。
user@host$ su - rootになる
Password:
root@host# make-kpkg --revision=iserlohn.1.0 kernel-image
revisionには適当な識別子を入れておくと後で管理がしやすいかもしれない(自分はホスト名+バージョンにしてある。実際には、何度かカーネルオプションを調整したので、現在は1.4になっている)。ともあれ、このコマンドを実行すると、勝手にカーネルのコンパイルが始まり、終わったらそのまま自動的にカーネルイメージが作成される。
出来上がった.debファイルは他のパッケージと同じようにインストールできるというので驚きだ。rootで、
root@host# dpkg -i kernel-image-2.4.18_iserlohn.1.0_i386.deb
でOK。かなり感動モノだ。
ところが、このまま再起動すると起動途中にカーネルパニックを起こして起動出来なかった(ぉぃ 仕方がないのでレスキューディスクで起動してみる。何が悪いのか分からなかったので、とりあえずdselectで今まで入っていた2.4.18カーネルイメージをRemoveして、カスタムカーネルを再インストールしてみる。
すると、liloを実行する部分でエラーが発生した。カーネルファイル(/vmlinuz)が見つからないという。見ると、vmlinuzというファイルはあるが、これは実はシンボリックリンクで、そしてリンク先のファイルがなかった。
とりあえず無効なシンボリックリンクを削除
root@host# cd /
root@host# rm vmlinuz
カスタムカーネルイメージへのシンボリックリンクを作成
root@host# ln -s /boot/vmlinuz-2.4.8-686 vmlinuz
liloを再実行してブートレコードを編集
root@host# lilo
今度はエラーが出なかったので再起動
root@host# shutdown -r now
これでめでたく自分のコンフィグが反映されたカーネルで起動できるようになった。このカーネルの作成目的の、ソフトウェアRAIDの構築などは、また後日。