kernelを再構築する

linux kernelの最新版は2.6.33である。
ReadHatやCentOS、Fedoraなどのディストリビューションにおいてカーネルをバージョンアップするなら間違いなく yum update kernelをするだろう。今までもそうしてきて困ったことはない。
しかしながら、LPIC試験対策ということもあり、CentOS(kernel 2.6.9)においてバニラカーネルを使って再構築をした奮闘記について記録しておきたい。今後も再構築するなんてことはほとんどないと思われるが。。。(笑
まずは、最新バージョン(2.6.33)を使っていきなり再構築してみた。
make oldconfigコマンドを実行すると新機能が多すぎるのか、やたら質問攻めにされ、すべてEnterキーで回避した。ところが、makeコマンドの結果次のようになってエラーになってしまった。

CC [M] drivers/message/fusion/mptsas.o
drivers/message/fusion/mptsas.c: In function `mptsas_port_delete’:
drivers/message/fusion/mptsas.c:106: sorry, unimplemented: inlining failed in call to ‘mptsas_set_rphy’: function body not available
drivers/message/fusion/mptsas.c:462: sorry, unimplemented: called from here
make[3]: *** [drivers/message/fusion/mptsas.o] Error 1
make[2]: *** [drivers/message/fusion] Error 2
make[1]: *** [drivers/message] Error 2
make: *** [drivers] Error 2

http://mekaananth.blogspot.com/2009/09/how-to-compile-linux-kernel-2631.htmlにあるようにどうやらmptsas.cがバグっているらしい。mptsas_set_rphy関数の実態の場所を変えて再度makeしてみたが、

LD .tmp_vmlinux1
drivers/built-in.o(.init.text+0x3bce): In function `con_init’:
include/trace/events/kmem.h:81: undefined reference to `.L1496′
make: *** [.tmp_vmlinux1] Error 1

コードを変更してもうまくいかなかったので、あきらめた。
次に2.6.30.10のソースを入手して同様にmakeしてみたが、これもうまくいかなかった。

ERROR: “.L193” [drivers/usb/serial/kl5kusb105.ko] undefined!
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2

だめもとで、2.6.10を入手して同様にやってみたところ、問題なくコンパイルできた。
make oldconfig時に聞いてくる項目がなかった。
次に2.6.20を入手して同様にやってみたところ、問題なくコンパイルでき、2.6.10と同様にmake oldconfig時に聞いてくる項目がなかった。
ただ、問題なくコンパイルできたはずだったのだが、再起動したらなぜか2.6.10が起動してしまう。調べてみたら、/etc/grub.confには設定がされていたもののdefaultが0から1に変更されており2.6.10が起動してしまうことが分かった。
default設定を変更して、2.6.20を起動させたが、pcnet32がないので、eth0の起動に失敗していた。
lsmodをしても一切モジュールがロードされておらず、
/lib/modules/2.6.20/kernel/
の中身は空っぽだった。
どうやら make oldconfigをすると
.configファイルが
CONFIG_PCNET32=m
から
CONFIG_PCNET32 is not set
に変更されてしまうなどモジュール設定が正しく引き継がれない(理由はよくわからないが)ようだったので、2.6.10の.configファイルをコピーしてきて、make menuconfigからGUI画面を呼び出したうえで、.configファイルを読み込ませてそのまま保存した。
その上で、
make
make modules_install
として /lib/modules/2.6.20/kernel/ をみると
正しくモジュールが入っているようだったので、
make install
を実行して、再起動して、2.6.20まで構築することができた。
カーネルをコンパイルするのに仮想環境ということもあり1時間程度かかってしまう。次の機会に 2.6.20 から 2.6.33 まであげてみたいと思う。