俺流! カーネルの再構築手順

これは、私流の Linux kernel 再構築手順です。
私なりの工夫が入っているため、他のサイトで紹介されている手順より、 多少繁雑に見えるかも知れません。
対象は Plamo Linux 4.x をインストールした直後の状態で、ブートローダ として grub を前提にしています。一応安全性を多少は考慮しているつもりです。 参考になれば幸いです。

松本 徳真 < matsu@netfort.gr.jp >


前準備(ブートローダ grub の設定)

ブートローダとしてgrubを使用する場合、ブート時にカーネルを選択したり する事が出来ます。カーネル再構築→テスト→再構築→テストを繰り返す 時は、以下のような設定をしておくと、カーネルをメニューで選択できて 少し便利かも知れません。

/etc/grub.conf を書き換えます。私は次のような /etc/grub.conf を 使用しています。参考にして下さい。
この設定はそのまま使用してはいけません。(hd0,0), /dev/hda1 の部分 は、環境によって異なるからです。
まず、/etc/grub.conf のバックアップを作成します。

# cp -a /etc/grub.conf /etc/grub.conf.orig

次に /etc/grub.conf を編集します。
splashimage の行はもともとあった grub.conf と同じにして下さい。 (hd0,0), /dev/hda1 の部分も、もともとあった grub.conf と同じ になるように注意して下さい。
title の行はgrubのメニュー選択時に表示される物ですので、好きに 書いて構いません。私の例では "Plamo Linux 4.0" とありますが、 他のバージョンを使用している場合など、 臨機応変に対応して下さい。timeout の値は自由に設定して下さい。 私の例では、Plamo のデフォルトより短めになっています。あまり 短くしすぎると泣きを見ます。
もともとあった grub.conf との大きな違いは、vmlinuz, vmlinuz.test, vmlinuz.orig という 3種類のカーネルをメニューで選択して起動できる ようにしてあることです。
準備が出来れば再起動します。自信が無い場合は Plamo Linux の install 時の 最後の方で 作成した起動ディスク(レスキューディスク)を手元に準備して下さい。 再起動に失敗した場合は、起動ディスクで起動した後、

# cp /etc/grub.conf.orig /etc/grub.conf

でもとに戻るはずです。

前準備(カーネルの保存)

# cd /
# cp -a vmlinuz vmlinuz.orig
# chmod a-w vmlinuz.orig

これで、今使っている /vmlinuz というカーネルを /vmlinuz.orig にコピー しました。今後、vmlinuz は、新しいカーネルで書き換えるのですが、 vmlinuz.orig と言うファイルを大切に保存しておけば、grub のメニューで "Plamo Linux 4.0 (orig)" を選択する事で、Plamo Linux インストール直後の カーネルの状態に戻す事が出来る訳です。
次に、ドライバモジュール類も間違って消さないように、読み込み専用に変更 しておきましょう。

# chmod -R a-w /lib/modules/`uname -r`

ここで、uname -r は、カーネルのバージョンを表示するコマンドです。 カーネルのバージョンが 2.4.22 の場合は、2.4.22 と表示します。 Plamo linux 4.0 では、インストール直後は、2.4.26-plamo のはずです。 この場合、シェルでは、 /lib/modules/`uname -r` は、/lib/modules/2.4.26-plamo を表します。
それでは、念のために、再起動して、 "Plamo Linux 4.0 (orig)" を選択しても無事に起動する事を確認しておいた 方が良いでしょう。

カーネルソースの準備。

Plamo Linux インストール時に既に用意されているカーネルソースを利用 するなら何もする必要はありません。
ちょっと新しいカーネル linux-2.6.7.tar.bz2 を使用したいという 場合は展開して /usr/src/linux にシンボリックリンクを張って下さい。

# cd /usr/src
# rm linux
# tar jxf linux-2.6.7.tar.bz2
# ln -s linux-2.6.7 linux

バージョン番号の変更

/usr/src/linux/Makefile を編集します。このファイルの先頭に
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 7
EXTRAVERSION =

という部分があります。この EXTRAVERSION の部分を

EXTRAVERSION = -matsu01

の様に書き換えるのです。私は、このカーネルを使用するマシンの host名と、 番号で構成しています。また、カーネルの設定を大きく変更する毎に、数字の 部分を大きくしています。その他の部分は絶対に変更しないで下さい。
このように作成した、カーネルで起動して uname -r で、カーネルバージョン を見ると 2.6.7-matsu01 となります。ちょっと恰好いいでしょう?
実は、このようにして module として作成されたドライバは、 /lib/modules/2.6.7-matsu01/ にインストールされます。
Plamo Linux 4.0 インストール時のカーネルモジュールは /lib/modules/2.4.26-plamo/ にインストールされています。もし、Plamo 付属のソースでカーネル再構築する場合に、
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 26
EXTRAVERSION = -plamo

とあるのを、
EXTRAVERSION = -matsu01

