NT File System

NT File System  とは、Windows NT系の標準ファイルシステムである。

1. 歴史
-----

1.1. バージョン
----------

NTFS 1.0 - Windows NT 3.1で使用されたバージョン。
NTFS 1.1 - Windows NT 3.51で使用されたバージョン。
NTFS 1.2  - Windows NT 4.0で使用されたバージョン。
NTFS 3.0  - Windows 2000で使用されたバージョン。
NTFS 3.1  - Windows XP以降で使用されているバージョン。括弧内はそれぞれが実装されたWindows NT系のバージョン。NTFSのバージョンとして呼ばれることがある。

1.2. 互換性
--------

NTFS 1.2とNTFS 3.xとの間には互換性が無く、Windows NT 4.0上からNTFS 3.xにアクセスするには、Service Pack 4以上を適用する必要がある。また、Windows 2000以降で、自身が使用しているバージョンよりも前のバージョンのNTFSにアクセスすると、その時点で自身が使用しているバージョンに変換する。

PC/AT互換機のパーティションテーブルIDが、HPFSと同じであるため、登場当初はディスク ユーティリティが誤動作することがあった。

1.3. 後継
-------

サーバ向けにマイクロソフトはWindows Server 2012においてNTFSの欠点を解消したReFSを導入している。HomeやProバージョンでは今後もNTFSが使われていく予定である。

2. 特徴
-----

大容量1ボリューム当たりの推奨最大サイズは、2 TiBであるが、それ以上のファイルシステムも作成可能である。検索の高速化ファイルの管理はB+木で行われ、大量のファイルが存在していても、検索やアクセス速度の低下が少ない。長いファイル名MS-DOSの「ファイル名 8バイト + 拡張子 3バイト」から、ファイル名・拡張子にとらわれず、Unicodeで最大255文字のファイル名を付けることができるようになった。POSIXサポートアメリカ合衆国政府のコンピュータ納入の条件としてPOSIXサポートが必須条項であったため、NTFSはPOSIX.1仕様の環境を提供する。これには、ファイル名やディレクトリ名の大文字と小文字の区別やアクセス権、ハードリンク、互換性を持つタイムスタンプのサポートが含まれる。代替データ ストリームNTFSは、一つのディレクトリ エントリに対して、複数のデータ ストリームを持つことができる。これはMacintoshで使われるHFS+におけるマルチ フォークに相当する機能で、ファイルの概要情報やアクセス制御リストなどはこの機能を利用してディレクトリ エントリに結び付けられている。

2.1. 頑健性とセキュリティ
---------------

堅牢性の向上突然の電力供給停止などの障害が発生した場合、トランザクションログから、実行した処理をロールバックし、ファイルシステムの不整合を発生させないジャーナリングファイルシステムをサポートしている。耐障害性ハードディスク内の不良セクタを動的に認識する。以降そのセクタを含むクラスタに対するアクセスは別のクラスタに代替されるようになる。冗長性のあるダイナミック ボリュームまたは記憶域スペースを使用していなかった場合、不良セクタにあったデータは回復されない。セキュリティの向上ファイルやディレクトリごとにACLによるアクセス権の設定が可能である。また、ファイルアクセスの監視を行う設定も可能である。ディスククォータWindows 2000以降のNTFSは、ユーザーごとのディスクの使用量の上限を設定できる。Windows Server 2003 R2からは、ディレクトリごとのディスクの使用量の上限を設定することができるようになった。暗号化Windows 2000以降のNTFSは、Encrypting File Systemをサポートし、NTFSボリューム上のファイルとフォルダの透過的な暗号化をサポートしている。これは圧縮機能の一実装であり、暗号化されたファイルやフォルダは常に圧縮されている。暗号化を利用した場合、自分自身の証明書を失うとシステム管理者を含めて誰も永久にアクセスできなくなる。スナップショットWindows XPおよびWindows Server 2003以降では「ボリュームシャドウコピーサービス」 と称するスナップショット機能が導入された。Windows付属のバックアップ ユーティリティ  はボリュームシャドウコピーサービスを利用しており、ある時点のボリュームの状態を正確にバックアップできる。Windows Server 2003 Service Pack 1以降のWindowsではChkdskにVSSを利用し正確なチェックが行えるようになり、本来なら修復が不要なボリュームをオフラインにせずに済むようになった。また、Windows Server 2003やWindows Vistaにおいては、ボリュームシャドウコピーサービスによってファイルの世代別保存を実現する。変更ジャーナル
ファイルに対する変更を記録する。

2.2. 容量効率の向上
------------

Windows NT 3.51からサポートされたファイル圧縮をNTFSもサポートしている。LZNT1アルゴリズムを使用したファイル単位での透過的な圧縮をサポートし、ディスクの空き領域を増加させることができる。ただし、4 KiBを超えるアロケーション ユニット サイズでは圧縮機能を利用できない。

