Linuxカーネルの再構築方法@Debian Squeeze

squeezeデフォルトのカーネルだとバギーだったので、kernel.orgの2.6.39を試してみた。
ついでに解説じみたものを書いてみたけど、あまり自信がないので何か間違っていたら適宜ツッコミよろしくお願いします。

まえがき

ブート時には、ブートローダが/bootにあるカーネルをまず読む。その後、カーネルはルートファイルシステムをマウントを行おうとする。このとき、ルートファイルシステムを直接マウントする場合と、一旦initramfsと呼ばれるものをメモリ上に展開し、それをマウントしてからルートファイルシステムのマウントを実行しようとする場合とがある。

なんでinitramfsは面倒なことやってるん?て話になるんだけど、ぶっちゃけブートできりゃどっちでもいい。ただ、システム構成に変更が多々加わる環境だと、その度にkernelを作り変えなければならない前者は手間。一方、イメージファイルの中にカーネルモジュール一つ仕込んでやれば良いinitramfsの手法は楽。
また、起動時、デバイスが起きてくる前の段階でスクリプトを仕込んで何かごそごそと怪しい事を行うのにはinitramfsの方が良い。昔はinitrdと読んでいた。

で、initramfs作るのは手動でもできるんだけど、DebianとかUbuntuで使われてるモダンなパッケージ管理システムは、必要に応じてinitramfsに手を加える。だから、作成したカーネルなりカーネルモジュールなりが含まれたinitramfs=カーネルイメージも、パッケージ管理システムの管理下に置いたほうがいい。
だから今回は、debian流のkernelのビルド方法――つまり、initramfsを作り、そのinitramfsをパッケージ管理システムが読めるdebファイルの中に入れてやる。なお、やり方は殆ど全自動。ビルドする時間掛かるだけなので、コーヒーでも飲んで待ってて下さい。

さて、やるか。

カーネルイメージ・パッケージの作成は、一般ユーザでも可能。fakerootというコマンドを使って、擬似的にroot的な環境を作り、その中でビルドを行うため、root権限は必要ない*1

パッケージインストール

以下のパッケージをインストール。

aptitude install fakeroot kernel-package libncurses5-dev

kernel-packageはカーネルのビルドに使うユーティリティ。vanillaカーネル(kernel.orgの純正kernel)を作る時にも使えって、http://www.debian.org/releases/stable/i386/ch08s06.html.ja:debianの中の人が言ってた!

ビルド&パッケージ作成

コマンドでdebパッケージを作成。

CONCURRENCY_LEVEL=5 fakeroot make-kpkg --initrd kernel_image

CONCURRENCY_LEVELはカーネルをビルドする時のスレッド数。コア数+1が良いって昔聞いたんだけど、実際の所どうなんですかね?

パッケージインストール

さて、パッケージ管理システムに食わせてインストールしましょう。先ほど作成したカーネルイメージは、ビルドを行なったディレクトリの「一つ上」に作成されている。それっぽいの探す。
次のコマンドでぽちっとな!root権限必須。

# dpkg -i "作成したカーネルイメージの名前"

今回私はこんな感じ。

$ sudo dpkg -i ../linux-image-2.6.39.4_2.6.39.4-10.00.Custom_amd64.deb

ね、簡単でしょ?

再起動

インストールが終わったら、後は再起動するだけ。

# reboot

grubでは、新しい名前のカーネルでブートするようになっているはず。バックアップとして、旧カーネルでのブートもできるように選択肢が残っている。
問題がなければちゃんとブートしてくれるはず。ブートシなかったら、grubの画面で旧カーネルを選択し、そちらからブート。

ログインしたら、ちゃんとカーネルが刺し変わっているか確認。

$ uname -a
Linux omoikane 2.6.39.4 #1 SMP Fri Aug 5 09:42:15 JST 2011 x86_64 GNU/Linux

やったね☆

8/7

冒頭部の説明が間違っていたので、修正。