4月版 RCUの全面書き直しも! 2.6.29は何が変わった?


小崎資広
2009/5/8


クレデンシャル処理の全面書き直し

 Linuxで一般的にセキュリティの権限チェックに使われるのはuid、gidですが、実は内部的にはかなり多様なセキュリティ・クレデンシャルをサポートしています。ぱっと思い付くだけでもケーパビリティ、セキュアビット、キー(keyctl)、LSMなどなどが挙げられます。

 従来これらの情報はすべて、task_structの中に未整理のままゴチャゴチャと置かれていましたが、これには2つの問題がありました。

  1. 数が増えてきたのでforkシステムコールでのコピーコストがばかにできなくなってきた
  2. 自分が認証「する」ときのクレデンシャルと認証「される」ときのクレデンシャルが未分離

 2つ目はちょっとややこしいので説明が必要でしょう。例えば、タスクのuidは自分がファイルを変更するときは「自分が」権限を持っているかどうかをチェックするために使われます。しかし、fcntl(F_SETOWN)で指定されたプロセスがSIGIOを受けるときは、「相手が」権限を持っているかどうかをチェックするために使われます。

 一方カーネルには、あるタスクが一時的に別のユーザーの権限を取得する「代行権限」の考え方があります。例えば、ネットワークファイルシステムでサーバデーモンがファイルを書くときは、一時的にI/O要求ユーザーの権限で動作します。このとき、期待する挙動としては、「変更する」権限は変わってほしいのですが(でなければあらゆるファイルがroot属性になってしまいます)、「変更される」権限には弱くなってほしくありません。

 これを解決するために、従来はeuidのほかにfsuidを作り、fsuidは変更される側のチェックには使わないなどと、実装に合わせてセキュリティルールの方を変更することで逃げていました。しかし、セキュリティの種類が増えたこともあって、より一般的な解が望まれていました。

 David Howellsはこの問題に対して以下の対応を提案し、受け入れられました。

  • セキュリティ関係のメンバを新設したstruct credに移す
  • fork時はこの構造体のリファレンスカウンタを上げるだけとする
  • task_structはcredとreal_credの2つのメンバを持ち、それぞれ変更「する」「される」の権限を表す。通常は同じ構造体をポイントするが、代行権限の設定時はcredメンバのみ変更するようにする

 また、setuid()系のシステムコール群もすべて書き直されました。

WiMAXレディに

 IntelがCentrino 2プラットフォームとともに推進している新しい無線技術「モバイルWiMAX」ですが、Intelからソフトスタックと自社チップ用ドライバの双方が提供されることにより、Linuxでもreadyになりました。

cpumask APIの変更(a.k.a 4096CPU対応ふたたび)

 2.6.27において最大サポートCPU数が4096に拡大されましたが、そのときも書いたように、事実上スタックにcpumaskを置けなくなってしまった点が開発者に不評でした。またcpumask API群は、最大CPU数がたかだか64程度の時代に作られたため、値のコピーを基本とした関数群になっていたのですが、これが4096CPU(512byte)になるとコピーコストもばかにできません。

関連記事:
2008年10月版 2.6.27はLTSに、命名規則の変更案も飛び出した(@IT Linux Square)

 そういうわけで、cpumaskを全面的に再設計することになりました。……というと1行で終わってしまうのですが、変更すべき呼び出し関数が何百とあるので、開発中は「コンパイルが通らないぞー!」などという怒号が何回もLKML上で飛びかっていました(注4)。

 何が問題だったかというと、このコピーコストはマシンに搭載されているCPU数ではなくカーネルコンパイル時の最大値で決まります。そのため、openSUSEのようなSGIのスーパーコンピュータもサポートしているようなディストリビューションを使うと、全員が不利益を被るわけです。このパッチにより、コピーされるのはポインタのみとなったため、デスクトップユーザーなどが性能向上の恩恵を受けることになります。

注4:筆者も何回か被害を受けました。Rusty、コンパイルチェックぐらいしてください……

メモリ関連の多数の変更

  • MADV_SEQUENTIALが積極的な先読みの指示に加えて、優先的にキャッシュ破棄の対象になるよう変更されました
  • /proc/{pid}/stackでスタックトレースを取得できるようになりました
  • /proc/{pid}/smapsでページサイズが取得できるようになりました(複数のヒュージページサイズをサポートするプラットフォーム用)
  • dirty_background_bytes、dirty_bytesという2つのsysctlが追加されました。従来のdirty_background_ratio、dirty_ratioでは、大規模マシンだと1%の変更で挙動が変わり過ぎるということで、もっと細かい粒度の設定手段が求められていました
  • Swapもブロック解放時にdiscard commandを発行するようになり、SSDに優しくなりました
  • メモリ不足時のキャッシュ回収動作をマルチコアに最適化し、最大30%の性能向上を実現しました

Ext4への変更

  • マウントオプションによりkjournaldのI/Oプライオリティが変更できるようになりました
  • ジャーナルなしモードが実装されました

 ジャーナルなしモードはGoogleによって実装されました(ext4関係では珍しいことです)。たぶん、ジャーナルなしモードを使う人は世の中に1%もいないと思うのですが、Googleはいまだにext2を使い続けていることもあり、ext4にも、ext2に比べて性能劣化のないモードが必要になったようです。

FUSEへの変更

  • FUSEファイルシステムがioctlを実装できるようになりました
  • 同じくpollも実装できるようになりました

そのほか、および別記事(前月号)ですでに紹介済みのもの

  • btrfsとsquashfsのマージ
  • ブート時のロゴキャラクターがTuzに変更
  • memory controllerの大幅拡張
  • fastboot
  • 非常にたくさんのトレーサの拡張

などなどです。

-stableの進ちょく

 4月はリリースはありませんでした。

2/2

Index
Linux Kernel Watch 4月版
 RCUの全面書き直しも! 2.6.29は何が変わった?
  Page 1
 カーネル2.6.29の主な変更点
Page 2
 -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 記事ランキング

本日 月間