加えて、スパースファイルもサポートする。ファイルの一部が0で埋められている場合、クラスタ単位で0で埋められている領域をスキップし、ディスク容量を節約する。これはデータベースのハッシュテーブル ファイルや仮想マシンの仮想ハードディスク ファイルなど大部分が0で埋められているファイルで効率よく働く。

NTFSには小さなファイルをファイルのメタデータと一緒にMFT内に収める機能がある。これはアロケーション ユニットを割り当てない事による若干の容量面のメリットとユーザーデータの読み取りにメタデータとは別のI/Oを必要としない速度面のメリットがある。

ファイル数は少ないが巨大なファイルを格納したいと思うなら、最大2048 KiB のアロケーション ユニット サイズを選択できる。これにより、断片化の問題、管理領域とデータ領域の比率など、ファイルシステム性能を左右する問題を解決する。

NTFS圧縮やスパースファイルの使用、極度の断片化によるエクステント リストを使い切ってしまう状況に対応するためのオプションが有り、これの使用によって規定では1 KiBのファイルレコードを4 KiBまで増加させることができる。副次的な効果としてMFT内に収められるユーザーデータも増加する。

なお、2010年時点でのNTFSの実装では、クラスタ数は232-1までとなっている。このため、16 TiBを超えるボリュームは、4 KiBを超えるアロケーション ユニット サイズを指定しなければならない。サポートされているアロケーション ユニット サイズは2048 KiB までである。したがって、NTFSボリュームは8 PiBまでの制限がある。また、OSのバージョンと容量によってはシャドウ コピー機能に制限がある。

2.3. 後方互換性
----------

仮想DOSマシン上で動作するソフトウェアに対して、ファイル システム上で一意なパス名であることを保証した8.3形式ファイル名を保存することができる。この機能は任意に有効・無効を設定することができるので、NTFSのファイルシステム最適化の代表的なものとされるが、非推奨とされていた。Windows 7では有効・無効をボリューム単位で設定できるようになりシステムボリュームでは有効、データボリュームでは無効といった運用が可能となった。Windows 8ではパフォーマンス上の理由により8.3形式のファイル名は非推奨となりフォーマット時の規定値がシステムボリュームを除き無効となった。

原則としてファイル名の大文字小文字は区別されるが、サブシステムがこの機能の有効無効を選択している。Win32サブシステムではファイル名の大文字小文字は区別されず、ファイル名の大文字小文字が異なるファイルを上書きした場合は、最後に使われたファイル名のファイルが保存される。POSIX・Interixサブシステム・Windows Subsystem for Linuxではファイル名の大文字小文字は区別され、ファイル名の大文字小文字が異なるファイルは上書きされず別のファイルとして保存される。

さらに高度な応用としてファイル システム フィルターを備え、ファイルシステム機能やファイルシステム上の名前空間を任意のソフトウェアでオーバーライドできる。この機能をもとに圧縮機能・暗号化機能・ファイル変更ジャーナル・スナップショット機能・クォータ機能をサブシステムを含むユーザー プロセスからは何ら変更の無いアクセスで利用できる透過的な実装が行われたほか、サードパーティによるファイル システムに対するフォレンジック監査の実装などに活用されている。

2.4. チェックと修復
------------

Windows NT系には、ファイルシステムの論理エラーまたは物理エラーの確認およびファイルシステムの修復コマンドとして、「chkdsk」コマンドが用意されている。実際にファイルシステムの修復を行うには、「chkdsk 〈対象ボリューム〉 /f」を、不良クラスタの修復を試みるには、「chkdsk 〈対象ボリューム〉 /r」を実行する。

ファイル数の増加に伴う chkdsk の実行時間の増加に対しWindows 8では従来のメタデータの走査とエラーの修復の両方をボリュームをオフラインにして行う方式からメタデータの走査とエラーの記録をオンラインで行いエラーの修復のみをオフラインで行う方式に変えた為、ボリュームのダウンタイムはデータ量には依存しなくなった。

また、NTFSはMFTの「$BadClus」ファイルに不良クラスタの情報を記録しているため、不良クラスタを含むパーティションをパーティションコピーツールなどで丸ごと他のハードディスクにコピーすると、「$BadClus」ファイルもそのままコピーされてしまい、新しいハードディスクには不良クラスタが存在しないにもかかわらず、chkdskでは不良クラスタが存在しているように見えることがある。これを修復してリセットするには、「chkdsk 〈対象ボリューム〉 /b」を実行する。

ファイルシステム上の不良クラスタとS.M.A.R.T.におけるバッドセクタは別物である。

なお、chkdskによるNTFSの修復により、ディスク エラーの状況が悪化する場合があるため、修復の前に重要なファイルはバックアップしておくことが推奨される。また、chkntfsコマンドを使用することで、Windows起動時に自動的にchkdskを実行したり、自動実行をキャンセルしたりすることができる。

