前回紹介したように,2.6 カーネルは現在も頻繁に更新が行なわれており,本稿執筆時点(10/22)では 2.6.0-test8 が最新版となっている.予定では,このtest8がテスト版の最終リリースで,以後は RC(Release Candidate)版となり,予定通りに進めば12月ごろに正式な2.6.0 のリリース版が公開されることになっている。

スケーラビリティ向上を示すベンチマーク結果報告

 2.6カーネルの改善は主にスケーラビリティ,と前回も述べたが,実際のベンチマーク結果が報告されている。この報告はドイツで開催されたLinux Congressでの発表「Scalable Network Programming」をまとめたもので,BSD系OS(FreeBSD,NetBSD,OpenBSD)とLinux(2.4,2.6)のネットワークに関するスケーラビリティのテスト結果が紹介されている(http://bulk.fefe.de/scalability/)。

 この結果を見ると,2.4カーネルに対する2.6カーネルの優位性が明確に示されている.特に,BINDやSOCKET,MMAPといったシステム・コールを大量に発生させた場合,2.4カーネルの処理速度はO(n)のオーダー(処理速度は処理する個数に比例して遅くなる)になっているのに対して,2.6カーネルの処理速度はO(1)のオーダ(処理速度は処理する個数に影響されない)に収まっており,カーネル開発者たちが苦心してきたスケーラビリティの改善が目に見える結果となって現われている。

 上記ベンチマークはネットワーク回りのスケーラビリティに関する機能に限定したものだったが,今後,ファイル・システムやSMP(対称型マルチプロセッサ)といった部分に関するベンチマークも実施され,カーネル2.6の特性がより明らかになっていくことだろう。

Makefileが全面的に書き換えられた

 今回は,2.6カーネルをコンパイルして使おうとしているユーザー向けに,カーネル再構築時およびインストール時に筆者自身が気づいた2.6.0カーネルの特徴や注意点を紹介しよう。

写真1●qconf
 最初に気付くのは,Makefileが全面的に書き替えられていることだ。2.6系カーネルのMakefileでは,従来のCML1と呼ばれる設定言語に変ってKconfigと呼ばれる設定言語が採用され,各種オプションの設定ツールも従来のテキスト・ベースのenuconfigに加えて,GUIベースの設定ツールが用意された(写真1[拡大表示])。もちろん,キャラクタ・ベースのコンソールでも利用できるように,従来通りのmake configやmake menuconfigも引き続き提供されている。

 写真1に示すように,GUI設定ツールではツリー状に整理された各種オプションを自由に閲覧,変更できると共に,従来のmenuconfigでは別途呼び出さなければならなかったヘルプ・メッセージも同時に画面に表示され,オプション選択の判断も容易になっている。これに応じて,各オプションの説明文も従来のDocumentation/ConfigureからそれぞれのディレクトリのKconfigファイルに分割配置されるようになった。

 また,従来はデフォルトのオプション指定を行う際も,一度make menuconfigを起動してデフォルトの設定ファイルを読み込む必要があったが,新しいMakefileではmake defconfigやmake allyesconfigといった指定で,デフォルトの設定やすべての項目をyesにした設定を一気に行うことが可能になっている。

make defconfig  : デフォルトのオプション指定
make allmodconfig : 可能な項目はすべてモジュール化する設定
make allyesconfig : すべての選択項目に yes と答えた設定
make allnoconfig : ほとんどの項目に no と答えた最低限度の設定
 カーネルをコンパイルする際も,従来必要だったmake depのステップが必要なくなり,makeコマンドを実行するだけでbzImageやモジュール・ドライバがコンパイルされるようになった。なお,引数を与えずにmakeを実行した場合は最低限のメッセージしか表示されない静粛(quiet)モードになる。従来のように実際に実行しているコマンドを表示させたい場合は
make V=1
のように,V=1オプションを与えて冗長(verbose)モードにする必要がある。

設定ファイルのカーネル内蔵化が可能に

 オプションを調整しながらカーネルの再構築を何度も行っていると,しばらく前にコンパイルしたカーネルのコンパイルオプションが分からなくなってしまうことがある。2.6カーネルでは,このような事態に対応するためにカーネル自身に設定ファイルを埋め込むことが可能となった。

 "General Setup"の"Kernel .config support"を有効にすると,そのカーネルをコンパイルする時に用いた設定ファイル(.config)がカーネル自身に埋め込まれ,後日,カーネルソースのscriptsディレクトリに用意されたextract-ikconfigコマンドを用いてvmlinuzなどのカーネル・イメージからconfig ファイルを再生することが可能になった。

 また"Enable access to .config through /proc/ikconfig"も有効にするとprocファイル・システムにikconfigディレクトリ(/proc/ikconfig)が作成され,そのカーネルをコンパイルした際のgccのバージョンを示すbuilt_withファイルや設定内容を示すconfigファイルを利用できるようになる。

 なお,extract-ikconfigを用いて圧縮したカーネル・イメージ(vmlinuz やbzImage)から.configファイルを抽出する場合,binoffsetコマンドが必要となる。このコマンドは,同じscriptsディレクトリにソース・ファイルが用意してあるので,事前にコンパイルして適切なディレクトリへインストールしておく必要がある。

# cd /usr/src/linux/scripts
# gcc -o binoffset binoffset.c
# install -s binoffset /usr/bin
 extract-ikconfigは下記のように,対象としたvmlinuzと同じディレクトリに,そのカーネルをコンパイルした際の設定ファイルを復元する。
# scripts/extract-ikconfig /vmlinuz-2.6
filesize: 1255038
number of pattern matches = 1
17412
Kernel configuration written to /vmlinuz-2.6.oldconfig.612

リアルタイム性能を向上させるコンパイル・オプションの副作用

 "Processor type and features"の"Preemptible kernel"オプションを指定することで,リアルタイム性能を向上させるカーネル・レベル・プリエンプションが可能となる。この機能を指定すると,デスクトップ環境の反応性や音楽やビデオといったマルチメディア再生能力の改善が期待できる。

 しかし,カーネル・レベル・プリエンプションを指定するとシステムコールの処理の途中でも割り込みに対する再スケジュール処理が発生するため,割り込みに対する反応性は改善するものの,システム全体としてのパフォーマンスはむしろ悪化する場合もある。

カーネルモジュール回りの変更

 "Loadble module support"オプションには"Module unloading"という項目が追加された。この項目を指定しないと,一度ロードしたモジュールはアンロードできなくなる。

 カーネル・モジュールは,2.4までのカーネルのようにmake modulesを明示的に実行しなくてもmakeコマンドを実行するだけで作成される。カーネル・モジュールをインストールするにはmake modules_installを実行する。カーネル・モジュールが/lib/modules//ディレクトリにインストールされるのは従来通りだが,モジュールの拡張子は.koに変更されている。

 カーネル・モジュールをロード/アンロードするには,従来のmodutilsツールではなく,ftp://www.kernel.org/pub/linux/kernel/people/rusty/modules/からダウンロードできるmodule-init-tools(本稿執筆時点での最新版はmodule-init-tools-0.9.14)を使う必要がある。ただし,module-init-toolsは2.4系のカーネル・モジュールには対応していないため,2.4系カーネルと2.6系カーネルを切り替えながら使う場合はmodutils由来のツールを別途残しておく必要がある。このためにはmodule-init-toolsをmakeした後,

# make moveold
# make install
 として,古いmodutils由来のツールをmodprobe.oldなどに改名して保存してからmodule-init-tools由来のツールがインストールされ,カーネルのバージョンに応じて自動的に起動するコマンドが切り替えられる。

 module-init-toolsは/etc/modules.confではなく/etc/modprobe.confという新しい設定ファイルを必要とする。この設定ファイルはmodule-init-toolsに付属のgenerate-modprobe.confというスクリプトにより自動的に作成されるので,module-init-toolsをインストールした後,

# ./generate-modprobe.conf /etc/modprobe.conf
 コマンドを実行し/etc/modprobe.confを新規に作成する必要がある.generate-modprbe.confは/etc/modules.confに記述された情報を自動的に読み取り,modprobe.conf 形式に変換して登録する。

古い形式のswapは使用不可に

 2.6カーネルでは,古いv0形式のswapは利用できなくなった。v0形式のswapをv1形式に更新するには-v1という引数を指定して再度mkswapを実行すればいい。

 2.7系のsysvinitのように古いバージョンのsysvinitでは正しくinitが起動できない場合がある。必要とされる最低バージョンは確認していないが,sysvinit-2.84は正しく起動した。最新の安定版であるsysvinit-2.85は以下のURLで公開されている。

ftp://ftp.cistron.nl/pub/people/miquels/software/sysvinit-2.85.tar.gz
 2.6カーネルでは,サウンド・ドライバとして従来のOSS(Open Sound System)と共にALSA(Advanced Linux Sound Architecture)のドライバが採用された。ALSAのドライバはOSSとは異なるデバイス・ファイルを使うため,/dev/snd/以下に/dev/snd/seqや/dev/snd/timerといったのデバイス・ファイルが存在しない場合,/usr/src/linux/scripts/MAKEDEV.sndスクリプトを実行し,適切なデバイスファイルを作成する必要がある。

 また,カーネルに含まれているのはALSAのドライバ部分のみのため,ALSAシステムが必要とするライブラリ(alsa-lib)やalsamixerなどのツール(alsa-utils)は別途インストールする必要がある。これらのソースコードはALSAプロジェクトのホームページ(http://www.alsa-project.org/) からダウンロードできる.

FDからの直接ブートは不可能に

 2.4カーネルまでは,圧縮されたカーネル・イメージ(bzImage)の先頭に,FDからブートするためのコードが付加されていた。そのためbzImageをFDにベタ書きすれば起動用FDとして利用できたが,2.6カーネルではこの機能は削除され,起動用FDにもsyslinuxやgrubなどのブート・ローダを書き込まねばならなくなった。

 そのため,カーネル再構築時のmake bzdiskが整備され,mtoolsを用いてFDをフォーマットし,syslinuxを書き込み,bzImageをFDにコピーするといった一連の手順を自動的に行うようなった。しかし,mtoolsなどのバージョンによっては正しく動作しない可能性がある。mtoolsの最新版(mtools-3.9.9) は以下のサイトから入手できる。

http://www.tux.org/pub/knaff/mtools/
 また,make fdimageを使えば,loopbackファイル・システムを用いて起動用FDのイメージがファイル(arch/i386/boot/fdimage)として作成される。このファイルはcatやddなどでFDに書き出せばそのまま起動用FDとして利用できるので,カーネルをコンパイルしたマシンにFDドライブがない場合や起動用FDを複数枚作成する場合などに便利であろう。

 なお,近いうちに改善されると思うが,mtools-3.9.9 は,preemptible にした2.6.0-test5カーネル上ではコンパイルエラーが発生した。

 以上,既存の Linux 環境に 2.6 カーネルをコンパイル,インストールする際の注意点を紹介した。上記の注意点も含め,2.6 カーネルで行われた様々な変更や2.6カーネルの新機能を使うために必要なプログラムおよびそのバージョン,入手先については,カーネル付属のChangesファイル(Documentation/Changes)やThe post-haloween documentに整理されているので,2.6 ーネルに挑戦するユーザーはぜひ一読しておいてほしい。

大鳥 信弘 (Ootori Nobuhiro)

■最新カーネル・リリース


・カーネル2.6系列 2.6.0-test8(2003年10月17日)
・カーネル2.4系列(安定版) 2.4.22(2003年8月25日)

■主要なLinux関連セキュリティ・アップデート(2003年9月20日~10月24日)

セキュリティ・プロトコルSSL/TLS(Secure Sockets Layer/Transport Layer Security)(バージョン0.9.7cあるいは0.9.6kよりも古いバージョン)にセキュリティ・ホール[2003年10月1日]

■著者紹介 大鳥 信弘 (おおとり のぶひろ)
株式会社テンアートニ 第二事業部シニアマネージャ。株式会社テンアートニは1997年設立のLinuxとJava専業とする企業。第二事業部はLinux/OSS関連のソフトウェア開発,SI(企画,コンサルティング,構築,運用等),サポート,教育,製品の販売等を手がける。