• 誰が太ってる?

プレビュー版WindowsBuild 27686(Canaryチャンネル)では、FormatコマンドでFAT32の容量制限が外されて、最大2ギガバイトまでに引き上げられた。公開されているのがCanaryチャンネルなので、標準版Windows 11に搭載されるのは、少なくとも今年秋に公開予定のVer.24H2よりも後になる。なお、解除されるのは、フォーマットコマンドに課せられていた制限で、ファイルシステムとしての制限ではないことに注意されたい。今でも32ギガバイトを越えるFAT32ファイルシステムにはちゃんとアクセスが可能だ。

FATとはFile Allocation Tableの略で、クラスタに対応したテーブル領域があり、各クラスタの位置には、ファイル内容を記録する次のクラスタ番号が記録されている(図01)。一般にこれをリンクテーブルという。ファイル名などを管理しているディレクトリテーブルが、先頭のクラスタ番号を持っているため、これを使って、ファイルを構成するすべてのクラスタを辿ることができる。最後のクラスタには、終わりを示す特殊なクラスタ番号が記述されている。もともとDisk BASIC時代にフロッピーのフォーマットとして開発されたものが始まり。これを改良してMS-DOSに採用した。最大クラスタ数に応じて、FAT12、FAT16、FAT32があり、それぞれFAT内のクラスタに12、16、32 bitを割り当てていた。初期には相手がフロッピーだったため、それほど高速化を意識しているわけではない。また、エラー対策としては、テーブルを2つ持ち、バックアップ用の2つ目のテーブルを更新してから、1つ目のテーブルを更新していた。これにより、途中でエラーが起きたとしても、2つ目のテーブルに記録が残る可能性がある。

  • 図01: FAT32の簡易な構造図。ファイルディレクトリが最初のクラスタ番号を持ち、File Allocation Table中から該当のエントリを探すと、そこには、次のクラスタの番号が記録されている。こうしてファイルを構成するすべてのクラスタを辿ることができる。最後のクラスタには、特殊なクラスタ番号(0xFFFFFFFFなど)が記録されている

そもそも、FAT32は、能力的には最初から2テラバイトまでのボリュームを扱うことができた。当時のハードディスクやフロッピーで標準的な512バイト/セクタを最大2の32乗個まで管理できた。これは、当時のMBRパーティションテーブルのパーティション最大値である。

8192バイト/クラスタの場合、最大2の28乗個のクラスタを扱え、2テラバイトのボリューム容量となる(図02)。このときの総セクタ数は2の32乗になり理論的な限界値である。

  • 図02: FAT32のFile Allocation Tableには、最大で2の28乗個のエントリを含むことができる。1クラスタが8192バイトの場合、これは2テラバイトになる。このとき、総セクタ数は、2の32乗個となってFAT32の最大セクタ数やMBRパーティションテーブルの最大サイズと等しくなる

しかし、1999年のWindows 2000に搭載されたとき、Formatコマンド(およびエクスプローラーのフォーマット機能)では、意図的に最大容量が32ギガバイトまでの制限が付けられることになった。ただし、制限はWindows標準のフォーマットコマンドでのもので、サードパーティのフォーマットコマンド(たとえばUSBメモリメーカーの提供するものなど)を使えば、32 ギガバイト以上のFAT32ファイルシステムを作成することができ、Windowsは、これを正しくアクセスできる。

どうして制限が付けられたのかについては明らかになっていないが、1990年台から2000年台前半まで、ストレージデバイスやファイルシステム、ストレージ・インターフェース、BIOSは激変の時代だった。

というのも、PCが普及するにつれ、メーカー独自だったハードディスク・インターフェースがIDE、ATAと統一され、大容量化が進む。それに応じて、PC側は、BIOS/ファームウェアの変更やファイルシステムの発達が起こる。しかし、当時は、Windowsのアップデートは3年単位だった。1995年あたりまでは、BIOSは書き換え不可能なマスクROMか、紫外線で消去するEPROMなどで提供されて、ユーザーが簡単には書き換えることもできなかったし、アップデートもほとんど提供されていなかった。

