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が良いって昔聞いたんだけど、実際の所どうなんですかね?
8/7
冒頭部の説明が間違っていたので、修正。