2013-05-10

FedoraとUbuntuのLinuxカーネル設定の比較

jwboyer: Fedora and Ubuntu Kernel Config Comparison

Red HatのJosh BoyerがFedoraとUbuntuのLinuxカーネル設定を比較している。

たまに、私は洞穴の中、つまりbugzillaから這い出てあたりを見回し、他のディストロのカーネルスペースがどうなっているのか調べる。今日、私はFedoraとUbuntuのカーネル設定の違いについて興味を持った。私は常々、カーネルは注目されるものの、ディストロの中では最も退屈なパッケージであると考えている。カーネルは動くべきであるし、良く動くべきであるし、それだけだ。ディストロを差別化するために存在するのではない。ディストロを動かすために存在するのだ。さて、私の説は正しいのか、あるいは設定の中に、あるディストロを別のディストロと差別化するための何かが含まれているのだろうか。さて、調べてみよう。

私は一行ごとの逐次比較は行わない。なぜならそれは、1)とてつもなく長いし、2)クソ退屈だからだ。例えば、Ubuntuはあるscsiドライバーを有効にしているがFedoraは無効にしているとか反対にとかいったことは、知らなくてもいいことだ。ここでは、様々な機能の部分の軽く調べる。

カーネル

比較目的として、Ubuntu 13.04パッケージのlinux-image-3.8.0-19-genericと、Fedoraの3.8.11-200.fc18の設定を使った。これは同じupstreamカーネルバージョンをベースとしており、どちらもディストロでも、最新の安定版リリースからのものである。私はx86_64(Ubuntu用語ではamd64)ビルドを使った。現在、これを使うのが最もふさわしいと思ったからだ。開発中のカーネルを使うという事もできたが、変更が甚だしいだろうし、広く利用されているものを比べたほうがいいと思ったのだ。

大観

大半の設定はほぼ同一である。ディストリビューションの設定ならこんなものだ。様々なデバイスやバスに対する広範なサポートがあり、ほとんどが組み込みではなくモジュールで提供されている。これは期待通りだ。というのも、どちらも同じupstreamコードベースであるし、ほとんどの設定オプションには、まともな設定はひとつしかないからだ。

低級オプション

とはいえ、一部の低級オプションは違っている。特に大きいのは、UbuntuはCONFIG_NR_CPUSを256にしているが、Fedoraは128に設定しているということだ。ほとんどの人には、128コアのマシンをブートするなどという事すらやりすぎだろう。しかし、Ubuntuはデスクトップとサーバー用に単一のカーネルを使うよう決定したそうだし(たしか12.04からだったと思う)、Ubuntuには高く設定する理由があるのかも知れない。Fedoraとしては、急に大掛かりなマシンのサポートの需要が浮上すれば、その時考慮するまでだ。私は自分用のミニスーパーコンピューターテストシステムを待ち望んでいる。

その他に違っていることとして、NUMAオプションがある。UbuntuはCONFIG_X86_NUMACHIP, CONFIG_MOVABLE_NODE, CONFIG_MEMORY_HOTPLUG, CONFIG_MEMORY_HOT_REMOVEを有効にしている。CONFIG_NODES_SHIFTの値はUbuntuの方が大きく、より多くのNUMAノードが使えるようになっている。これも、彼らのサーバー用途を考えれば、なにか理由のあることなのかも知れない。Fedoraはそのクラスのマシンには日常的に使われない。

HZ分野にも違いがある。FedoraのデフォルトはHZ_1000で、UbuntuはHZ_250だ。つまり、タイマーのtickはFedoraで秒間1000回なのに対し、Ubuntuでは250回となる。一般に、HZの値が大きいと、反応レスポンスがよくなる。サーバーでは、デスクトップやユーザーとの対話を待つ必要はないので、小さめのHZ設定にすれば、タイマーがプロセスを割り込む頻度が減って多くの処理ができる。もちろん、どちらのディストロもCONFIG_NO_HZを有効にしている。つまり、タイマーはCPUがアイドルのとき、必要に応じて割り込みがかかる。私が思うに、どちらもディストロもいずれは、3.10カーネルのマージウインドウに入っている、新しい完全なticklessオプションを採用するのではないかと思う。

UbuntuはCONFIG_FAST_NO_HZも有効にしているが、Fedoraはしていない。このオプションはRCUコールバック待機中にあるCPUを、grace periodを延長することで動的tick状態(アイドル)に入らせるものだ。これはsynchronize_rcu呼び出しを遅らせるが、CPUをより多くアイドル状態に移行させることができ、省電力性に貢献する。聞こえはいいし、実際いいのだろう。Fedoraはこれを有効にして様々な問題に直面したので、無効にしている。このオプションはupstream入りしてからカーネルリリースを何回か経ている。そろそろ我々も再評価してみるべきかもしれない。

