Western Digital社のAdvanced Format Technology ドライブ(EARSシリーズ)をFAT32で使う

  Copyright(C) 2010 まりも(DOSsoft)

 どんなドライブか

 2010年6月頃に、Western Digital社から、物理セクタ4KB(4096B)のハードディスクが登場しました。このハードディスクは、実際には4KBセクタですが、互換性を考慮し、ファームウェアレベルでは従来通り512Bセクタとして振る舞うようになっています。つまり、ある程度大きな連続セクタ単位の書き込みがある場合、ファームウェアレベルで8セクタ境界のデータを作成して物理セクタに書き込むという、一種のエミュレーションをおこなっています。

 この方式は、読み込みのときにはとくに困ることはないですが、近傍セクタで細かい書き込みが連続した場合、著しく速度が低下する可能性があります。たとえば1セクタ512バイトぶんだけ書き換えたい場合でも、8セクタ相当ぶん(1物理セクタ)を読んで、ファームウェア内で512バイト分だけ書き換え、それを物理セクタに書き戻すという、read-modify-writeを行わなければならないためです。物理セクタサイズの異なるものが混在した光磁気ディスクではそのようなことがかつて行われていましたが、ハードディスクでそれが再来したようなものです。

 物理セクタサイズが大きいディスクは、それなりに高性能化、大容量化、低価格化がはかられており、魅力ですが、それでもread-modify-writeのペナルティは大きいものです。

 どうすればXpやDOSでうまく使えるか

 速度の低下を防ぐには、OSの読み書き単位が、1物理セクタ=8の倍数セクタの境界に一致するようにするすればよいと考えられます。そのためには、少なくともファイルの最小管理単位である「クラスタ」を8の倍数境界に置くことです。クラスタはセクタをいくつか束ねた単位です。これを最小でも1クラスタ=8セクタ(つまりクラスタサイズ4096バイト)にすればよいわけです。

 何が問題として残っているのか

 ではクラスタサイズを4096バイトにしてフォーマットすればよいかというと、それだけでは不十分です。領域の先頭位置も8の倍数境界になければいけませんし、おそらくファイルシステム部分(FAT32ならFAT32部分のその開始セクタ)も8の倍数境界にないと、ファイルシステムへの読み書きが遅くなると考えられます。

 ところが、PC/AT互換機のこれまでのフォーマット形式(いわゆるMBR形式)では、まずセクタ番地0にマスターブートレコードとパーティションテーブルがあり、第1番目のパーティションの始まりが、セクタ番地63(3Fh)から始まることになっています。つまり最初の領域の先頭がもう8の倍数境界にないというわけです。

 このことから、AFTドライブでは、ジャンパピンをセットするか、専用の物理フォーマットツールを使用することにより、セクタ番地0の前にみかけのセクタを入れて、63セクタ番地が物理8セクタ(論理64セクタの位置に相当する)に置かれるようにするしかけとなっています。しかしいくら先頭領域の開始の位置を物理セクタの境界に合わせたとしても、第2領域以降でズレが生じてしまっては意味がありませんので、これらはあまりうまい方法とは言えません。それよりも、フォーマット時に領域境界を必ず8の倍数セクタに置くように変更することのほうが確実です。

 Windows Vista やWindows 7を使えばよいのか

 とはいっても、Windows XPのディスク管理で確保しようとすると、先頭領域は63(3Fh)セクタからとなってしまいます。いっぽうWindows VistaおよびWindows 7では、先頭領域は2048(800h)セクタから置くというように変更されており、Xpでもこの形式で読み書きは問題なくできるので、領域確保時にWindows Vista 、Windows 7を使えば一応解決します。

 ではこれで解決なのか・・・・というと、確かに領域先頭の境界は8の倍数(先頭は2048)セクタに置かれるようになるものの、ファイルシステム内でのクラスタ境界が8の倍数になっている保証はありません。実はFAT32ではこの保証が全くないのです。あらかじめ領域先頭が8の倍数セクタ境界に取ってある場合、WindowsXPその領域の中身をFAT32で再度フォーマットしてみると、一応経験的にはFAT32のデータ領域の先頭は8の倍数セクタ境界に置かれるらしいことは確かめましたが、これも保証の限りではありませんし、そもそもFAT32のテーブル部分の先頭は8の倍数セクタから始まるとは限っていませんでした(予約セクタ数を32,34,36,38のうちから選んで調整するらしい)。

 同一のセクタ数からなるクラスタサイズ8KBのFAT32領域をWindowsXP、Windows7でフォーマットした場合と自前でフォーマットした場合とを比較してみます。データ先頭はいずれも8の倍数セクタに置かれますが、FAT32ファイルシステム自体はWindowsXP,Windows7では8の倍数セクタから始まるようにはなりません。これが速度的問題となる可能性は、あるかどうかわかりませんが、なんでも8の倍数セクタに置いた方が安心できることは間違いありません。

