一人一党党

一人一人の、一人一人による、一人一人のための政治制度を!

メディアのセクタと一致したクラスタを持つFATフォーマット

海外では知られているようだが、
Fixing sluggish write performance of USB flash (thumb) drives | Old Computer Junk
http://blog.oldcomputerjunk.net/2012/fixing-sluggish-write-performance-of-usb-flash-thumb-drives/
国内では
AFTドライブをXpやDOSでうまく使う
http://hp.vector.co.jp/authors/VA012947/pcat/aft_drive.html
くらいしか見つからなかったので、メモ。

大抵のファイルシステムでは、領域を2の何乗かの大きさのブロックに分けてメディアを読み書きする。
メディアの方も、領域を2の何乗かの大きさのブロックに分けて管理している。
なので、ファイルシステム側のブロックとメディア側のブロックの境界が一致していると、読み書きが効率的になる(高速になったり、メディアの寿命が伸びたりする)。
大抵のメディアでは、ブロックの大きさは一定。
これに合わせて、ファイルシステムの側もブロックの大きさを一定にしており、ブロック境界はそのファイルシステムの先頭にある。
このため、効率的な読み書きを実現するには、ファイルシステムの先頭をメディア側のブロック境界と一致させればいい。

ところがFATの場合、ブロック境界はファイルシステムの先頭にはない。
なので、ファイルシステムの先頭をメディア側のブロック境界に揃えても、効率は上がらない。

FATはおおよそ以下の三つの領域で出来ていて、それぞれの領域は異なる大きさのブロックを使っている。
[1]ヘッダ領域 - ブロックの大きさ = 普通は512バイト
[2]メタデータ領域 - ブロックの大きさ = 2バイトから4バイト(データ領域のブロック数で決定)
[3]データ領域 - ブロックの大きさ = ヘッド領域で使うブロックの2の累乗
このうちファイルシステムの容量の大半を占めるのは、[3]データ領域だ。
[1]ヘッダ領域のブロック数は、2-3個あれば足りる。
[2]メタデータ領域はデータ領域と同数のブロック数を持つが、ブロック一個当たりのサイズが全然違う。
FATファイルシステムの先頭がブロック境界に合っているだけでは、僅かしかないヘッダ領域しか読み書きの効率化が出来ていない事になる。
逆に言えば、データ領域の先頭さえブロック境界に合っていれば、FATの読み書き効率は大きく上がることになる。

多くの*nixシステム(LinuxとかBSDとか)に標準で入っているfsck.fatでは、-vオプションを付けることでデータ領域の先頭を調べてくれる。
$ fsck.fat -v disk.img
fsck.fat 3.0.28 (2015-05-16)
Checking we can access the last sector of the filesystem
Boot sector contents:
System ID "mkfs.fat"
Media byte 0xf8 (hard disk)
512 bytes per logical sector
4096 bytes per cluster
30 reserved sectors
First FAT starts at byte 15360 (sector 30)
2 FATs, 32 bit entries
1046528 bytes per FAT (= 2044 sectors)
Root directory start at cluster 2 (arbitrary size)
Data area starts at byte 2108416 (sector 4118) /* データ領域開始位置 */
261629 data clusters (1071632384 bytes)
32 sectors/track, 64 heads
0 hidden sectors
2097152 sectors total
Checking for unused clusters.
Checking free cluster summary.
disk.img: 0 files, 1/261629 clusters
データ領域先頭がメディアのブロック境界からずれているなら、データ領域の前にあるヘッダ領域やメタデータ領域の大きさを調整して合わせることができる。
特にヘッダ領域は別名「予約領域」とも呼ばれ、ブロック数を65535個(2の16乗 - 1)まで一個単位で調整できる。
*nixシステムのmkfs.fatでは、-Rオプションでヘッダ領域のブロック数を指定できる。

パーティション境界が8セクタ境界と合っているハードディスクならば、先に触れた
AFTドライブをXpやDOSでうまく使う
http://hp.vector.co.jp/authors/VA012947/pcat/aft_drive.html
で配布されているツールを使う手もあるだろう。
しかし、MBRパーティションもGPTパーティションもどちらも、ヘッダの大きさは1セクタ(MBR)とか34セクタ(GPT)であり、第一パーティションを8セクタ境界に合わせるにはいくつかセクタを捨てねばならない。
データ領域だけ境界合わせをする方式なら、パーティション先頭がメディアのブロック境界からずれていても、ファイルシステムの殆どの領域で効率化できる。
SSDなどのフラッシュメモリでは、メディアのブロックサイズは8セクタよりずっと大きい。
なにより、mkfs.fat & fsck.fatはオープンソース
マルウェアを仕込むのは絶望的だ。