の様に変更しておく事で、インストール時に用意されたモジュール類を破壊 せずに済む訳です。
カーネル再構築は、一発で理想のカーネルになることは普通考えられません。 それまで、古いカーネルや、モジュールは必要なわけです。また、何か問題が 発生した時、一度古いカーネルに戻してテストする事は、問題の切り分けの ためにも重要です。時々、古いモジュールを削除するような指示がなされる 事がありますが、インストール時に用意されたカーネルとモジュールは、 絶対に消さないと言う心構えでいましょう。
ちょっと長くなってしまいましたが、このような工夫をする事で、 grubのメニューで "Plamo Linux 4.0 (orig)" を選べば、いつでもインストール 直後のカーネルとモジュールの状態に戻せる訳です。

カーネルの設定。

# cd /usr/src/linux
# make mrproper
# make include/asm ## 2.6.x のみ
# make menuconfig

で、カーネルの設定を行います。各項目については、参考になる 資料がたくさん(本当か??)あるでしょうし、私の手に余ります ので省略します。
make menuconfig では、 .config を読み込んで、 それをデフォルトの 設定として使用します。そして、新しい設定を反映した .config を出力 します。.config は、make mrproper で削除されます。設定が終ると、

# cd /usr/src/linux
# cp .config config-20040731

のように、別ファイルにして保存しておくと良いでしょう。Plamo Linux の デフォルトカーネルの設定は、 /boot/config にあります( 注: 3.2 以前は、 /usr/src/linux/plamoconfig )。
# cd /usr/src/linux
# make mrproper
# make include/asm ## 2.6.x のみ
# cp /boot/config .config
# make menuconfig

とすると、Plamo Linux 提供の標準設定のカーネルになるはずです。これを 元に、不要なものを削ったり、必要なものを追加したりすると良いでしょう。 一度にたくさんの変更をしない方が無難です。問題が発生した時、何処を変更 した時に問題が発生したのか分かりにくいからです。
ここでは、カーネルの設定に、make menuconfig を使用しましたが、 異なるバージョン用の .config をコピーして来た時は、make oldconfig を 使用する事で、新たに追加された項目についてのみ質問があります。 make oldconfig で、追加項目の確認、その後で make menuconfig で細かい 設定という手順が良いと思います。また、2.4.x の .config を、2.6.x で 使おうとすると、ある程度知識が無いとはまります。このような場合は、 デフォルトのカーネルからスタートした方が良い事もあります。

カーネルのビルド

# cd /usr/src/linux
# make dep clean ## 2.4.x のみ
# make bzImage
# make modules
# make modules_isntall

以上でカーネルの再構築、モジュールノコンパイル、モジュールのインストールが 出来たはずです。再構築されたカーネルは、 /usr/src/linux/arch/i386/boot/bzImage です(PC/AT 互換機の場合)。

# cd /usr/src/linux
# cp arch/i386/boot/bzImage /vmlinuz.test

としてやれば出来上がりです。次回起動時に grub のメニューで、 "Plamo Linux 4.0 (testing)" を選んでやれば新しいカーネルで起動します。 もし不都合があれば "Plamo Linux 4.0 (orig)" や "Plamo Linux 4.0" を選べば元の状態で起動出来ます。
もし満足なカーネルが出来上がったなら、vmlinuz.test から vmlinuz に昇格 させてやれば、grub で選択しなかった時デフォルトで起動するカーネルにな ります。 もし問題のあるカーネルが出来上がった場合は、"カーネルの設定。" に戻って やり直しとなります。この際はもう make mrproper を実行する必要はありま せん。
2回目以降のカーネルのモジュールを作成する前に、古いモジュールを削除して おく必要があります。

# rm -rf /lib/modules/2.4.26-matsu01

この時オリジナルの /lib/modules/2.4.26-plamo を間違って削除しないように十分に 注意をして下さい。また、EXTRAVERSION を変更した直後はこの作業は必要 ありません。

# cd /usr/src/linux
# make menuconfig
# make dep clean ## 2.4.x のみ
# make bzImage
# make modules
# make modules_isntall
# cp arch/i386/boot/bzImage /vmlinuz.test

そして再起動を繰り返しながら望む kernel を探し求める事になるでしょう。 素敵なカーネルに出会えたら .config を保存しておく事と、EXTRAVERSION の 番号を変えておく事をお忘れ無く。

最後に

ここで、紹介した手順の意図を理解できれば、もうカーネルの再構築は恐く ありません。どんどんカーネルを再構築して下さい。
とはいえ、無事にカーネルが起動し、ファイルシステムをマウントした後で カーネルパニック、ハングアップした場合は、無傷でいられる訳ではありません。 過去に、特定の条件の下で、ファイルシステムを破壊するカーネルも存在しま した。よって、開発版カーネルを追っかけたり、怪しいパッチをテストする ための環境にするには、もう少し工夫しなければなりません。


このページに関する、ご意見、感想、苦情はこちらまで 松本 徳真 / matsu@netfort.gr.jp