File Allocation Table
ファイル・アロケーション・テーブル (テンプレート:En、FAT) とは、DOSのファイルシステム(および、その前身となったMicrosoft DISK-BASICのファイルシステム)におけるディスク内のファイルの位置情報などを記録するための領域である。これが転じて現在ではMS-DOSに採用されていたFATを用いるファイルシステムの名前としてもFATと呼ぶようになった(なおファイルシステム名としてのFATはDISK-BASICのものを含まないのが通例である)。
概要
オリジナルのFile Allocation Tableは1977年に、ビル・ゲイツとマーク・マクドナルドによって開発され、DISK-BASICの中のファイル管理仕様として採用された。
DISK-BASIC以降、MS-DOSのファイルシステムでもFATが採用され、MS-DOSがDOSとしてのデファクトスタンダードを確立し、さらにその後Windows NTで新しいファイルシステムNTFSを普及させた後も、FATを採用したファイルシステムは使われ続けている。
MS-DOS以降は、Windows Meまでの一般家庭向けのOSの標準ファイルフォーマットとして使用されていた。Windows NT系のOSでも使用可能であるが、他のWindowsからのアップグレードやリムーバブルメディアのために用意されているものであり、セキュリティなどの観点から必ずしも利用が推奨されておらず、FATを利用している状況下での動作制限も存在する。
フロッピーディスクの時代の設計を元にしてあるため、ディスク総容量に対し管理領域が少なくて済む、高速にアクセスできるなどの利点があるが、その反面、堅牢でない、大容量ディスクでは非効率、拡張性に乏しい、ファイル名が8文字+拡張子3文字までしか扱えない(VFAT非対応の場合)など様々な欠点がある。それでも、その特徴と実装の容易さ、読み書きできるオペレーティングシステムが多いことから、フロッピーディスクや小容量メモリーカード用のファイルシステムとして依然使われ続けている。現在はデジタルカメラやビデオゲーム機などでも広く使われている。
FATは、クラスタ番号の管理ビット数によって「FAT12」、「FAT16」、「FAT32」の3種類がある(なお、DISK-BASICでは8ビットであった)。Windowsでは、FAT32を除いてFATと表示している。また、稀に「FAT64」と言う記述を見かけることがあるが、これはWindows NTで使用可能なクラスタサイズが64キロバイトのFAT16を示し、クラスタ番号のビット数を示すものでは無い。
上記のようにリムーバブルメディアのファイルフォーマットとしてはFAT16またはFAT32が多く使用されているが、ボリュームとファイルのサイズ制限が問題になっている。このほか種々の問題を解決するため、exFATが開発された。
なお、VFATとexFATを除いた仕様は国際規格としてECMA-107とISO/IEC 9293として標準化されている。日本ではJIS X 0605規格として登録されている。
仕様
フロッピーディスク(後にハードディスクも)の記録単位としてセクタがあり、1以上のセクタをまとめてクラスタとして管理する。FATは言わばクラスタ番号による巨大な一次元配列であり、ディスクの最初から最終までのクラスタ番号ごとに、そのクラスタが使用中なのか、空き領域なのか(または、システム予約領域、バッドクラスタ:エラー)などの状態を保持する。
そして、ディスク上の1つのファイルは、1つ以上のクラスタの連鎖として管理される。すなわち、あるファイルの最初のクラスタ番号がディレクトリ・エントリに格納されており、ファイルの最初のデータはそのクラスタ番号の領域に格納されている。そして、最初のクラスタ番号に対応するFAT上のエントリは、その次に繋がるクラスタ番号を保持するか、またはそこが最終クラスタであるマークを保持している。
このように、FATはディスクの管理上、最重要なデータテーブルであり、もしこの情報が損なわれると、ディスク上のファイル等が正常に読み出せなくなってしまう。そのため、FATを実現しているファイルシステムでは、FATのテーブルの複数のコピーを保持するのが一般的である。
DISK-BASICの時代等は、FATはマウント命令によって主記憶に読み込まれて、ファイルの更新とともに主記憶上でだけ更新され、アンマウント命令によって初めてディスクへ書き戻されるのが一般的であった。これは、ファイルを更新するたびにFATに書き戻すことが無いよう、高速化を図った仕様ではあるが、他方、ユーザーのアンマウント命令の実行忘れにより、FATだけが古い状態のままになり、ファイルの不整合が生じてデータを損なう事故が多発した。
MS-DOS以降では、バッファリング・遅延書き込みにより、ディスクの最終書き込みまでにはFATを必ず自動的に書き戻す仕様になっているため、アクセスの途中にディスクを抜かない限りは、データ不整合が発生するおそれは殆どなくなり、マウント・アンマウントをユーザが意識することはなくなった(ただし、USB接続の大容量リムーバブルメディアの普及により、遅延書き込みのフラッシュの保証のために、「ハードウェアの安全な取り外し」として再認識されるに至っている)。
実装
FAT12 | FAT16 | FAT32 | exFAT | ||
---|---|---|---|---|---|
開発者 | マイクロソフト | ||||
正式名 | File Allocation Table | ||||
(12ビット ver) | (16ビット ver) | (32ビット ver) | extended バージョン | ||
導入 | 1977年, (Microsoft Disk BASIC) |
1987年11月, (Compaq DOS 3.31) |
1996年8月, (Windows 95 OSR2) |
Windows Embedded CE 6.0 | |
パーティション識別子 | 0x01 (MBR) | 0x04, 0x06, 0x0E (MBR) | 0x0B, 0x0C (MBR) EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 (GPT) |
0x07 (MBR)
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 (GPT) | |
構造 | |||||
ディレクトリ | テーブル | ||||
領域管理 | リンクリスト | リンクリスト、ビットマップ | |||
不良ブロック | クラスタタグ | ||||
限度 | |||||
最大ファイルサイズ | 32MiB | 2GiB 4GiB (NT) |
4GiB - 1 byte | 16EiB | |
クラスタサイズ | 512byte 〜 32KiB | 512byte 〜 32KiB(NT系では64KiB) | 512byte 〜 32KiB | 512byte 〜 32MiB | |
最大ファイル数 | 4,077 | 65,517 | 268,435,437 | ディレクトリ毎に 2,796,202 | |
最大ボリュームサイズ | 32MiB | 2GiB 4GiB (NT) |
2TiB 8TiB(2KiBセクタ) |
TBU | |
最大ファイル名長 | 8.3形式、または255文字 | 255文字 | |||
特徴 | |||||
記録可能なタイムスタンプ | 作成(精度は10ミリ秒)、修正(精度は2秒)、アクセス(精度は1日) (長いファイル名がサポートされている時のみ、作成時間とアクセス日付が更新できる) |
作成(精度は10ミリ秒)、修正(精度は10ミリ秒)、アクセス(精度は2秒) | |||
日付範囲 | 1980年1月1日 - 2107年12月31日 | ||||
フォーク | not natively | ||||
属性 | 読み取りのみ、隠し、システム、ボリュームラベル、サブディレクトリ、アーカイブ | ||||
ファイルパーミッション | 無し | 実装により可 (現在はWindows CE 6のみ) | |||
透過的圧縮 | ボリューム毎、Stacker、DoubleSpace (DriveSpace) | 無し | 無し | ||
透過的暗号化 | DR-DOSでのみボリューム毎 | 無し | 無し |
MS-DOS起源のFATファイルシステムの実装でも同様に、記憶ディスク上のセクタはクラスタと呼ばれる単位にまとめられ、1クラスタ内のセクタはディスク上では物理的に連続している。
FATはディスク上では最初の方に配置している(ブートローダ、システムイメージの次あたり)。FATとは別に、ルートディレクトリテーブルが存在する。これもFATの近傍に配置され、ルートディレクトリのディレクトリ・エントリを保持する。ディレクトリ・エントリは、ファイル名とファイルの属性、そのファイルを構成する最初のクラスタ番号を保持する。
なお、サブディレクトリ(サブフォルダ)は、ルートディレクトリ(およびサブディレクトリ)に存在する特殊なファイル・エントリとして実現される。すなわち、例えば\subdir は、ルート (\) ディレクトリーテーブルにsubdirのディレクトリ・エントリが存在し、かつ、そのエントリが表現するファイルそのものをディレクトリテーブルと見なして処理する。サブディレクトリのサブディレクトリ(例:\subdir\subdir)も同様である。
ともかく、ディレクトリ・エントリに記録された先頭クラスタ番号と、その番号が指し示すFAT上のエントリを組み合わせることにより、1つのファイルが複数のクラスタにまたがって存在する状況を記録している。
なお、FAT上のエントリには、続きのクラスタ番号の他に、一部予約番号も記録される。それは以下の通りである(以下の数値はFAT16の場合)。
- 0000h: 未使用クラスタである
- 0001h: (予約)
- FFF7h: 不良クラスタとしてマークされている
- FFF8h - FFFFh: 最後のクラスタである
なお、FATの多重化数は2である。ただし、通常は、多重化FAT間の不整合が、自動で検出されることはなく、手動で検査・修復プログラムを実行する必要がある。
FAT12
当初のFATファイルシステムは、現在はFAT12と呼ばれている。12ビットのクラスタ識別子を利用し、総クラスタ数は最大4084個である。クラスタサイズは512バイトから32KiBまで使用することが出来る。しかし、ボリュームの総セクタ数が16ビットで管理されているため、セクタサイズが512バイトの場合、ボリュームサイズは32MiBまでとなる。現在は主にフロッピーディスクのフォーマットとして残されている。
FAT16
FAT16は、16ビットのクラスタ識別子を利用したFATで、総クラスタ数は最大65,524個である。クラスタサイズは512バイトから32KiB(NT系では64KiB)まで使用できる[1]。ボリュームサイズは2GiB(NT系では4GiB)までとなる。当初はボリュームの総セクタ数がFAT12と同様に16ビットで管理されていたため、セクタサイズが512バイトの場合、ボリュームサイズは32MiBまでであったが、Compaq DOS 3.31で総セクタ数を32ビットで管理するように拡張され、この制限は取り払われた[2]。
MS-DOSは4.0以降で32ビットの総セクタ数に対応したが、日本国内ではPC-98用のMS-DOS 4.0は発売されず、32ビットセクタへの対応はMS-DOS 5.0まで待たされることとなった。代わりに、PC-98用のMS-DOS 3.3では、512バイトの物理セクタを4個まとめて2KiBの論理セクタとして扱うことで、128MiBまでのボリュームサイズに対応していた。
VFAT
VFAT (Virtual FAT) は「長いファイル名」(Long File Name, LFN)をFAT (12/16/32)で扱えるようにする拡張である。LFNでは、Windows NT 3.5[3]およびWindows 95から実装された機能で、これにより最大255文字(UTF-16 LEで処理されるので1文字2バイト)までのファイル名を付与できる[4](ただし、Windows 9x系では実装上255バイトまでしか扱えない)。ファイルシステム上はディレクトリエントリの扱いが若干異なる程度で、下位互換性も不十分ながら保たれている。
VFATはFAT互換の8.3形式の短いファイル名の直前のディレクトリエントリにボリュームラベルビットの立ったエントリが存在した場合、それがこのファイルの長いファイル名であると解釈する。そのため、従来のFATしかサポートしないOSからVFATを参照した場合には、短いファイル名のみが見えることとなり、一応のアクセスは可能となる。しかし、ファイルの書き込みを行ったり、MS-DOS時代のディレクトリエントリを最適化するプログラムやツールを使用した場合、長いファイル名が破壊されてしまうため、互換性が不十分であると言われている。
本稿ではVFATをLFNの拡張機能としているが、厳密にいうと、当初VFATとはWindows 3.1からWindows Meと引き継がれてきた仮想デバイスドライバの1つ (VFAT.VXD) を意味した。これは、(プロテクトモードで動作する)Windowsアプリケーション上からMS-DOSファイルをアクセスする時に、(リアルモードで動作する)MS-DOSシステムを呼ばずに済むようにするためのものである。初期のVFATドライバ(Windows 95よりも前)では、LFNをサポートしていない。
FAT32
FAT32は、Windows 95 OSR2で登場し、32ビット化されたFATである[5]。32ビットのクラスタ識別子を利用し管理するが、上位4ビット分は予約としており、28ビットでの管理となる。クラスタサイズは4KiBから32KiBまで使用できる。ボリュームサイズは理論上8TiBまでとなる[6]。しかし、ボリュームの総セクタ数を32ビットで管理(最大4,294,967,295)しているため、セクタサイズが512バイトの場合にボリュームサイズは2TiBに制限される。
クラスタは28ビットのため、論理上268,435,444個のクラスタを扱えるはずであるが、スキャンディスクの実装上の問題でWindows 9x系上では事実上4,177,920個のクラスタしか利用できない(32KiBクラスタ時、およそ124.55GiB)。なお、Windows 9x系に付属するパーティション作成ツールであるFDISKでは64GB以上のFAT32パーティションを作成できず、これに対応させる修正版が公開されている[7][6]。
Windows 2000からWindows NT系でも利用可能となったが、新規のフォーマット作業では意図的に32GiBまでの制限を設けている[8]。そのため、32GiBを超えるサイズのボリュームを作成するには、サードパーティー製のフォーマットツールを利用する必要がある。
exFAT
テンプレート:Main exFAT (Extended File Allocation Table)はWindows Embedded CE 6.0で導入されたフラッシュドライブ向けに最適化された新しい規格のFATである(従来のFATとの互換性はない)。NTFSの使用がオーバーヘッドから適切ではない用途に向け開発された。Transaction-Safe FAT File System (TFAT) の活用も可能である。Windows Embedded CE 6.0の下では TFAT はexFAT 上でのみサポートされる[9]。Windows XPとVistaでも、後に使用可能になった。Windows XPでは更新プログラム(SP1以前は利用不可)、VistaはService Pack 1でexFAT対応が追加される[10][11]。4GiBまでであった1ファイルあたりのサイズ制限は撤廃され、16EiBまで利用可能となる。実装次第でNTFSの様なセキュリティACLやジャーナルを備えることも可能となっている。また、8.3形式のファイル名は削除された。
脚注
関連項目
外部リンク
- FAT32 File System Specification
- Embedded FAT File System
- ECMA-107 Volume and File Structure of Disk Cartridges for Information Interchange
- KB118335:FAT16 ファイルシステムを使用したパーティションの最大容量
- KB154997:FAT32 ファイルシステムについて
- KB184006:Windows 2000 の FAT32 ファイルシステムの制限
- KB310525:Windows XP での FAT32 ファイルシステムについて
- KB418751:リムーバブルメディアの NTFS フォーマットについて