Transactional NTFS (1)

Windows Vista では Transactional NTFS (TxF) と呼ばれる機能が導入されます.



Windows Vista RTM 版に関する追記. Windows Vista RTM 版には,以下の transaction コマンドは搭載されません.ただし Win32 の TxF API 自体は実装されているようです.しかし,Windows には歴史的にファイルシステムに依存した特殊動作 (exe.local や,exe.manifest など)が数多くあり,またスクリプトベースの処理を TxF で隠蔽した場合などのセキュリティリスク等も考えられ,今後 Windows Vista SP1 / Longhorn Server へ向けて一層の検証が必要かと思われます.


TxF は Win32 API レベルの改良ですが,手っ取り早くコマンドプロンプトから使用する方法があります.

河端さんのサンプルを例にとると,こんな感じです.

transaction /start
time /t > 1.txt
type 1.txt
copy 1.txt 2.txt
transaction /commit

処理の最後で transaction /rollback とすれば途中の処理がロールバックされます.また,reg コマンドによるレジストリ操作もロールバック可能です.
これだけだと単純な話に見えますが,実際には色々面白い現象を見ることができます.
河端さんが書かれているように,あるコマンドプロンプトでこのトランザクションを実行しているとき,最後の transaction /commit が実行されるまでは,別のコマンドプロンプトから 1.txt や 2.txt の変更は見えません.セッション外部からは,文字通りトランザクションがコミットされるタイミングでまとめてファイルシステム上の変更が行われるように見えるのです.より詳しく見てみると,読み書き可能なスナップショットが作成されるわけではなく,トランザクションを破壊するようなファイル操作は外部からできなくなっていることがわかります.例えば,トランザクション中で変更されたファイルは,トランザクションが終了するまで外部からは書き込めません.
トランザクション中のコマンドプロンプトから起動されたプロセスは,このトランザクション中の状態が見えるようです.これを利用すると,例えば一時的にデータを書き換えて処理プログラムを実行し,後でオリジナル状態に戻すといった作業で,いちいちオリジナルデータのバックアップをとる必要が無くなります.
例えばこういう場合ですね.

  1. トランザクションスタート
  2. カーネルソースにパッチあて
  3. カーネルビルド
  4. FTP でできたカーネルをサーバにアップロード
  5. トランザクションロールバック

これで,オリジナルのソースコードは一切変更されません.ただ上にも書きましたが,このビルド処理と並行してオリジナルのソースに対しても別のビルド処理を実行できるかというと,それは難しいでしょう.技術的には揮発性スナップショットを作るのも不可能ではなさそうですが,どうなんでしょうね?
そうそう,Transactional NTFS だけあって,FAT 上では実行できません.USB メモリなどで FAT 環境に出会う確率も残っていますので,注意が必要かもしれませんね.