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. |
それだけではなく、カーネルにおけるO_SYNCの実装は不十分でした。POSIXのO_SYNCの要件を満たしておらず、O_DSYNC相当のものでしかありませんでした。そのためO_SYNCをO_DSYNCにリネームし、新しく__O_SYNCフラグを追加したうえで
#define __O_SYNC 04000000 |
としていました。なぜ単純に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 |
|
|
||||
|
連載 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カーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|