NTFS
現行のWindowsが標準で使うファイルシステム。MFT(マスターファイルテーブル)などの構造でボリューム上のファイルを管理する。
MFT(マスターファイルテーブル)
NTFSボリューム上のすべてのファイルについて少なくとも1つのエントリ(ファイルレコード)を持つ、NTFSの中心的な台帳。MFT自身のエントリも含まれる。
マスターファイルテーブル
MFTファイルレコード
MFT内の1ファイルぶんのエントリ。標準情報・ファイル名・セキュリティ・データなどの属性のリストとして構成される。
ファイルレコード
MFTゾーン
MFTを連続的に保つためにボリューム上にあらかじめ予約される領域。ボリュームが埋まってくると予約が食われ、MFT自体の断片化が始まる。
断片化(NTFS)
ファイルのデータランが連続領域として取れず複数箇所に分散し、読み出しに必要なシークが増える現象。
フラグメンテーション
常駐属性(resident)
データ本体がMFTファイルレコード内に直接収まる格納形式。数百バイト程度までの小さいデータで使われ、読み出しはMFTアクセスだけで完結する。
常駐
非常駐属性(non-resident)
ファイルレコードには「クラスター列への参照(データラン)」だけが記録され、実データはMFT外のユーザーデータ領域に置かれる格納形式。大きいデータで使われる。
非常駐
データラン
非常駐属性が持つ、「どこから何クラスター」という連続クラスター区間の並びを表す情報。数が増えるほど断片化が進む。
エクステント
fsutil
NTFSボリュームの低レベルな照会・設定を行うコマンドラインツール。ファイルのエクステント照会、8.3短縮名の設定、USNジャーナル操作、リパースポイント照会など多数のサブコマンドを持つ。
代替データストリーム(ADS)
NTFSの1ファイルが持てる、名前のない既定ストリーム以外の追加のデータストリーム。「ファイル名:ストリーム名」の構文で読み書きする。
Zone.Identifier(Mark of the Web)
ブラウザーなどでダウンロードしたファイルに付与される代替データストリーム。ファイルの出所(インターネット由来など)を記録し、SmartScreenや保護ビューの判定材料になる。
streams(Sysinternals)
NTFSファイルの代替データストリームを列挙・削除できるSysinternalsのコマンドラインユーティリティ。
論理サイズとディスク使用量の乖離
ファイルの論理的な長さと、実際に割り当てられたディスク領域が食い違って見える現象。スパース・圧縮・代替データストリーム・クラスター切り上げが主な要因。
サイズとディスク上のサイズの不一致
ハードリンク
同一ボリューム内で、複数のパスが単一のファイル(同じMFTレコード)を参照するファイルシステム上の表現。CreateHardLinkやmklink /Hで作成する。
8.3短縮名
歴史的互換性のためNTFSが長いファイル名に対して自動生成できる、REPORT~1.DOCのような形式の短縮名。
短縮ファイル名
リパースポイント
ファイルやディレクトリに付けられる「タグ+ユーザー定義データ」という属性。ファイルシステムが開こうとした際に、タグに応じた処理へ乗っ取られる公式のフック。
シンボリックリンク
別のファイルやディレクトリへのリンク先パスを保持し、透過的なリダイレクトとして機能するリパースポイント。別ボリュームやリモートパスも指せる。
ジャンクション(マウントポイント)
ディレクトリを別のローカルボリュームの位置へつなぐ、古参のリパースポイント応用の仕組み。
マウントポイント
OneDriveのファイルオンデマンド
実データが手元にないクラウド上のファイルをプレースホルダー(リパースポイント)としてローカルに見せ、アクセス時にクラウドフィルターが実体を取得する仕組み。
クラウドファイル
$LogFile(NTFSトランザクションログ)
NTFSのメタデータ操作を実行前に記録する先行ログ。システム障害後の次回起動時に再生され、ファイルシステムの構造的な整合性を自動回復する。
トランザクションログ
ボリューム破損
ファイルシステムの構造(メタデータ)が壊れ、ボリュームが正しく読めなくなる状態。
ファイルシステム破損
キャッシュマネージャー
ファイルデータをメモリ上のシステムキャッシュに保持し、読み書きの多くをディスクI/Oなしで処理させるWindowsカーネルのコンポーネント。ファストI/Oの近道もこのキャッシュを直接利用する。
USNジャーナル(変更ジャーナル)
ボリューム内のファイル・ディレクトリへの変更のたびに、変更内容と対象の名前を記録する台帳。バックアップや検索インデクサーが全走査なしで差分を把握するために使う。
スパースファイル
ゼロが続く範囲に実領域を割り当てず「穴」として管理するファイル。論理サイズが実際の割り当てより大きく見える。
NTFS圧縮
データを圧縮ユニット単位で圧縮して格納するNTFSの透過的な圧縮機能。読み書きのたびに展開・再圧縮のコストが伴う。
ファイル圧縮(NTFS)
非同期I/O
要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。
オーバーラップI/O
Process Monitor(procmon.exe)
ファイルI/O・レジストリ・プロセス/スレッド活動をリアルタイムに監視できるSysinternalsのツール。Advanced Outputを有効にすると、IRPやファストI/Oのカーネル側の語彙で操作を表示する。
NTFSボリューム上のすべてのファイルは、MFT(マスターファイルテーブル)に少なくとも1つのエントリを持つ台帳で管理される
MFTは、MFT自身のエントリも含めボリューム上の各ファイルにつき1つ以上のファイルレコードを持つ
MFTを連続的に保つために、MFTゾーンという領域があらかじめ予約される
MFTゾーンの予約はMFT自体の断片化を緩和するが、ボリュームが埋まってくると断片化が始まる
データが小さい場合、データ本体はファイルレコード内に属性として直接収まる(常駐)
データが大きい場合、ファイルレコードにはクラスター列への参照(データラン)だけが記録される(非常駐)
1つのデータ属性は常駐か非常駐のどちらか一方であり、データサイズに応じてどちらか片方の形で格納される
非常駐属性は、実データがどこにいくつあるかを示すデータラン(連続クラスター区間)の表を持つ
連続領域が取れずデータランの数が増えるほど、読み出し時に散らばった領域を渡り歩く必要が生じ、断片化として現れる
fsutil file queryextentsで、ファイルのエクステント(データラン)がいくつに分かれているかを確認できる
NTFSは1つのファイルに複数のデータストリームを持たせられ、既定の(名前のない)ストリームに加え「ファイル名:ストリーム名」形式の代替データストリームを作れる
ダウンロードしたファイルの出所情報(Mark of the Web)は、Zone.Identifierという名前の代替データストリームに記録される
dir /rやSysinternalsのstreamsツールでZone.Identifierストリームの有無を確認できる
Sysinternalsのstreamsユーティリティは、NTFSファイルの代替データストリームを列挙・削除できる
代替データストリームはエクスプローラーのサイズ表示に出ないため、ファイルサイズの合計とディスク使用量が食い違って見える一因になる
NTFSは、同一ボリューム内で複数のパスが単一のファイルを参照するハードリンクをサポートする
ハードリンクは、同一のMFTレコードを指す同格の名前(ファイル名属性)がもう一つ増えるという形で実装される
NTFSは、長いファイル名に対して8.3形式の短縮名を自動生成できる
fsutil 8dot3nameで、短縮名生成の有効/無効の照会・設定や既存短縮名の除去(strip)ができる
NTFSのファイルやディレクトリには、開いたときの処理を乗っ取れるリパースポイントを付けられる
fsutil reparsepoint queryで、リパースタグの値や名前の付け替え系ならリンク先のパスを確認できる
シンボリックリンクは、リンク先のパス文字列を保持するリパースポイントとして実装される
ジャンクション(マウントポイント)は、ディレクトリを別のローカルボリュームの位置へつなぐリパースポイントとして実装される
OneDriveのファイルオンデマンドは、実データが手元にないファイルをプレースホルダー(リパースポイント)として表現し、開かれた瞬間にクラウドフィルターが実体を取得する
NTFSは、メタデータ操作の先行ログである$LogFileと、マウント時のチェックポイント情報を使う
システム障害が起きても、次回起動時に$LogFileを再生してファイルシステムの構造的な整合性を自動回復し、ボリュームが読めなくなる事態を防ぐ
キャッシュ有効のI/OではNTFSがキャッシュマネージャーと協調して動作し、データ内容の保持・遅延反映はキャッシュ層が担う(NTFSはメタデータ構造を管理する)
NTFSは、ファイルやディレクトリへの変更のたびに内容と名前を記録するUSN変更ジャーナルをボリュームごとに維持できる
fsutil usn queryjournalで状態、fsutil usn readjournalで記録内容を参照できる
NTFSは、ゼロが続く範囲に実領域を割り当てずに管理するスパースファイルをサポートする
割り当てのない範囲を読むとゼロが返る仕組み上、論理サイズと実際に割り当てられたディスク上のサイズが大きく乖離しうる
NTFSは、圧縮単位ごとにデータを圧縮して格納するファイル圧縮をサポートする
圧縮後のサイズだけが割り当てられるため、論理サイズと「ディスク上のサイズ」が乖離する
NTFS圧縮ファイルへのアクセスはファイルシステムドライバーが同期アクセスに変換するため、非同期(OVERLAPPED)で開いても非同期I/Oにはならない
Procmonで$LogFileへの書き込み、ストリーム名付きのパス、リパース処理などNTFSの内部動作をリアルタイムに観察できる