カーネルの再構築(リビルド)

作成:

さて、前回カーネルをアップデートしたわけですが、それは既に用意されているカーネルをそのままインストールしただけです。 今度はそれをカスタマイズしてみたいと思います。

カーネルのリビルドは、カーネルのビルドオプションを設定し、ビルドを行います。 ソースコード自体はさわらないものの、カーネルの実行ファイルや各種ドライバなどのライブラリを 作り上げる課程に手を加える作業です。
これは、自分の用途にあった設定をすることでパフォーマンスをあげたり、 それまでなかった機能を追加したりするために行います。
業務用に使う場合、限られた資源を最大限生かすため必ず行わないといけない(コストを気にしないのなら必要ないが)ものです。 場合によってはビルドオプションのカスタマイズだけではなく、カーネルのソース自体を修正したりもします。
しかし、個人のホビー用途では汎用的な、既に用意されているカーネルで十分実用できます。 というより、資源をぎりぎりいっぱいまで使うようなことはほとんどないので、あまり意味がありません。
逆に、十分な知識なしにこれを行うと、かえってパフォーマンスが悪化したり、 場合によっては起動すらできなくなってしまったり、突然予期しないエラーが発生したりする危険なものです。

それを、なぜあえてやるか、
やってみたいからです(笑)

とはいえ、いくら個人のものとは言えサーバーに使おうというのですから、下手にいじれません。
リビルドの解説には、分からない部分はいじらないことが鉄則、と書いてあるぐらいです。
というわけで、CPUへの最適化程度にとどめておきたいと思います。

カーネルのコンフィギュレーション

まずは/usr/src/linuxに移動します。
このディレクトリは現在のカーネルのバージョンのソースが入っているディレクトリのシンボリックリンクになっています。 私の環境の場合/usr/src/linux-2.2.19のシンボリックリンクになっています。
そこで、このディレクトリに入った後カーネルのコンフィギュレーションを行うため 「make」を「menuconfig」オプションで実行します。
「menuconfig」はコンソールで使えるGUI風のコンフィギュレーションツールです。
X Windowシステムが動いているなら「xconfig」とすればXを使ったGUIのコンフィギュレーションツールが起動します。
どちらでもやることは一緒です。

# cd /usr/src/linux
# make menuconfig
画面1:menuconfig

すると右のような画面になります。
左右でselectを選択し、上下で項目を移動しEnterキーで選択します。
設定項目の種類には2つあります。一つは[ ]で囲まれているもの、これは2択です。
[*]:モジュールを組み込む、設定を有効にする
[ ]:モジュールを組み込まない、設定を無効にする。

もう一つは< >で囲まれているものこれは3択です。
<*>:モジュールをカーネルに組み込む
< >:モジュールを無効にする
<M>:ローダブルモジュールとして組み込む(ローダブルモジュールをサポートしているときだけ)
ローダブルモジュールとは必要になったときだけに呼び出されるモジュールです。
たまにしか必要でないモジュールはこうしておくと カーネルを小さくすることができ、よけいなハードウェア資源を消費しないですみます。
逆に常に使うようなモジュールをこのようにすると 使用するたびに読み出さないといけないのでパフォーマンスが低下してしまいます。

これらの設定は項目を選択しスペースキーを押すと設定状態が順に変化します。 他にYキーでオン、Nキーでオフ、Mキーでローダブルモジュールの設定にできます。

