12月版 ネットワークアクセス権も放棄せよ


小崎資広
2010/1/12


2.6.33マージウィンドウで見掛けた粋なパッチたち


真のO_SYNCサポート

 POSIXでは、O_SYNCとO_DSYNCには異なる意味が与えられており、O_DSYNCはWrite I/O時にデータのストレージへの書き込み完了を保証しますが、O_SYNCはデータだけではなくファイル変更時間などのデータ以外のファイル情報の書き込み完了も保証するという違いがあります(なお、似たようなフラグとしてO_RSYNCというフラグもあり、こちらはRead I/O時に書き込みが完了することを保証します)。

 ところが歴史的な事情により、従来のLinuxのO_SYNCの実装はかなりクレイジーな状況でした。まず、カーネルはO_SYNCのみを定義しており、glibc側でコンパイルを通すためのダミー定義を以下のように行っていました。

/* For now Linux has synchronisity options for data and read operations.
   We define the symbols here but let them do the same as O_SYNC since
   this is a superset. */
#if defined __USE_POSIX199309 || defined __USE_UNIX98
# define O_DSYNC        O_SYNC  /* Synchronize data.  */
# define O_RSYNC        O_SYNC  /* Synchronize read operations.  */
#endif

 それだけではなく、カーネルにおけるO_SYNCの実装は不十分でした。POSIXのO_SYNCの要件を満たしておらず、O_DSYNC相当のものでしかありませんでした。そのためO_SYNCをO_DSYNCにリネームし、新しく__O_SYNCフラグを追加したうえで

#define __O_SYNC        04000000
#define O_SYNC          (__O_SYNC|O_DSYNC)

としていました。なぜ単純にO_DSYNCを追加しないのかというと、互換性の問題から以下の制約があるためです。

  • 古いヘッダファイルでコンパイルしたアプリケーションを新しいカーネルで動かした場合でも、従来どおりO_DSYNCとして動作させたい。つまり、非互換が発生するリスクを抑えたい
  • 逆に、新しいヘッダファイルでコンパイルしたアプリケーションを古いカーネルで動かした場合、O_SYNC、O_DSYNCともにO_SYNC(前述のように実装はO_DSYNC動作)にフォールバックさせたい。openは未知のフラグは無視するので、余分なフラグが渡される分には悪い影響は出ない

 O_SYNCがPOSIX非準拠だったとしても、fsync()を使えば同期はできるので問題ないという意見もあったのですが、Christoph Hellwigが前述のような手法で互換性問題を避けられることを示したことにより、無事マージと相成りました。彼はO_RSYNCの実装も進めているみたいなので、こちらも近々マージされるかもしれません。

 しかし、ほかのUNIX OSでは昔からあったこんなメジャーな機能が未実装だったなんて驚いてしまいますよね。

システム復元を容易にするDM snapshot merge

 Mike Snitzerによるsnapshot merge targetパッチがマージされました。これは(名前からは想像しにくいのですが)デバイスマッパにスナップショットのロールバック機能を追加するパッチです。

 スナップショットとは、バージョン管理システム(cvsとかsubversionとか)でいうところの「ブランチを切る」ような機能です。これにより、ユーザーAさんがデバイスを読み書きし続けている状態で、ユーザーBさんがタグを打った時点のデータを読むことができます。スナップショットの作成は一瞬でできるので、バックアップを取るときにデバイスへ書き込みを行っているプロセスを止めなくてよいという利点があります。

 内部的な仕組みを説明すると、ユーザーAさんが書き込みを行った時点でストレージのコピーオンライト(cow)が発生し、コピーがcowデバイス上に保存されます。ユーザーBさんが読み込みを行ったときは、cowデバイスに情報があればそちらを読み、なければオリジナルデバイスから読むという動作をすることにより、スナップショット取得時点のデータを返します(注4)。

 そしてsnapshot mergeとは、取ったcowを再び本流にマージすることにより、ユーザーAさんから見えるデータをスナップショット時点に戻すことです。これによりyum upgradeのようなシステムアップグレード時に、「うまくいかなかったら、変更をすべて元に戻す」という機能を提供することができます。

 Windowsの復元ポイントと違いデバイスレベルで元に戻してしまうので、「システムの情報は昔の状態に復元されたけど、アプリケーションは復元されなかったので不整合が起きた」という状態が原理的に発生しないのが利点といえます。

注4:一見すると、書き込みを行っているユーザーAの方がコピーを持つべきに思えますが、スナップショットはバックアップ終了とともに消去することが多いので、本流への読み書きが効率的になるように実装されています。

BKLの大口ユーザーがまた1つ……BKLがReiser FSから削除

 2.6.33にて、Frederic Weisbeckerの手により、ReiserFSからBKL(注5)が削除されました。Reiser FSはSMPマシンが一般的に使われるようになる前に設計されたこともあり、ファイルシステム全般にBKLが広範囲に使われており、マルチCPUスケーラビリティがまったくない状態でした。しかもドキュメント・コメントがともに不十分なため、何を守っているロックなのかが明らかでない場合が多々あり、変更が容易ではなかったのです。

 ……が、予想どおりロック周りのトラブルが多発しており、現在ReiserFSは大変不安定な状況に陥ってます。南無。

 Andi Kleenは「うぎゃー、勘弁してくれ。ファイルシステムで冒険しないでくれ。ユーザーは$HOMEに使ってるかもしれないんだぞ。ext4みたいに、コードをコピーしてreiserfs 3.5とかを作るわけにはいかないの?」と悲鳴を上げていました。これに対しTed Tsoが「xfsqa regression test suiteは使ってる? 名前に反してXFS以外にも使える汎用FSテストセットで、ext4、xfs、btrfsの開発者はみんな使ってるよ」とアドバイスしていました(注6)。

 この混乱が収まるにはもう少し時間がかかりそうです……。

注5:Big Kernel Lockの略。Linux 2.0ぐらいの最初期のSMPサポートに使われたロック方式。1つのロックでカーネル全体を保護します。もちろんまったくスケールしないので、2.4以降の新規コードで使われることはまずありません。ここ何年かずっと「もう少しで全廃できる」という議論をしていますが、現状は、最近のマシンで使われる可能性があるコードからはだいたい消えたかな、というところ。

注6:Fredericからお礼のメールが届いた後「えっ、いままでどうやってテストしてたの?」とつぶやいていたのが印象的 :-)

2/2

Index
Linux Kernel Watch 12月版
 ネットワークアクセス権も放棄せよ
  Page 1
 disablenetworkから始まった議論、LSMに飛び火
Page 2
 2.6.33マージウィンドウで見掛けた粋なパッチたち

連載 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 記事ランキング

本日 月間