デフォルトの選択

g.

大方、デフォルトの選択は同じだ。違いのある箇所は、デフォルトのI/OスケジューラーとかデフォルトのCPU frequency governorとかだ。Ubuntuはデフォルトでdeadlineスケジューラーを使っていて、FedoraはデフォルトでCFQ(Completely Fair Queueing)を使っている。Ubuntuはperformance governorを使っているが、Fedoraはondemand governorを使っている。言っておくと、どちらのオプションも、両ディストロで提供されている。単にデフォルトの設定が異なっているというだけだ。

LSM

セキュリティスタックは、UbuntuとFedoraで大きく異なっている分野のひとつだろう。FedoraはSELinuxのみを使っている。これはFedoraが有効にしている唯一のLSMであり、当然ながらデフォルトだ。Ubuntuは逆に、SELinuxも含めて全て有効にしている。これは少し以外だった。UbuntuがデフォルトのLSMとして使っているAppArmorしか有効にしていないものと思っていた。これにより、UbuntuがFedoraよりセキュアになるということではない。ただし、セキュリティはMACかDACかということに関して、ユーザーに選択の機会を提供しているとも言える。

モジュールオプション

FedoraとUbuntuはどちらも署名付きモジュールを生成している。Ubuntuはセキュアブート目的には必要ないと声明を出していたので、これは以外だった。おそらく、Ubuntuは別の目的に使っているのだろう。UbuntuがCONFIG_MODULE_SIG_SHA512を使っているところをみると、やはり別の目的だろう。FedoraはUEFIで一般的なハッシュ実装であるCONFIG_MODULE_SIG_SHA256を使っている。

UbuntuはCONFIG_MODVERSIONSも有効にしている。これはエクスポートされたシンボルのプロトタイプのCRCを生成するものだ。モジュールがロードされた時、カーネルのCRCをモジュールのCRCと比較して、一致しなかった場合ロードを失敗させるものだ。これは単純なモジュールのABIチェック機構だ。UbuntuはMODULE_SRCVERSION_ALLも有効にしている。これは"srcversion"フィールドを埋め込む。これは、別のカーネル用にモジュールをビルドして、それを知りながらもロードするという事を可能にする。

昔の時代遅れのクソ

UbuntuはFedoraより昔のものを有効にする傾向にあるようだ。Ubuntuはacorn, atari, ultrix, sysv68パーティションをサポートしている。UbuntuはDECNETとパラレルIDEサポートもビルドしている。ARCNET。まず最近じゃお目にかかることすらないし、この現代に使われることもほとんどない。もちろん、Fedoraもいくつかヘンテコなものをサポートしている。FedoraはまだOSSサウンドスタックを有効にしているが、UbuntuはどうやらOSSは捨てたようだ。

Ubuntuは「組み込み」用のオプションをたくさん有効にしている。full MTDサポートとか、珍しいキーボードドライバーとか、SPI, MFD Regulator, GPIOLIBだ。UbuntuはJFFS2, F2FS VXFSファイルシステムをサポートしている。サウンドとかメディアドライバー用の様々なSoCオプションも有効にしている。これはデスクトップやサーバー向けには不思議だが、Ubuntuカーネルをどっかのx86ベースのSoCでブートしたい場合、可能だということだ。

FedoraはKMSをサポートするDRMドライバーのみと、極少数のフレームバッファードライバーを有効にしている。Ubuntuはほとんどすえて有効にしている。私は我々FedoraのKMSにあらずんば帰れ的アプローチに納得している。不思議なことに、UbuntuはCONFIG_LOGOを有効にしていない。まさかペンギンが嫌いなのか?

最後に、UbuntuはFedoraより相当多くのstagingドライバーを有効にしている。知らない人のために解説すると、stagingとは公式mainlineに入る前の修正中のドライバーが放り込まれるところである。Ubuntuは文字通りカーネルをTAINT_CRAPでtaintしている。Fedoraはこういうことは避けている。UbuntuはunionファイルシステムのAUFSや、クソひどいレビューという前科のある新しいAtherosチップ用のイーサネットドライバーであるALXも持っている。

Summary

まとめ

さて、私の「カーネルは動くべきでありそれだけだ」という自説は維持されただろうか。たぶん維持されていると思う。両ディストリビューションのカーネルに、驚くほどの違いはみられなかった。両者の違いの一部は、両者とも再検討する必要のあるものもありそうだが、最終的には、どのオプションも多大な改善というわけでもない。これはやってよかった実験だと思うが、しばらくは再びやらないだろう。カーネル設定を眺めている間に、すぐbugzillaが興味深くなってくるのだから、なかなか暇がない。

ここまで読んでくれたのなら、ありがとう。

2 comments:

ujm said...

s/stating/staging/g

江添亮 said...

はて、なぜこんなtypoをしたのか。しかも二度も。