使用 mkfs 命令创建指定的 FAT12 文件系统

使用 mkfs 命令创建指定的 FAT12 文件系统

我目前正在 Linux 机器上进行一些操作系统开发。在此过程中,我想在文件(例如 Disk.img)上创建 FAT12 文件系统。我使用 mkfs 命令如下:

touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img

使用十六进制编辑器查看时,我发现“SECTORS_PER_FAT”默认为 2。我想将其设置为 9。我该怎么做?

编辑:BIOS 参数块具有以下信息(我只是不想手动执行,而想使用 mkfs 来代替)

(这是来自http://www.brokenthorn.com/Resources/OSDev5.html

bpbBytesPerSector:      DW 512
bpbSectorsPerCluster:   DB 1
bpbReservedSectors:     DW 1
bpbNumberOfFATs:    DB 2
bpbRootEntries:     DW 224
bpbTotalSectors:    DW 2880
bpbMedia:       DB 0xF0
bpbSectorsPerFAT:   DW 9    ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack:     DW 18
bpbHeadsPerCylinder:    DW 2
bpbHiddenSectors:   DD 0
bpbTotalSectorsBig:     DD 0
bsDriveNumber:          DB 0
bsUnused:       DB 0
bsExtBootSignature:     DB 0x29
bsSerialNumber:         DD 0xa0a1a2a3
bsVolumeLabel:          DB "MOS FLOPPY "
bsFileSystem:           DB "FAT12   "

顺便说一句...我认为簇的总数和每个簇的扇区数应该自动确定 FAT 的大小(以扇区数为单位)...因此,在 BPB 中定义 sector_per_fat 可能是多余的...这意味着它不能取任何任意值....

答案1

我观察到“SECTORS_PER_FAT”默认为 2。我想将其设置为 9。我该怎么做?

这个数字似乎是自动计算的。由于文件分配表每个簇只有一个条目,而簇数是有限的且是预先知道的,因此没有必要为 FAT 分配更多扇区。

在您的情况下,2 不是“默认”,它主要由文件系统大小(大小Disk.img)和集群大小决定。

采取最小可能的簇大小(即最小逻辑扇区大小(-S512)和每个簇的最小扇区数(-s1)):

# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

这将为您提供给定文件大小的最大簇数,也就是 FAT 中的最大条目数,也就是最大 FAT 大小,也就是每个 FAT 所需的最大扇区数。但仍然只有 6 个。

我认为理论上你可以正式分配更多扇区,文件系统将有效。关键是 FAT 中的任何额外扇区都不会被使用,因为所有簇已经被这 6 个扇区中的条目覆盖。实际上mkfs.vfat不会像这样浪费扇区。


粗糙的计算 1 MiB 并-S512 -s1为每个 FAT 提供 6 个扇区:

  1. 我们忽视簇以外的结构,就好像所有空间都贡献给了簇。-S512 -s1一个簇占用 0.5 KiB。1 MiB 恰好容纳 2 Ki 个这样的簇。注意,在这个计算中,簇的数量是膨胀对于严格价值。
  2. 在 FAT12 中,一个条目占用 12 位(每 3 个字节 2 个条目),因此占用 1.5 B。每个簇需要一个条目。2 Ki 个条目占用 3 KiB。因此 FAT 应该占用 3 KiB,这个数字也是膨胀
  3. 单个扇区为 0.5 KiB。您需要 6 个扇区来容纳 3 KiB。由于 3 KiB 有点夸大,因此您需要最多6 个部门。

该工具计算这个数字更加严格。


FAT 的数量 ( -f) 几乎无关紧要。并不是说簇被划分到单独的 FAT 中。额外的 FAT 只是副本,每个副本仍为所有簇提供服务。更多的 FAT 占用更多空间,这会稍微减少簇的数量。对于文件系统的某些“阈值大小”,这种现象会影响每个 FAT 的扇区数。但是对于 1 MiB,-S512 -s1每个 FAT 所需的扇区数是 6,无论如何-f(注意:在我的测试中mkfs.vfat拒绝创建超过 4 个 FAT)。

在给定文件系统大小的情况下,我们最大化了簇数之后,增加每个 FAT 扇区数的最简单方法是增大文件系统。我们用 1 MiB 获得了 6 个扇区,因此我们可能用 1.5 MiB 获得 9 个扇区。确实如此:

truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

注意,1536k这不是获得 9 的最小大小。在我的测试中,1389k它给了我 9,并1388k给了我 8。现在我们可以看到它如何-f影响数字。对于1389k -f2(默认值)给出 9,并-f3给出 8。对于1388k -f1给出 9,并-f2给出 8。


我的试验台:

  • Debian GNU/Linux 9
  • mkfs.vfat作为符号链接mkfs.fat
  • mkfs.fat版本:4.1(2017-01-24)

参考:

  1. FAT 文件系统作者:Andries Brouwer
    (这是 2002 年的,但我认为 FAT12 自那时起并没有发生重大变化)
  2. FAT文件系统的设计在维基百科上

相关内容