Linux Kernel Watch

12月版 カーネルコンフィグの方法が変わる!?


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2005/12/27

カーネルの設定ファイルをコンパクトに

 Linuxカーネルをソースからビルドする際、make menuconfigやxconfigなどで組み込む機能を設定できます。ここで行った設定は、「.config」ファイルに保存されます。問題が発生したとき、「どういうカーネル設定でその問題が発生したのか」という情報を共有するため、問題報告メールに添付されているのをしばしば見かけます。

 .configファイルは、単純な書式のテキストファイルです。ただ、現状では項目数が多過ぎて1000行規模の長いファイルになってしまっているため、実際問題としてあまり見やすいファイル形式ではありません。

 カーネル2.6.15の-rcリリースには、.configファイルより小さいファイルサイズで同じ情報量を表現する試みが実装されています。Rob Landleyは、この仕組みを説明するドキュメントを準備しよう、と提案しました。

 カーネル2.6.15の-rcリリースに実装されている仕組みとは、必要な項目だけを設定した「mini.config」というファイル(書式は.configと同じ)を作成し、

# make allnoconfig KCONFIG_ALLCONFIG=mini.config

のようにmake allnoconfigコマンドのKCONFIG_ALLCONFIG変数に指定すると、mini.configに指定した項目と、その項目が依存しているため「n」にできない機能のみが有効になり、残りの全設定を「n」に設定した.configファイルを生成するというものです。これにより、必要最小限の情報だけでカーネルの設定を再現できます。

 1000行もあった.configを100行に縮小できるとはいえ、100行ではまだ多過ぎるともいえますが、既存の手法を応用しているため、移行作業が必要ないというメリットもあります。

 また、現時点ではmini.configファイルを簡単に作成する方法がありません。make miniconfigコマンドを追加し、依存関係で「y」になる項目を検出して必要最小限の項目だけのmini.configを生成できるようにしよう、とRob Landleyは提案しました。カーネルのバージョンが変わるたびに設定項目が変わるため、これまではmake oldconfigコマンドなどを利用して.configを再作成する必要がありましたが、この方法で作ったmini.configはカーネルのバージョンアップなどによる変化により耐性があると期待されます。

 カーネルの設定方法が大きく変わるかもしれません。今後に注目です。

現状のCPU時間は不正確だ

 Andi Kleenは、最近のi386、x86_64アーキテクチャはRDTSCの値が信頼できず、RDTSCではCPU時間が正確に測れていない、という問題を指摘しました。彼はRDTSCに代わり、RDPMCを時間計測に流用してはどうかと提案しましたが、多数の反論がありました。

 RDPMCは、プログラム可能なパフォーマンス計測用レジスタの値を読み出す命令()です。設定によっていろいろなCPU関連イベントの回数を数えることができます。例えば、CPUが命令を処理していたサイクル数などを数えることができ、微小な時間の計測にも便利です。現状のLinuxでは、通常はring0の特権モードでしか読めないようになっています。Andi Kleenは、その0番レジスタの用途を時間計測のみに固定して、ユーザー空間(ring3)にも読み込みを許可しよう、と提案したのです。

注:x86_64アーキテクチャの場合、RDPMCは4個あります。

 oprofileなどのプロファイリングツールは、RDPMCを活用しています。また、NMI watchdogもRDPMCを活用しているそうです。David Gibsonは、CPUアーキテクチャが提供しているわけではないプログラムインターフェイスをユーザー空間に提供すると約束すると、本来のパフォーマンス計測に利用しにくくなるので好ましくないと反論しました。

 Jack Audio Connection Kitなど、リアルタイム系アプリケーションの中にはRDTSCを利用してタイミングを計測しているものも多数あるため、今後の対応に注目です。

どうやってブロックデバイスのサイズを取得する?

 Dick Johnsonは、「Linuxでブロックデバイスの大きさを取得する方法は?」と質問していました。OSによって使える方法が異なっていますが、皆さんはどうやっているのでしょうか?

  1. ioctl BLKGETSIZEを利用する方法
    OSによってやり方が違う

  2. lseek SEEK_ENDとSEEK_SETを利用する方法
    -EOVERFLOWエラーが返ってくる場合がある

  3. バイナリサーチをする方法
    Theodore Ts'oは、e2fsprogsのlib/ext2fs/getsize.cでは、ioctlを試して、ダメな場合はlseekやreadが失敗するまで試すというバイナリサーチを実践している、と説明しました。

 Linuxに限れば簡単な問題でも、複数のOSに対応しようとすると難しいようです。

11月の-stableリリース

 11月の-stableリリースはどうだったでしょうか。セキュリティフィックスが出ているため、2.6.14へのリンクを2.6.14.1へのリンクで置き換えていたようです。それで困っているユーザーもいて、少し議論になりました。-stableリリースは存在感を増しているようです。

  • 2.6.14.1(11月8日)
    ・CVE-2005-2709の対応だけの迅速なリリース
  • 2.6.14.2(11月11日)
    ・ネットワークドライバの不正な動作の修正
    ・ptraceのCLONE_THREADに関する不正確さなどの修正
    など、12個の小さなパッチ
  • 2.6.14.3(11月24日)
    ・Nocona向けの修正
    ・ドライバの各種不正な動作の修正
    ・ネットワーク関連の修正
    など、23個の小さなパッチ
2/2

Index
Linux Kernel Watch 12月版
 カーネルコンフィグの方法が変わる!?
  Page 1
 Linuxカーネルでoopsの出力を取得する方法
 ディスク先読み機は改善の余地あり?
 SATAハードディスクをスリープさせたい
Page 2
 カーネルの設定ファイルをコンパクトに
 現状のCPU時間は不正確だ
 どうやってブロックデバイスのサイズを取得する?
 11月の-stableリリース

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間