如何计算最小FAT32分区所需的最小字节数?

如何计算最小FAT32分区所需的最小字节数?

通过实验新文件系统,我确定创建 FAT32 分区所需的最小字节数是34089472少了一个字节,程序就会抱怨:

$ newfs_msdos -F 32 -c 1 -S 512 -C 34089471 tm
newfs_msdos: 65524 clusters too few clusters for FAT32, need 65525

$ newfs_msdos -F 32 -c 1 -S 512 -C 34089472 tm
tm: 65525 sectors in 65525 FAT32 clusters (512 bytes/cluster)
BytesPerSec=512 SecPerClust=1 ResSectors=32 FATs=2 Media=0xf0 SecPerTrack=63 Heads=255 HiddenSecs=0 HugeSectors=66581 FATsecs=512 RootCluster=2 FSInfo=1 Backup=2

我的问题是:我该如何计算 34089472?

来自FAT32 维基百科页面,我可以看到几个指标:

FAT32 要求:每个 FAT 副本上每 128 个簇有 1 个扇区

FAT32 最小值:每簇 1 个扇区 × 65,525 个簇 = 33,548,800 字节 (32,762.5 KB)

对我来说,这意味着每扇区 512 字节、65525 个簇和(65525/128 = 512)个额外扇区开销意味着应该

(65525 + 512) * 512 = 33810944

但这是错误的。实际上

(65525 + 1056) * 512 = 34089472

这个1056是从哪里来的?


与此相关,FAT16 的行为方式相同。实际上,您需要 2124800 字节,而不是 2091520(来自上面引用的 Wikipedia 页面)+ 开销。为什么?

答案1

这个1056是从哪里来的?

您还没有包括:

  1. 引导块字节0x20数 =32字节数。

  2. 两个 FAT(文件分配表)副本,一个是备份,另一个是备份2 * 512 = 1024

把它们加起来:

1024 + 32 = 1056

FAT 文件系统教程了解更多信息。

答案2

我的问题是:我该如何计算 34089472?

您正在处理的块设备以固定大小的块(特别是 512 字节扇区为单位)执行所有数据传输、读取、写入和分配。
因此,第一个计算应该是转换为扇区数量:

34089472 bytes / 512 bytes per sector = 66581 sectors

对我来说,这意味着每扇区 512 字节,65525 个簇和(65525/128 = 512)个额外扇区开销

您有一个未说明的假设,即每个集群使用一个扇区。

维基百科文章您引用的已经有答案了,但显然您忽略了它。

共有 32 个部门保留区域(包括引导扇区)(FAT32 文件系统上通常为 32 个扇区)。
有两个 FAT,每个 FAT 有 512 个扇区(或总共 1024 个扇区)。FAT32
没有根目录。
数据区域有 65525 个扇区,每个簇有 65525 个扇区。

总共有 66581 个扇区。


与此相关,FAT16 的行为方式相同。实际上,您需要 2124800 字节,而不是 2091520(来自上面引用的 Wikipedia 页面)+ 开销。为什么?

再次转换为扇区数量:

2124800 bytes / 512 bytes per sector = 4150 sectors 

保留区(包括引导扇区)有 32 个扇区(显然 FAT16 文件系统上也有 32 个扇区)。(以前,这是将 FAT 放在磁道开头的扇区数。)
假设您使用每个簇一个扇区,并且最少有 4085 个簇,则有两个 FAT,每个 FAT 有 16 个扇区(或总共 32 个扇区)。FAT16
的根目录有 1 个扇区(或簇)。
数据区域中有 4085 个扇区,每个簇有 4085 个扇区。

总共有 4150 个扇区。

相关内容