NTFSについて調べたのでメモ
- 2009-10-20
- カテゴリ: Client Side
- タグ: Tips Windows NTFS
諸事情あってNTFSについて調べたので、自分なりに理解したところをメモ。
基本的には、
の二つのサイトに書いてあることから必要な部分を抜粋しているだけだけど、説明を省略してる部分もあるし間違ってる部分もあるかも。
ファイルはMFTレコードとして表現されている
- NTFSのファイル情報はMFT (Master File Table)というリレーショナルデータベースに記録されている。
- MFTはファイルレコードを行として持ち、ファイル属性 (attributes) を列として持つ。(=> ファイルレコードはファイル属性の集まりである。)
- ファイルやフォルダは、必ず1個以上のファイルレコードとしてMFTに記録されている。(=> ファイルやフォルダは、ファイル属性の集まりとしてMFTに記録されている。)
- ファイルレコードのサイズは1KBの固定長である。
ファイルに関する情報は全てファイル属性である
- ファイルに関する情報 (ファイル名, タイムスタンプ, Readonly属性, Hidden属性, セキュリティ情報, リパースポイント, データ等) は全てファイル属性として記録されている。
- 属性の値がファイルレコードのサイズに収まる場合はMFTに直接記録され (resident attributes)、ファイルレコードに収まらない場合はディスクのどこに記録されたかがMFTに記録される (nonresident attributes)。
ファイルは複数のデータストリームを持つことができる
- ファイルのデータはデータストリーム (data stream) というファイル属性に記録される。
- ファイルは、通常のデータストリーム (無名のメインストリーム) のほかに、名前つきの代替データストリーム (alternate data stream) を複数持つことができる。
-
代替データストリームはファイル名にコロン (:) とストリーム名を続けることで、簡単に読み書きすることができる。
- 例えば、
echo helloworld > file.txt:adsというコマンドで、file.txtのadsという代替データストリームにhelloworldというデータを書き込むことができる。 - Firefox等ではfileスキームを使って代替データストリームのデータを表示することができたりする。(
file:///C:/file.txt:ads) - DIRコマンドに/Rオプションを追加すると、ファイルが持つ代替データストリームの名前を表示することができる。(Vistaから?)
- 例えば、
- データストリームはユーザーアプリケーションがかなり自由に使うことができるファイル属性である。(その他のファイル属性はWindowsやNTFSの仕様の制約を受ける。)
- データストリームはファイル属性のひとつなので、データストリーム毎に異なるファイル属性 (タイムスタンプやセキュリティ属性等) を持つことはできない (はず)。
フォルダ
- フォルダは、配下ファイルのインデックスを持つファイルレコードとして、MFTに記録される。
- インデックスには、配下ファイルの名前とMFTファイルレコードとの対応関係が記録されている。(directory entryと呼ばれる。)
- ディレクトリエントリーが作成されていないファイルレコード (= どのフォルダにも属さないファイル) にはアクセスすることができない。(=> MFTのファイル名属性を使ってファイルにアクセスすることはできない。)
ハードリンク
- ハードリンクは、同じファイルレコードを参照する複数のディレクトリエントリーを作成することで実現される。
- ハードリンクされたファイルは、全て同じファイルレコードを参照するため、同じファイル属性を持つ。
ジャンクション・シンボリックリンク
- ジャンクションやシンボリックリンクはリパースポイント (reparse points) という仕組みを使って実装されている。
- ジャンクションやシンボリックリンクを現すファイルレコードには、リパースタグ (reparse tag) という情報がファイル属性として記録される。
- リパース属性を持つファイルにアクセスすると、リパースタグに記録された情報を元に別のファイルに転送される。
- ジャンクションやシンボリックリンクは、それ自体が1つのファイルレコードであるため、リンク元ファイルとリンク先ファイルは異なるファイル属性を持つ。
セキュリティ情報
- セキュリティ情報はMFTのセキュリティ記述子 (security descriptor) 属性に保存される。
- セキュリティ記述子にはオーナーのID、グループのID、随意アクセス制御リスト (DACL: Discretionary Access Control List) 、システムアクセス制御リスト (SACL: System Access Control List) が含まれている。
その他
- NTFSが高い拡張性を持つのは、ファイル属性を追加することで簡単に新しい機能を増やすことができるからっぽい。
- ハードリンクはファイルシステムレベルでリンクをはっているけど、リパースポイントはOSレベルでリンクをはっている (というイメージ)。
- ハードリンクはファイル属性が全て同じになってしまうから、片方だけを隠しファイルにしたりすることができないけど、ジャンクションやシンボリックリンクではそれができる。
- 代替データストリームは、データの隠し場所としては格好の場所かも。ふとしたタイミングにデータを飛ばしてしまうリスクが高いけど。
- NTFSは高機能すぎる気がするので、他のファイルシステムと併用するつもりがあるなら、使用する機能をタイムスタンプ、一般ファイル属性、メインデータストリーム程度に抑えておいたほうがいいかも。Robocopyのデフォルト設定でコピーされるのはこの3つなわけだし。
- 日本語Wikipediaに書いてある
アクセス制御リストなどはこの機能 (引用者注: 代替データストリームのこと) を利用してディレクトリエントリに結び付けられている。
っていう記述は怪しい。ACLは代替データストリームではなくてセキュリティデスクリプタ属性に記録されているような気がする。
まとめ
今回まとめたのはNTFSのMFTに関する情報が中心だけど、アクセスコントロールとかジャーナリングとか圧縮とか暗号化とかTransactional NTFSとかの世界に踏み込んだらもっと複雑になるかも。
トラックバックURL
- http://liosk.blog103.fc2.com/tb.php/188-b063a73e

