ブログトップ 記事一覧 ログイン 無料ブログ開設

B-) の独り言

2007-06-17 引き継ぎか、なりかわりか?

ファイル システム トンネリング機能

一定時間内に削除されたファイルと同じ名前のファイルが作成された場合、作成日時などを引き継ぐ機能で、FAT・NTFS のファイルシステムで実装されています。

[NT]Windows NT のファイル システム トンネリング機能

http://support.microsoft.com/kb/172190/ja

上記サポート技術情報によると、ディレクトリからファイルが削除されると、デフォルトでは15秒間の間削除ファイルの情報がキャッシュされるということになっていますが、レジストリで無効にすることもできるようです。

MFTエントリ番号はどうなるのか?

昨日の実験を行っている最中に、間違えて以下のコマンドを実行してしまいました。

echo sample > a.txt
echo 123456 > a.txt

echo で a.txt の内容を 123456 へ更新しようと思ったのですが、上記では2回目の echo 文により a.txt が新規に作成されることになり、厳密には最初の a,txt と次の a.txt では異なるファイルになります。

しかし、ここでファイル システム トンネリング機能が働き、二度目の echo で作成された a.txt の作成日時は引き継がれることになり変化しません。

さらにややこしいというか、たまたまなのか?、MFT エントリ番号(File Identifier)も同じ番号だったので思わず違和感がなかったのですが、何かが違うと(笑)

以前、米国で GSI のトレーニングを受けた際に、MFT エントリは空いてるレコードを上から使用という様に聞いているのと、過去の実験でもそんな動きでしたので、ちょっと実験してみたいと思います。

まず、連続する MFT エントリ番号を持つファイルを以下のコマンドで作成しました。

echo sample1 > a.txt
echo sample2 > b.txt

それぞれのファイルの MFT エントリ番号は a.txt は 57942、b.txt は 57943 になります。

次に、a.txt と b.txt を削除し、b.txt を 15秒以内に新規作成します。

del a.txt
del b.txt
echo sample3 > b.txt

この段階で MFT レコードを確認すると、b.txt の MFT エントリ番号は 57942 となりました。つまり a.txt の利用していた番号になります。もちろん、MFT エントリ番号 57943 の b.txt は削除されたファイルとして識別された状態になり、a.txt のエントリが再利用されるので、a.txt の情報は確認できなくなります。

なお、この文字列の長さだと MFT レコード内に内蔵されることになりますね。

ファイル名を変更した場合

ファイル システム トンネリング機能は、ファイル名の変更時にも有効ですが、これって確か Office 製品でテンポラリファイルで編集した内容を反映する場合に使ってるんでしたっけ?

echo office > a.txt
copy a.txt a.tmp
del a.txt
ren a.tmp a.txt

例えば、a.txt が MFT エントリ番号 57942 の状態で、copy コマンドにより a.tmp が新規に作成されると、a.tmp は MFT エントリレコード番号 57080 になり、作成日時は copy コマンドの実行日時になります。ファイル a.txt が削除され、a.tmp のファイル名が a.txt に変更されることで、a.txt の作成日時が a.tmp(ファイル名変更後の a.txt)に引き継がれます。

MFT エントリ番号はそのまま使われるので、57942 は削除状態になり、ファイル名 a.tmp が a.txt になり、MFT エントリ番号はそのまま 57080 になります。

この場合に、MFTエントリ番号 57080 のレコードに $FILE_NAME 属性として旧ファイル名 a.tmp が残っているのではないか?と思ってちょっと見てみたのですが、どうも残ってないようです。