最終更新日 1999年8月17日
ひとつ上に戻ろう トップ・ページへ戻ろう

NTFS (Windows NT File System)

概要

 NTFSはその名が示す通り、Microsoft Windows NT Operating Systemのファイルシステムだ。 まずはその特徴を示す。なお、ここのページは「インサイド Windows NT 第二版」を参考文献とした。

回復性 Recoverable

 回復性とは、システムに障害が起こったときのファイルシステムの回復能力のことである(わかりにくいなあ)。

 NTFS(というか、Windows NT)はファイル処理、 すなわちファイルシステムのデータを書きかえるとか、 ディレクトリ構成を変更するようなI/O操作に対して、 「完全に実行するか、もしくは全く何もしないか (All or Nothing)」という政策を取る。 もし処理途中でシステムに障害が発生し、 その処理が中断されたのであれば、その中途半端な更新を取り消し(Roll back)、 そのファイル処理が発生しなかったかのように、ファイルシステムの整合性を保つ。

 また、重要なファイルシステムの情報は多重に記録され、 情報の一部分が破損してもデータを保つことができる。

セキュリティ

 UNIXと同程度のセキュリティ、および米国国防省が定めたC2基準を満たす。

データ冗長性とフォールト トレランス

 先にファイルシステムの回復性を書いたけど、 NTFSは、障害発生時にファイルシステムへのアクセスは保証するけど、 ユーザーデータまでは保証しない。保証したいならRAIDを組め、ということ。

大容量ディスクと大きなファイル

 NTFSはクラスタを64ビットで番号付けを行うため、 最大2の64乗バイト(弱)の大きさのファイルを作ることができる。

マルチデータストリーム

 ファイルシステムでは一般に、ファイル名、所有者、タイムスタンプ、 セキュリティ情報等の属性を持つが、NTFSでは任意の新しい属性(ストリーム)を追加できる。 また、ストリームは単なるバイト列で、ファイルのデータも属性のひとつでしかない。

 データストリームの参照は、そのファイル名の後ろにコロン(:)を付けて指定する形になる。 例えば、

myfile.dat:stream2

とすれば、myfile.datのstream2というストリームにアクセスできる。 やったことがないのでわからないけど、Autoexec.batというなんでもないファイルなんだけど、 Autoexec.bat:mp3と指定すればMP3のデータが取り出せたりするんだろう。 4MBもあるAutoexec.batというのも嫌だけど。

 この機能は実際に、Windows NT Serverに付属するApple Macintoshファイルサーバで使われている。 いわゆる「マックバイナリ」をストリームに保存しているのだ。

Unicodeベースの名前

 ファイル名の保存にUnicodeを使ってる。

総合的なインデックス機能

 ファイルのインデックス情報を持つことができるので検索が早い。

動的な不良クラスタのリマッピング

 題名のまま。

POSIXのサポート

 同じく。


内部構造

 次は少し詳しく、その構造を説明してみる。

ヴォリューム

 ヴォリューム(volume)とはDOSやUNIXでいうところのパーティションのことだと思っていい、 と思う。言葉の言い換えが多いな。同じように、ひとつのHDDを複数のヴォリュームに分けたり、 複数のヴォリューム、HDDに渡るヴォリュームを作成できる(つまりRAIDを組める)。

 FATでは、ファイルの管理領域としてFATが特別にフォーマットされているが、 NTFSではMFT(FATのFATにあたるもの)、ディレクトリ、システムブートストラップ等、 すべてのファイルシステムデータは通常のファイルとして保存されている。美しい。

クラスタ

 クラスタとはファイルシステムで扱う情報の最小単位であり、 NTFSではセクタの2のべぎ乗倍(1セクタ、2セクタ、4セクタ、8セクタ等)の値を取り、 512バイト、1KB、2KBなどのように、1クラスタあたりのバイト数で表される。

 小さなヴォリュームではデフォルトのクラスタサイズは512バイトをとる。 ただし、もちろんセクタサイズが512バイトより大きければ、その値となる。 そして、1GB以下のヴォリュームで1KB、2GBまでは2KB、 2GBより大きい場合は4KBとなるが、ヴォリュームのフォーマットの際、 ユーザが指定もできる。

 NTFSではディスク上の物理的な位置を、論理クラスタ番号(LCN)を使用して参照する。 LCNとはヴォリュームの最初から最後までのクラスタにつけられた通し番号で、 実際の位置(セクタ番号)を得るにはLCNにセクタサイズをかけた値を用いる。 また、ファイル中のデータを参照する場合は仮想クラスタ番号(VCN)を用いる。 VCNとは、あるファイルに対して仮想的な番号、0からmまでのクラスタ番号を振ったものだ。 しかし、VCNは物理的に連続している必要はなく、 ヴォリューム上の任意のLCNにマッピングすることができる。

