差し替え用のカーネルの作り方

現状のdebianカーネルはlenny(次期stable)まで調べた範囲では、2.6.18がベースになっています。
しかし、2.6.18は、最新のハードウェアへの対応が相当手薄です。
実際の最新カーネルソースは現在(2007.10.12)で2.6.23です。こちらであれば、core2-duoほか、新しいサウスブリッジのICH9やrealtekの1000〜10000Mネットワークカード、新しいGPU等に対応しています。
したがって、新しいハードを使ったPCの場合は、debian-stableやtestingではカーネルがうまくない場合が多いことになります。


そこで、最新カーネルソースをコンパイルして最新カーネルインストーラのブートカーネル及びインストールするカーネルを差し替える方法を以下に示したいと思います。

手順概要

対象ディストリビューションdebianなのですから、カーネルインストール用のdebパッケージを作成すればいいことになります。
カーネルdebパッケージ作成には、以下のものが必要です。
最新カーネルソース:当たり前ですね。
カーネル作成用パッケージ:kernel-package
これをコンパイルしてdebファイルをつくり、実際にインストーラー作成マシンにインストールするとカーネルとinitrdが作られますので、これをインストールメディアに書き込めばOKです。


さて、実際の使い方は次の通りです。

最新カーネルソース取得

真のカーネルの最新情報はhttp://www.kernel.org/にあるのですが、ここはそんなに速くないし、そもそも総本山からダウンロードは避けるべきです。
ringを探すのが一番でしょう。
今回は、こちらhttp://ring.nict.go.jp/archives/linux/kernel.org/kernel/v2.6/からダウンしました。
バージョンは上記の通り2.6.23で、linux-2.6.23.tar.bz2というファイル名ですね。
近頃のカーネルソースは非常に容量が大きいです。まぁ、対象となっているハードウェアが多くなっていて、機能も豊富なので仕方ありませんが、43MBって、すごい大きさですね。展開すると100MBを楽々越えます。
コンパイル環境を揃えるのも一苦労ですね。

ソースの解凍とconfig

どこかコンパイルしてもいいディレクトリに展開します。bz2イメージなので、以下のコマンドが簡単でしょう。(gnu-tarでないとjオプションはありませんので、ご注意ください。)
$ tar jxf linux-2.6.23.tar.bz2
展開している中身が見たい人はvオプションもつけてください。
次にconfig作業を行います。trillimicはnursesベースのmenuconfigが好きなので、これでやってます。
$ cd linux-2.6.23
$ make menuconfig
必要なデバイスをモジュールまたはカーネル組み込みで指定していきます。
ブートするときにinitrd以降でマウントするディスクのファイルシステムは、ブートカーネルカーネル組み込みされていないとマウントできず、rootイメージに切り替わるところでpanicしますので、ご注意ください。(経験済み:2時間ぐらい悩みました。)

コンパイル

いよいよコンパイルですが、最後のdebファイルの作成はスーパーユーザでないとできないみたいなので、以下のようにsudoで行います。
今回はinitrdでないと、とても収まり切れそうもない大きなカーネルとルートファイルシステムになりそうですので、initrdのオプションもつけます。
$ sudo make-kpkg --initrd kernel_image
あとは自動的にカーネルパッケージができます。パッケージ名を工夫したいときは、--revisionオプションを使ってください。

インストール

インストールは簡単です。
$ sudo dpkg -i linux-image-2.6.23_2.6.23-10.00.Custom_i386.deb
で、質問が出たら適当に答えてください。再インストールか現行動作カーネルと同じバージョンでなければ質問は出ないはずです。
grubを使っている場合は、grubのmenu.lstも編集してくれます。よくできてますね。