FAT

読み:ファット
外語:FAT: File Allocation Table 英語
品詞:名詞

Microsoftが開発し、MS-DOSで普及し、後にMicrosoft Windowsで拡張を重ねて使用されているファイルシステム(ディスク管理方法)の一つ。

目次

由来

FATは、ビル・ゲイツと、Microsoft初の給与従業員だったMarc B. McDonaldによって発案、開発されたファイルシステムである。

初期のものはクラスター番号を8ビットで表現しており、このためFAT8とも呼べるものだったが、当時も今も、そのような呼び方はしていなかったようである。

このシステムはMicrosoftのDisk BASICで採用され、日本でも、PC-8000シリーズPC-8800シリーズなどのDISK BAISCで採用されていた。

その後、クラスター番号長が10ビットや12ビットに拡張されたが、MS-DOS用として最初に導入されたものが12ビット長であり、これがFAT12として広く普及することになった。

N-BASIC

まだFATとは一般に呼ばれていなかった頃、PC-8000シリーズPC-8800シリーズのDISK BAISCでこのファイルシステムは使われていた。

ファイルシステムとは直接関係がない話ではあるが、中でもPC-8001のN-BASICの実装は、FAT情報をメモリーに置いており逐一ディスクに書き込まないことを特徴とした。ディスクを取り出す前にremoveをしてフラッシュする必要があり、これを忘れるとファイルシステムを破損した。不便だったため、88以降では不要になった。

86-DOS(QDOS)→MS-DOS

Tim Patersonが開発した86-DOS(QDOS)、これを買収して開発されたMS-DOSは、共にファイルシステムとしてFATを採用している。

86-DOS(QDOS)はCP/Mを参考に開発されていたが、コード自体は完全なオリジナルでCP/Mからの流用はなかった。そしてファイルシステムは、CP/M互換ではなく、当時彼が使用していたBASIC-86との互換性のため、8ビットのFATを採用した。

そしてMS-DOS 1となったとき、12ビットのFATとして出荷されたのである。

国際標準

FAT12/FAT16の二種類は、ECMA-107およびISO/IEC 9293として国際標準となっている。日本語規格はJIS X 0605が相当する。

FATの特許等は当然Microsoftにある(あった)と思われるが、FAT12/FAT16については、広く普及はしたが特に特許料などは要求してこなかった。

2003(平成15)年頃には、FAT32やVFATなど、まだ特許件が残存していそうなものを根拠にしてか、ライセンス料を要求しようという話が出たこともある。その後どうなったかは不明。

構造

ディスクは、次の領域に分けられる。

ディスク上の領域は、クラスターと呼ばれる単位で管理される。このクラスターのつながり状態(リンク情報)をFAT領域に記録することで、データ領域にある実際のデータがディスク上にどのように存在するのかを管理することができる。

クラスター

ディスクはセクターと呼ばれる単位で構成され、幾つかのセクターをまとめてクラスターとする。

ファイルシステムは、セクター単位ではなく、クラスター単位でディスクを管理するが、このクラスター番号を記憶するサイズ(ビット数)に、FATには幾つかの種類がある。

使用するビット数が多いほど、扱えるクラスター数が増え、大容量ディスクを効率良く管理することができる。

ビット数が多い分だけ管理できるクラスター数が増え、大容量ディスクが扱えることになるが、その分FAT情報領域が増えてディスク容量を消費してしまうため、媒体の容量に応じたビット数が使われる。

種類

クラスター番号長が増えるほど、管理可能な容量は増えていく。

機構

ファイルの名称等の情報は全て「ディレクトリエントリ」に格納される。

サブディレクトリのディレクトリエントリはファイルと同様の管理が内部でされているが、ディレクトリエントリに「ディレクトリである」というフラグが付けられている。

FATにおける基本的な仕様は次の通り。

  • 8.3形式のファイル名
  • CP/M互換の圧縮日時情報により最小誤差2秒 (2107年12月31日まで対応)
  • ファイルの属性
  • ファイルのサイズ
  • ファイルの開始クラスター

FATには、2108年問題が存在する。

ファイルの属性

ファイルの属性は、次の種類がある。

エントリの構造

MS-DOS

ディレクトリエントリは一つにつき32バイトであり、次の順に格納される。

  • ファイル名(8バイト)
  • 拡張子(3バイト)
  • ファイル属性(1バイト)
    • ビット7: 未使用(0)
    • ビット6: 未使用(0)
    • ビット5: アーカイブ属性
    • ビット4: ディレクトリ属性
    • ビット3: ボリューム属性
    • ビット2: 隠し属性
    • ビット1: システム属性
    • ビット0: 読み取り専用属性
  • 予約(10バイト)
  • 作成時刻(2バイト)
  • 作成日付(2バイト)
  • 先頭クラスター(2バイト)
  • ファイルサイズ(4バイト)

この構造は、CP/Mの構造の上位互換である。

Windows NT以降で、予約領域が拡張されている。

Windows NT以降

Windows NT以降では、従来未使用だった領域に情報が書き込まれるようになった。

以下は、Microsoft Extensible Firmware Initiative FAT32 File System Specificationによる。

  • DIR_Name (短いファイル名)
  • DIR_Attr (ファイル属性) (1バイト)
    • ビット7: 未使用(0)
    • ビット6: 未使用(0)
    • ビット5: アーカイブ属性
    • ビット4: ディレクトリ属性
    • ビット3: ボリューム属性
    • ビット2: 隠し属性
    • ビット1: システム属性
    • ビット0: 読み取り専用属性
  • DIR_NTRes (Windows NT用予約) (1バイト)
    • 常に0
  • DIR_CrtTimeTenth (ファイル作成ミリ秒) (1バイト)
  • DIR_CrtTime (ファイル作成時刻) (2バイト)
  • DIR_CrtDate (ファイル作成日付) (2バイト)
  • DIR_LstAccDate (ファイル最終アクセス日付) (2バイト)
  • DIR_FstClusHI (先頭クラスターHI) (2バイト)
  • DIR_WrtTime (最終更新時刻) (2バイト)
  • DIR_WrtDate (最終更新日付) (2バイト)
  • DIR_FstClusLO (先頭クラスターLO) (2バイト)
  • DIR_FileSize (ファイルサイズ) (4バイト)

日時関係は、次の仕様となる。

  • 作成日時 (ミリ秒単位)
  • 最終アクセス日 (日単位)
  • 最終更新日時 (2秒単位)

最終アクセス日はDIR_LstAccDateに記録されるが、時刻は保存されない。但し書き込みをした場合、DIR_WrtTimeに時刻が書き込まれる。

なお、最終更新日時とされる情報は、旧来のシステム(MS-DOSの時代)にはファイル作成日として使われていた。

ロングファイル名

Windows 95以降で対応したロングファイル名も、同様に1つ以上のディレクトリエントリを用いて情報を記録する。

この旧来に対する拡張情報は、ファイル属性(R+H+S+V)とした特殊な領域に格納される。これは互換性を考慮した結果と思われる。

OSからはVFATという仮想レイヤーを経由してアクセスされる。結果としてディスクがFATであれば、従来と互換性を保つために特殊な隠しファイルとしてファイル属性(R+H+S+V)としたものをディレクトリエントリに書き込む。

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club