2.5. 欠点
-------

2.5.1. フラグメンテーション
-----------------

これはNTFSの欠点ではなく、ファイルシステムという仕組みの性質であるが、データの削除やデータサイズの増減を許容するファイルシステムでは、それら操作時の必要に応じてコンパクションを行わない限り、いずれかの段階でフラグメンテーションが発生する。NTFSはFAT32と比較しフラグメンテーションしにくい。その根拠としてMFT機能が挙げられている。フラグメンテーションの量はアロケーション ユニット サイズに反比例し、最も小さなアロケーション ユニット サイズの512バイトで最も顕著になる。

FATよりは軽度とされたそのフラグメンテーションの実体は、Diskeeperのレポート機能などによって一般に知られるようになった。Windows 2000からNTFS対応のデフラグ ツールがWindowsに標準搭載された。

2.5.2. 機能制限
-----------

Windows XPおよびそれ以前のWindowsでは、NTFSボリュームをマウント状態にしたままでメンテナンスすることができない。Windows Vista以降ではデフォルトでバックグラウンドメインテナンスが行われている。
POSIX.1仕様ではシンボリックリンクが明記されていないことから、当初はシンボリックリンクをサポートしていなかった。その代わり、「ジャンクション」という類似の機能があるが、これはボリュームおよびフォルダに対してのみ提供される。Windows NT系ではハードリンクはサポートされており、Windows XPではコマンドラインから操作できる。Windows Vistaからシンボリックリンクにも対応するようになった。ジャンクションやシンボリックリンクは、リパース ポイントと呼ばれる機能によって実現されている。

2.5.3. コードページ
-------------

基本的にはファイル名はUCS-2で格納される。ここでファイル名を非UNICODE文字種とUNICODEで参照した場合、名前の不一致が発生する。名前の不一致はコードページに依存し、名前空間の一貫性を損なってしまう。原則として厳密に名前空間を取り扱うのであれば、UNICODEでアクセスすべきで、ロケール依存コードページによってアクセスすべきではない。慣例的にコードページ依存文字を使うftpなどのプロトコルの取り扱いは注意を必要とする。

2.5.4. アクセスタイム
--------------

NTFSは従来のMS-DOSファイルシステムにはない、ファイル最終アクセス時刻を記録する。その為ファイルを読みだしただけでもディスクへの書き込みが生じる。このリード・モディファイ・ライトの特性が悪い方向に働くケースはいくつかある。一つは小さなたくさんのファイルへのアクセスでファイルシステムの性能を、範囲=ひどいときには25%まで低下させてしまう。もう一つはフラッシュメモリを使ったデバイスにアクセスした時に頻繁にページのフラッシュを発生させ、やはりファイルシステムの性能を低下させてしまう。Vista以降最終アクセス時刻は既定で更新されない。

3. Windows NT系以外からのアクセス
-----------------------

NTFSは元々、Windows NT系におけるサーバ用途を目的として開発されたファイルシステムであり、MS-DOSから使われてきたFATと互換性を持たない。そのため、クライアント向けのOSであるWindows 9x系からアクセスすることはできない。

Windowsでは標準となったNTFSだが、マイクロソフトの戦略やセキュリティにより、その仕様が一般には公開されていない。有志によって不完全ながらもNTFSにアクセスするための手段が用意されているが、他のOSからの読み書きするにはリスクが生じる。マイクロソフトではファイルの受け渡しに使われるフラッシュドライブ向けに最適化されたexFATの仕様を公開している。

mountmacOS、Linuxカーネル 2.4以降と FreeBSDなどは、「mount -t ntfs」コマンドによって読み取りのみサポートしている。また、Linuxカーネル 5.15以降では「mount -t ntfs3」コマンドによって読み書きをサポートしている。NTFS-3GNTFS-3Gは、Tuxera社が開発しているNTFSドライバであり、NTFSパーティションへの読み書きに対応している。マイクロソフトと知的所有権の合意のもとで開発されていることから、他の実装と比較し、安定した読み書きが行えるとされる。各種Linux、FreeBSD、macOS、BeOS 上で動作する。オープンソースかつフリーである。実際にはユーザー アクセス手段の実装であるFilesystem in Userspace  も併せてインストールする必要がある。Captive NTFSCaptive NTFSは、NTFSパーティションの読み書きに対応。使用するにはWindows内のドライバが必須。NTFS for Windows98NTFS for Windows98は、Windows 98からNTFSにアクセスするソフトであったが、Windows 9x系のサポート終了に伴い提供を終えた。市販のアクセス ドライバ「[1]」 macOSに対応している。

4. 脚注
-----

5. 関連項目
-------

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

6. 外部リンク
--------

[2] - NTカーネルおよびNTFSに関するメンテナンス ツールを提供している。