通过实验新文件系统,我确定创建 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是从哪里来的?
您还没有包括:
引导块字节
0x20
数 =32
字节数。两个 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 个扇区。