WindowsXPでフォーマットした場合

Windows7でフォーマットした場合

自作ツールでフォーマットした場合

 Windows 7とXpを使ってフォーマットしたとしても、FAT32のファイルシステム内部まで完全に8の倍数境界に合わせることはできないのです(それが問題かどうかはわかっていないが)。またWindows7でFAT32をフォーマットすると、非常に多くの「予約セクタ」が確保され、使用できる容量がいくらか減少します。なお、NTFSやLinuxのextファイルシステムでは、先頭が8の倍数セクタ番地にあれば、クラスタサイズなどデータエリア最小単位8の倍数境界に置かれるようです(詳しくは知りませんがそう言われている)。

 自作フォーマッタ(FDISK代替)

 そこで、FAT32領域や複数の領域があっても8の倍数セクタ境界に配置できるフォーマッタ 「FDSK」を公開することとしました。 このフォーマッタはMS-DOS(Win9xのDOSモード起動)上で動作するもので、8の倍数セクタに合わせた領域の確保のほか、8の倍数セクタに合わせた中身のフォーマットも行います(FAT32のみ)。また領域のアクティブ化、領域の削除、MBR-IPLの書き込みなど、かつてMS-DOSのFDISKでできたことの全てを正しく代替できる機能を持たせてあります。

 このフォーマッタ「FDSK」を使ってFAT32でフォーマットすると、次のようになります。

 なお「FDSK」は、従来どおり、63セクタからの領域割り当て、シリンダ境界での領域割り当ても行えます。オプション指定がないとそうなります。AFTドライブ用に8の倍数セクタ境界での割り当てを強制するときは、コマンドラインオプションに -8 を付けて起動する必要があります。このプログラムはAFTドライブの登場より前から存在しており、無オプションのときの互換性維持のためです。Windows Vista/7以後の方式のほうがあたりまえとなってきたので、オプションなしとしました。

 Windows XP でAFTでFAT

 適用結果です。きっちり4KBの境界を守ってFAT32の領域をフォーマットし、WindowsXPの起動ディスクとしてみましたが、遅くなるということはありませんでした。 FAT32であろうが何であろうが、ファイルシステム、クラスタの境界を4KB(8セクタ)の境界と一致させれば、AFTドライブといえどもとくに問題はないといえそうです。read-modify-writeをするベンチマークはよくわからないので試していませんが、少なくともCyistal Disk Markでは書き込み速度に問題は見られず、またNTFSの場合と比べても遅くはなっていません。むしろこのディスクドライブは単純書き込みにおいてはかなり高速な部類に入ります。キャッシュ量が64MBと大きいことも作用していると考えられます。

 いっぽう4KB境界とクラスタ境界が一致しないようにしてFAT32の領域をフォーマットした場合は、ベンチマークでも遅くなるほか、MS-DOSでは書き込みが連続するとデバイスエラーが発生することがありました。

 2017/8/8 追記

 SSDやUSBフラッシュのFAT/FAT32

 Windows Vista/7/8/10でフォーマットすると上記のように「予約セクタ」が多数取られます。これには意味があるようです。FAT32でフォーマット済みのUSBメモリを購入すると、近年では4000h(16384)セクタくらい予約セクタが確保されています。昔は80h程度で、極小さい容量のものでは20hというのもありました。いっぱんにフラッシュROMデバイスは大容量ほどアクセス単位が大きくなりますが、USBフラッシュの出荷時の予約セクタはこれに合わせたものと考えられます。FAT領域に続くデータ領域の先頭がアクセス単位と一致していることが第一で、FATの先頭セクタ数がアクセス境界にあることは二の次ということです。上の図の例で、予約セクタ数8222+12273*2=32768(8000h)となり、データ領域の先頭が2のn乗境界に位置しています。

 「FDSK」では バージョン1.34からこのように予約セクタを多数とって調整するようにしました。コマンドオプションで /SSD をつけるとデータ領域の先頭が2のn乗境界に合わせるため予約セクタ数を調整します。スーパーフロッピーフォーマットでも同様にフォーマットする「SFDFORM」>も公開しました。