この設定項目の説明はこのディレクトリのDocumentation/Configre.helpに詳しくかかれています。 Vine Linuxの場合、このファイルはConfigure.help-2.2.19.jaのシンボリックリンクになっていて 既に日本語化されています。英語のヘルプはConfigure.help.enというファイルになっています。
もし、日本語化されたドキュメントがない場合 (http://www.linux.or.jp/JF/) に様々なバージョンのカーネルのConfigure.helpが日本語化され置いてありますので、これを利用するといいでしょう。

今回はCPUの最適化だけにとどめておくつもりなので (マニュアル読むの面倒だし、下手にさわっておかしくなったら困るから。「じゃあやるな」とか言わないように)
Processor type and feature --> Processor family -->で選択肢は
386
486/Cx486
586/K5/5x86/6x86
Pentium/K6/TSC/CyrixIII
PPro/6x86MX
があって、はじめは386が選択されています。そこで自分のCPUにあった項目を選択します。 私の場合は「Pentium/K6/TSC/CyrixIII」を選択しました。

とりあえずここで終了、Exitを選択してEnterキーを押します。

すると「Do you wish to save your new kernel configuration?」と聞いてくるのでyesを選択します。

Saving your kernel configuration...

*** End of Linux kernel configuration.
*** Check the top-level Makefile for additional configuration.
*** Next, you must run 'make dep'.

これで先ほどの設定がセーブされました。

次に「make dep」しろってかいてありますが、 その前にバージョンを書き換えるためにMakefileを編集します。(本来はこっちが先かな?)
このファイルの頭に下のような事がかかれています。

VERSION = 2
PATCHLEVEL = 2
SUBLEVEL = 19
EXTRAVERSION = -0vl0.23

これはカーネルのバージョンを示しています。
カーネルのコンフィギュレーションを行う場合EXTRAVERSIONを変更します。
現在ついている-0vl0.23はVine Linux独自の番号です。(vlはおそらくVine Linuxのこと)
単純に1増やして-0vl0.24としてもいいのですが Vine Linuxの今後のバージョンとかぶるとやっかいな場合もあるので独自の番号を付けてやります。
私の場合、私の名前から1字とって-r0としました。
イニシャル+番号とか日付とかから適当な番号を付けてください。

カーネルのビルド&インストール

これがすんだら早速リビルドの開始です。
この後する作業は

make dep各ソースの依存関係の更新(.dependファイルの更新)
make clean中間ファイルなどの削除
make bzImageカーネルをビルドしbzImageというカーネルファイルを作成
make modulesローダブルモジュールのビルド
make modules_installローダブルモジュールのインストール

となります、一つずつ実行してもいいのですが、いっぺんにやることもできます。

# make dep clean bzImage modules modules_install

かなりの時間がかかります。(私の場合実行した後ほっといただけで時間は計っていませんが30分程度で終わったと思います)
もし途中でエラーが出て止まってしまった場合は、もう一度設定を見直してください。
コンフィギュレーションツールの設定は.configというファイルにセーブされているので、 1からやり直したい場合、こいつを削除すると、デフォルトから設定ができます。

次にinitrdというファイル(起動時に読み込む暫定的なRAMディスクの内容を収録したイメージファイル)を作成します。

# mkinitrd /boot/initrd-2.2.19-r0.img 2.2.19-r0

2.2.19-r0はこのカーネルのバージョンなので適宜読み替えてください。
次に作成したカーネルを/bootにインストールします。
これにも専用のスクリプトが用意されているのでそれを利用するのですが、 こいつは一緒にliloも書き換えてくれるので(というよりただ内部で/sbin/liloと実行してるだけ) 先にliloを書き換えておきます。
これは前回と同様です。

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
append="apm=on"
lba32
default=linux

image=/boot/vmlinuz-2.2.19-r0
        label=linux
        read-only
        root=/dev/hda1
        append="ide0=0xd000,0xd402 ide1=0xd800,0xdc02"

image=/boot/vmlinuz-2.2.18-0vl4.2
        label=old
        read-only
        root=/dev/hda1
        append="ide0=0xd000,0xd402 ide1=0xd800,0xdc02"

そしてカーネルのインストール

# installkernel 2.2.19-r0 /usr/src/linux/arch/i386/boot/bzImage /usr/src/li
nux/System.map
bzImage  /usr/src/linux/System.map
Added linux *
Added old

2.2.19-r0は同様にこのカーネルのバージョン、
ファイル名の指定は別にフルパスでなくてもいいので適当に省略してください。
これで一連の作業は終了です。
再起動してください。

# reboot

うまく起動できたでしょうか?