マスターファイルテーブル

 NTFSでは、ファイルの位置を保存しておくためのデータ構造、 ブートストラップデータ、ヴォリュームの情報を記録するビットマップ等を含め、 ヴォリューム上のデータは、すべて一般ファイルとして保存される。 もう一度書くけど、美しい。オブジェクト指向だ。 それらを一般ファイルとすることで、保存位置の検出や維持を簡単にし、 ディスクに障害が起こったときは、MTFをファイルとして移動すれば良い。

 マスターファイルテーブル(MFT)はファイルレコードの配列として実装され、 各ファイルレコードの大きさはクラスタサイズの大きさに関係なく1KBである。 MFTにはヴォリューム上の各ファイルごとにひとつの行があり、MFT自身の行も含まれている。 またMFTの他に、そのファイルシステムを構成するための情報を持った、 いくつかのメタデータファイルも含まれる。NTFSのメタデータファイルは$で始まるファイル名を持ち、 例えばMTFは$MTFというファイル名を持つ。この記号は隠されている。

 ログファイル(ファイル名は$LogFile)は、 ファイルの作成やディレクトリの構成を変更するコマンドを含むNTFSのヴォリューム構造に影響を与えるすべての操作を記録する。 このログファイルは、システム障害の後でヴォリュームを復旧する際に使われる。

 ヴォリュームのクラスタの割り当て状態はビットマップファイル($Bitmap)に記録される。
ブートストラップコードもブートファイル($Boot)として保存されている。

 さらに、不良クラスタを保存しておくための不良クラスタファイル($BadClus)、 ヴォリュームに関する情報を保存しているヴォリュームファイル($Volume)、 またファイルの属性の情報を持つ属性定義ファイル($AttrDef)も持つ。

 これらのメタデータファイルは隠し属性であるが、

C:¥dir /a:h $mft

などとすると見ることができる。

ファイルリファレンス番号

 よくわからん。

ファイルレコード

 先にも述べたように、NTFSではファイルは属性と値の組み合わせの集まりとして記録され、 そのうちのひとつ(名前なしデータ属性)にそのファイルのデータが保存される。 ちょっと変な言い方だけど。ファイルに含まれる標準的な属性には、標準情報、 ファイル名、セキュリティ記述子、データ、インデックスルート、属性リスト等がある。

ファイル名

 NTFSでのファイル名は最大255文字で、 Unicodeで保存される(んが、2バイト255文字ではないだろう、多分)。 POSIXサブシステムと同程度の名前が付けれるそうだが、そうでもない気がする。 また、MS-DOSとの互換のために、8.3フォーマットのファイルネームも作成する。 ハードリンクも同じ方法で実装されているが、 ファイルがNTFS名とそれから自動生成されたMS-DOS名を持つもつ場合は、 どちらかのファイル名で削除すれば、ファイルも削除される。

常駐属性と非常駐属性

 MTFに保存されている属性は常駐属性、それ以外は非常駐属性。 ここら辺は美しくない。

ファイル名のインデックス

 NTFSではディレクトリは単なるファイル名のインデックスで、 b+ツリー(バイナリ木)構造を取っている。このため、ファイル名の検索は速いけど、 書き込みは遅くなる(ファイル名でソートしなくてはいけない)とおもうんだけど、 ただ「検索は速い」としか書いてない。

データ圧縮

 ファイル単位、ディレクトリ単位、ヴォリューム単位で圧縮できるんだって。 んが、それはファイルシステムが面倒見ることなのかなあ、と思う。


思ったこと

 NTFSは美しい部分もある反面、かなり面倒くさい。