PCの起動はBIOSが行うためハードディスクはBIOSから認識される必要があり、新しい技術を使うハードディスクには、新しいBIOSを搭載した新しいPCが必要な時期が続いた。このため、ハードディスクが急速に進歩しても、市場にある多くのPCが対応できないという状況が続く。これにより市場には、さまざまなハードディスク技術やBIOSなどが混在する状況だった。

そもそも、FAT32が最初に搭載されたのは、1996年のWindows 95 OSR2から。この頃使われていたパーティションテーブルは、現在MBRパーティションテーブルと呼ばれるもので、1つのパーティションはセクタ数が2の32乗個(512バイト/セクタで2テラバイト)までだった。これが拡大されるには、BIOSがUEFIとなり、WindowsがGPT(GUIDパーティションテーブル)対応になってからだ。GPTは、IA-64向けに開発されたが、一般向けのWindowsでGPTが利用可能になったのは、x64版Windows Vista SP1(2007年)以降である。

FATでは、テーブル全体をメモリ内に置くことで高速化が可能なのだが、容量が大きくなると比例してテーブルが大きくなる。32ギガバイトのFAT32では、テーブルサイズが16メガバイトになる。当時のメインメモリはメガバイト単位、Windows 2000のシステム要件は、最小32メガバイト、最大4ギガバイトとされていた。32ギガバイト以上では、テーブルサイズが当時のメインメモリに対してあまりに大きすぎる。もちろん、Windows 98などの当時のコンシューマー向けWindowsに対しても大きすぎるスペックだ。

Windows NTは、1993年の初版NT 3.1からNTFSを採用する。このNTFSに比べて、エラー耐性の低い、FATシステムで当時の最新大容量ストレージを扱うことに不安があったのかもしれない。NTFSにはログからロールバックなどが可能なジャーナル・ファイルシステムになっているが、FATは、テーブルを2重に持つだけなので、NTFSに比べるとエラー耐性は低い。

1999年当時、マイクロソフトはNTFSを主力と考えていたため、FAT形式は補助的な位置付けにしたかったのかもしれない。最大容量を制限することで、NTFSに優位性を持たせたわけだ。また、NTFSでも高速化のためメモリが必要だが、それが圧迫されることを望まなかったのかもしれない。

この頃、USBのマスストレージクラスが成立、2000年頃からいわゆる「USBメモリ」が商品化される。同じく2000年には、現在デジカメなどで採用されているSDメモリカードが登場する。当初のSDカードでは最大2ギガバイトだったため、FAT16を採用した。その後、仕様が追加されるたびに標準ファイルフォーマットを改訂した。2006年のSDHCカードは最大容量が32ギガバイトでFAT32を標準ファイルシステムとした。こうした2000年以降の動きを考えると32ギガバイトという制限もそれほど変なものでもない。

Microsoftは、2006年には、大容量ストレージに対応したexFATを開発、後年これを公開する。exFATは、2009年のSDXCメモリカードの標準フォーマットとして採用され、Windowsもこれに対応する。このためにFAT32の制限は忘れられた感じもある。exFATを使うことで、FAT32が対応できなかった2テラバイトを越える大容量ストレージにも対応が可能になるからだ。

ただ、exFATには、Microsoftの特許が含まれていること、FAT32よりは実装が難しいこともありFAT32が好まれる場面もある。組み込み機器では、利用可能なSDカードがいまだにSDHCまでというものを見かける。それを考えるとFormatコマンドの対応は無駄というわけでもない。とはいえ、今更感もないわけでもない。exFATを強制してませんよ、という訴訟対策という理由もあるのかも。

今回のタイトルは、マイケル・ジャクソンのBadのパロディ曲"Weird Al" Yankovicの「Fat」の一節「Who is Fat?」から。原曲の歌詞“Bad”が“Fat”に置き換わっている。