カーネル2.6のコンフィグレーション
カーネル関連の開発に携わっている開発者たちの間では、DebianやSlackwareベースのディストリビューションを使う事が多いようだが、Redhat系のパッケージに開発用カーネルをインストールして評価する事も可能である。ここではRedhat8 / 9の環境に、開発用カーネルを評価目的のために、インストールするためのヒントと関連する情報を紹介する。
本稿の趣旨としては、Redhatへのインストール手順を紹介しながら、2.5/2.6系カーネルでのカーネル・コンフィグレーションやデバイスドライバの変更点を示す事であって、「使用に耐えうる2.6系カーネル・システムのインストール方法」ではない事にご注意願いたい。この手順に従ってインストールしたシステムは不完全なものであり、利用に関しては各自の責任でお願いするほか、インストール手順に関しても、初心者向けのHOWTOのように全てを網羅したものでは無い。
準備1:ファイルの用意
以下のファイルを用意する
- インストールするカーネル(例:linux-2.6.0-test3.tar.bz2) をkernel.org またはミラーサイトより入手する。
- Rustyの新しいmodutils(例:module-init-tools-0.9.13.tar.bz2)をkernel.orgまたはミラーサイトより入手する
準備2:modutilsのインストール
まず、Rustyの新しいmodutilsをインストールする。これは、カーネル2.5以降ではローダブル・モジュールのファイル・フォーマットが新しくなり、古いmodutilsが利用できないためである。下位互換性は無いので、’insmod -f’ などとしても受け付けて貰えないだけでなく、異なったフォーマットのモジュールはmodutils自体に認識されないので、カーネル・バージョンによって使い分ける必要がある。カーネル2.5以降の新しいローダブル・モジュールのファイル・フォーマットは、拡張子を .koとして区別する事になっている。
さらに説明を加えれば、この新しいフォーマットのローダブル・モジュールをコンパイル・リンクする手順も、カーネル2.4までとは異なっている。以前の記事で、カーネル2.5以降でもデバイスドライバの互換性が保たれていると書いたが、それはあくまでもソースコード・レベルの話である。この新しいローダブル・モジュールのフォーマットに関する話題は、別の機会に取り上げたい。
Rustyの新しいmodutilsでは、古い.oフォーマットに対する操作コマンドを受け取った時に、古いmodutilsが*.oldの名前であれば、それにコマンドを引き渡すという、バージョンの違いを考慮した工夫がしてある。そのため、2.4系カーネルとmodutilsコマンドの併用を考慮するならば、例えば以下のようにして、必ず古いコマンドが、???.oldで参照できるようにバックアップして残しておくべきだろう。
(古いmodutilsをバックアップする操作の例) # cd /sbin # cp -p insmod insmod.old # ln -s insmod.old lsmod.old # ln -s insmod.old rmmod.old # ln -s insmod.old modprobe.old # cp -p depmod depmod.old
注:実際はこのような手作業をしなくとも、make moveoldを一度だけ実行する事でバックアップが行われる事になっている。(2003年11月17日更新)
準備3:fstabの設定
/etc/fstabを編集して、ディスク・パーティションのマウント・リストが論理ラベル名になっているのを、物理デバイス名に変更する。筆者が試した環境では、Redhatインストール直後のように、マウントするパーティションが論理ラベル名になっていると、2.5/2.6系カーネルではブートのpivot_root の辺りで認識できない様子だった。論理ラベル名のパーティションは、ディスクの接続先のコントローラを変更しても、fstabを修正する必要が無いので便利であるが、ブートできなくては仕方がないので、変更しておく。論理ラベル名のまま2.5/2.6をブートさせる方法もあると思うが、カーネル評価の目的には問題がないので、ここではfstabを修正する事にする。以下に編集例を示す。
(元のfstabの例) LABEL=/ / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 LABEL=/home /home ext3 defaults 1 2 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0 LABEL=/usr /usr ext3 defaults 1 2 LABEL=/var /var ext3 defaults 1 2 /dev/hda7 swap swap defaults 0 0 /dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
(修正後のfstabの例) /dev/hda2 / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 /dev/hda6 /home ext3 defaults 1 2 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0 /dev/hda3 /usr ext3 defaults 1 2 /dev/hda5 /var ext3 defaults 1 2 /dev/hda7 swap swap defaults 0 0 /dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
準備4:不要なサービスの停止
新しくコンフィグレーションしたカーネルは一発で動作するとは限らない。Redhat8/9では、デバイスドライバの多くがローダブル・モジュールになっているが、カーネル2.5/2.6とRedhat等の2.4系用のrc.sysinit等のrcファイルの組み合わせでは、ブート時にロードできないローダブル・モジュールがあるので、次の2点に注意してシステムを設定しておいた方がいいだろう。
- 不要なデーモン・サービスは止める
- USBやLANが無くてもシステムが動作するようにしておく
カーネル・コンパイル
ここまでの準備ができたらば、カーネル・コンパイルを行う。カーネル2.5以降では、’make xconfig’はKDE/Qt環境専用となり、Gnome環境では動作しなくなったので、変わりにGnomeでは’make gconfig’を使用する。勿論、従来からの’make menuconfig’も使用可能である。そのほかには、’make dep’ の手順が無くなったという変更点がある。また、make実行中のコマンド・パラメータは、標準では画面にエコーバックされなくなった。
必要最低限度のカーネル・コンフィグレーションは、従来通りdefconfigを使用して行う事ができる。デバイスドライバをモジュール化させて組み込む事も可能だが、前述の通り、そのままではブート時に組み込みできないローダブル・モジュールがあるので注意が必要だ。特に、ローダブル・モジュールのファイルシステムはブート時には組み込まれず、USB関連も構成モジュールの名前が2.4系から変更になっているために組み込まれない。defconfigのデフォルト設定では、RAMDISK/initrdが無効になっているが、設定すれば2.4系のmkinitrdで作成したinitrdイメージが使用できる。
一旦2.6系カーネルで立ち上がった後は、.configを変更して、新しい機能やローダブル・モジュールも試してみる事が可能であろう。ただしテスト版カーネルであるので、動作しない機能やデバイスもある、という事は念頭に置いて頂きたい。例えば、関連する情報としては、最近のLinuxカーネルメーリングリスト(LKML)では、以下のようなやり取りが行われた。
Florian Weimerは、彼の2.4.20で安定動作しているシステムが、彼が試した2.6.0-test3では、HyperThreadingが動作しないと報告した。原因は、彼のマシンが完全なACPIをサポートしていなかったという以前の経験から、ACPIのコンフィグレーション設定に「Enumeration Only」を設定していたからである。
Greg Norrisは、「Enumeration Only」の時には、menuconfig help textに書いてあるように、bootup時の「acpismp=force」パラメータが必要になると答えたのだが、このHelpテキストはわかり難く、また「acpismp=force」がbootup時のパラメータであるという説明も十分ではなかった。さらには、Hugh Dickinsが、全くACPIをサポートしないシステムにおいても、この「acpismp=force」パラメータが必要になると指摘したため、ACPIの開発者たちは、この混乱状況を認めて、次期リリース(-rc3)では、改善する事になった。