Linux kernelを構築するためには、まずkernelの設定を行います。
kernelのソースがある/usr/src/linux/に移動し、そこで設定をします。
Linuxでは、以下の3つの方法があります。
make configは最もオーソドックスな設定コマンドで、どんな環境でも利用出来
ます。
カーネルの設定について1つ1つ[y/n]で回答する形式の問答が続いて、
カーネルの設定を行います。
カーネルの隅々までよく知っている場合は手軽ですが、普通の人には、
つらいものがあります。
以前のバージョンの.configファイルを雛形として利用していて、
以前のバージョンと今のバージョンの差分の所だけを取り出して設定したい
場合には、
makeoldconfigを代わりに利用することができます。
ユーザインターフェースはmake configと全く同じですが、以前の
バージョンで設定されているところはSkipされて、
新しい項目だけ回答を求められます。
通常は、make menuconfigを使うほうが良いです。
ncursesというパッケージを導入してある環境ならば、
どんな環境でも利用出来ます。
インターフェースは、メニューが表示されて選択する形式です。
カスタマイズの必要がないときは、これで一旦開いて、何も変更せずに
セーブすれば、
.configファイルが作成されます。
X Window Systemが使える環境で、tcl/tkが導入されていれば、利用できます。
pwでは、3つの方法全て実行できましたが、ここでは、make menuconfigを使って
説明します。
rootになり、/usr/src/linuxでコマンドを打つと、
[root@pw019 ~]% make xconfig
このような画面が出てきて、設定したい項目を選択し、設定していきます。
今回は、実験Level3で設定するKernel hackingの項目を変更し、saveします。
すると、/usr/src/linux/に.configが出来上がります。
カスタマイズが終わったら、その変更をカーネルツリー全体に反映させます。
以下のコマンドを続けて入力します。
[root@pw019 ~]% make dep [root@pw019 ~]% make clean
make depは、カーネルソース中に相互依存ツリーを構築します。
これらの相互依存は設定時に選んだオプションに影響されます。
make clianは、以前のカーネルの構築時から残っていて、現在は必要でない
ファイルを取り除きます。
次に、カーネル本体をmakeします。
[root@pw019 ~]% make bzImage [root@pw019 ~]% /sbin/installkernel 2.4.27.new arch/i386/boot/bzImageSystem.map
make bzImageを実行すると、vmlinuxとSystem.mapとarch/i386/boot/bzImage
が作成されます。
vmlinuxとarch/i386/boot/bzImageは、カーネル本体(カーネルイメージ)です。
vmlinuxは非圧縮のもので、bzImageの方が圧縮されたものです。
通常は、bzImageの方が使われます。
System.mapは、vmlinuxからsymbol情報を取り出したものです。
symbolとは、c言語のオブジェクトファイルのsymbolです。
つまり、System.mapは、カーネルが利用できるモジュールについての情報が
格納されたファイルと考えられます。
/sbin/installkernelを実行すると、arch/i386/boot/bzImageを
vmlinux-2.4.27.newに改名し/boot/に置きます。
リブート時にはこれを読み込みます。
カーネル本体をmakeしたら、モジュールをmakeします。
[root@pw019 ~]% make modules
ここまでできたら、後はインストールするだけです。
[root@pw019 ~]% make modules_install [root@pw019 ~]% make install
make modules_installを実行すると、/lib/modules/'リリース'以下にモジュー ルが展開されます。
最後に、ブート時の変更をします。/etc/のlilo.confを書き換えます。
lilo.confは以下の様になっています。
[root@pw019 /etc]%cat lilo.conf prompt timeout=50 default=linux boot=/dev/hda map=/boot/map install=menu message=/boot/message image=/boot/vmlinuz-2.4.26-0vl15 label=linux initrd=/boot/initrd-2.4.26-0vl15.img read-only root=/dev/hda1 append=" resume2=swap:/dev/hda2"
これを以下の様に変更します。
[root@pw019 /etc]% cat lilo.conf prompt timeout=50 default=new boot=/dev/hda map=/boot/map install=menu message=/boot/message image=/boot/vmlinuz-2.4.27.new label=new read-only root=/dev/hda1 append=" resume2=swap:/dev/hda2"
変更点は、defaultとlabelの名前を変更しています。
起動時に変更されているかこれで確認できます。
次に、imageを新しく作ったものに変更し、これを読み込ませます。
ここでは、vmlinuz-2.4.26-0vl15からvmlinux-2.4.27.newに変更し、
読み込ませています。
そして、initrdの行を削除しています。
これは、initrdで読みこまれるファイルを見つけることが出来なかったからです。
これでブート時の変更は終わりです。後は、この変更を反映されるように、
[root@pw019 /etc]% /sbin/lilo -v
として、エラーが無ければ終わりです。
これで、変更は終了しましたので、リブートしてみます。
[root@pw019 ~]% reboot
これで正しく起動されればkernelの再構築は終了です。
kernelが正しく動いている証拠として、linuxのバージョンを調べてみると、
[root@pw019 ~]% uname -r 2.4.27-0vl7
となり、他のpwのバージョンが2.4.26から、正しく実行されたことが分かります。
このLevel1の実験は相当苦労しました。kernelを構築すると、
pwが壊れる可能性があったので、他のLevelから実験することにしましたが、
他の実験(Level2以外)全て、kernelを再構築しなければ出来ないことが分かり、
とても時間をロスしました。
逆に、Level1が出来ると、他のLevelはスムーズに出来ました。
最初は恐ろしく思える実験ですが、実際に実行してみると
案外簡単な実験であることが分かりました。