File Allocation Table (ファイル・アロケーション・テーブル、FAT 、日: ファイル割当て表[ 1] ) とは、MS-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」[ 2] または「exFAT」[ 3] を示し、クラスタ番号のビット数を示すものでは無い。
上記のようにリムーバブルメディア のファイルフォーマット としてはFAT16またはFAT32が多く使用されているが、ボリュームとファイルのサイズ制限が問題になっている。このほか種々の問題を解決するため、exFATが開発された。
なお、VFATとexFATを除いた仕様は国際規格としてECMA -107とISO /IEC 9293として標準化されている。日本ではJIS X 0605規格として登録されている。
仕様
フロッピーディスク (後にハードディスク も)の記録単位としてセクタ があり、1以上のセクタをまとめてクラスタとして管理する。FATは言わばクラスタ番号による巨大な一次元配列 であり、ディスクの最初から最終までのクラスタ番号ごとに、そのクラスタが使用中なのか、空き領域なのか(または、システム予約領域、バッドクラスタ:エラー)などの状態を保持する。
そして、ディスク上の1つのファイル は、1つ以上のクラスタの連鎖として管理される。すなわち、あるファイルの最初のクラスタ番号がディレクトリ ・エントリに格納されており、ファイルの最初のデータはそのクラスタ番号の領域に格納されている。そして、最初のクラスタ番号に対応するFAT上のエントリは、その次に繋がるクラスタ番号を保持するか、またはそこが最終クラスタであるマークを保持している。
このように、FATはディスクの管理上、最重要なデータテーブルであり、もしこの情報が損なわれると、ディスク上のファイル等が正常に読み出せなくなってしまう。そのため、FATを実現しているファイルシステムでは、FATのテーブルの複数のコピーを保持するのが一般的である。
DISK-BASICの時代等は、例えばN-DISK-BASIC の場合、FATはマウント命令(BASICのコマンド名はMOUNT
)によって主記憶に読み込まれて、ファイルの更新とともに主記憶上でだけ更新され、アンマウント命令(BASICのコマンド名はREMOVE
)によって初めてディスクへ書き戻されるのが一般的であった。これは、ファイルを更新するたびに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 、セクタサイズが512バイトより大きい場合は 256KiB )
512byte 〜 32KiB (NT系では64KiB 、セクタサイズが512バイトより大きい場合は 256KiB )
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)まで使用できる[ 4] 。ボリュームサイズは2GiB(NT系では4GiB)までとなる。当初はボリュームの総セクタ数がFAT12と同様に16ビットで管理されていたため、セクタサイズが512バイトの場合、ボリュームサイズは32MiBまでであったが、Compaq DOS 3.31で総セクタ数を32ビットで管理するように拡張され、この制限は取り払われた[ 5] 。
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までのボリュームサイズに対応していた。また、セイコーエプソン がPC-286 シリーズ用のMS-DOS4.01を発売しており、これをPC-9800シリーズで使うこともできた。
VFAT
VFAT (Virtual FAT) は「長いファイル名 」(Long File Name, LFN) をFAT (12/16/32)で扱えるようにする拡張である。LFNでは、Windows NT 3.5 [ 6] およびWindows 95 から実装された機能で、これにより最大255文字(UTF-16 LEで処理されるので1文字2バイト)までのファイル名を付与できる[ 7] (ただし、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である[ 8] 。32ビットのクラスタ識別子を利用し管理するが、上位4ビット分は予約としており、28ビットでの管理となる。クラスタサイズは4KiBから32KiBまで使用できる。ボリュームサイズは理論上8TiBまでとなる[ 9] 。しかし、ボリュームの総セクタ数を32ビットで管理(最大4,294,967,295)しているため、セクタサイズが512バイトの場合にボリュームサイズは2TiBに制限される。
クラスタは28ビットのため、論理上268,435,444個のクラスタを扱えるはずであるが、スキャンディスク の実装上の問題でWindows 9x系 上では事実上4,177,920個のクラスタしか利用できない(32KiBクラスタ時、およそ124.55GiB)。なお、Windows 9x系に付属するパーティション作成ツールであるFDISKでは64GB以上のFAT32パーティションを作成できず、これに対応させる修正版が公開されている[ 10] [ 9] 。
Windows NT系ではWindows 2000 から利用可能となったが、新規のフォーマット作業では意図的に32GiBまでの制限を設けている[ 11] 。そのため、32GiBを超えるサイズのボリュームを作成するには、サードパーティー 製のフォーマットツールを利用する必要がある。
Windows11のあるバージョンからは32GiBの上限が無くなる[ 12] 。
exFAT
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 上でのみサポートされる[ 13] 。Windows XPとVistaでも、後に使用可能になった。Windows XPでは更新プログラム(SP1以前は利用不可)、VistaはService Pack 1でexFAT対応が追加される[ 14] [ 15] 。4GiBまでであった1ファイルあたりのサイズ制限は撤廃され、16EiB まで利用可能となる。実装次第でNTFSの様なセキュリティACL やジャーナル を備えることも可能となっている。また、8.3形式のファイル名は削除された。
脚注
関連項目
外部リンク
ディスク
ネットワーク型 特殊用途
その他
カテゴリ