我正在尝试使用 Linux 中的文件系统。我想了解一些问题。以下是我使用过的命令:
truncate disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 disk.img
#I have made a FAT12 filesystem on a simple 1 MB file in my home directory
现在我可以使用以下命令挂载我的文件:
sudo mount disk.img /mnt
为什么我们在这里使用 sudo?没有 sudo 我无法挂载
现在我将一个跨越 2 个集群的文件复制到挂载点:
sudo cp file.bin /mnt
然后我卸载磁盘:
sudo umount /mnt
我使用像 ghex 这样的十六进制编辑器来查看这一切之后到底发生了什么:
ghex disk.img
在 FAT 中,我看到以下内容(RAW 格式):
(Beginning from byte 0x200, after the bootsector)
f8ff ff00 4000 ff0f 0000 0000 ..........
这是我的主要问题:我以为 FAT12 在 FAT 中每个簇使用 1.5 个字节,但它似乎使用了 2 个?(我不确定这一点,也许我不太了解 FAT12)
答案1
我以为 FAT12 在 FAT 中每簇使用 1.5 个字节,但它似乎使用 2
1.5 确实如此。您的疑问可能是因为在您的示例中,集群 #2 是空闲的;这可能会让您感到惊讶。
相关片段FAT 文件系统作者:Andries Brouwer:
数据区域的第一个簇是簇 #2。这使得 FAT 的前两个条目未被使用。在第一个条目的第一个字节中存储了媒体描述符的副本。该条目的其余位为 1。在第二个条目中存储了文件结束标记。[…]
两个 FAT12 条目存储在三个字节中;如果这些字节是
uv
、wx
,yz
那么条目就是xuv
和yzw
。FAT12 条目的可能值为:
000
:可用,002
-fef
:簇正在使用;给出的值是文件中下一个簇的编号,ff0
-ff6
:保留,ff7
:坏簇,ff8
-fff
:簇正在使用,该文件中的最后一个簇。[…]
那我们来解码吧。
f8ff ff00 4000 ff0f 0000 0000
f8ff ff - entries 0,1
00 4000 - entries 2,3
uv wxyz and the sequence according to the citation
ff0f 00 - entries 4,5
uvwx yz
00 0000 - entries 6,7
uv
,,→ ,:wx
yz
xuv
yzw
00 40 00 -> 000 004
ff 0f 00 -> fff 000
这给了我们以下结论:
000
- 自由的004
– 集群正在使用;下一个集群是#4fff
- 正在使用的集群,此文件中的最后一个000
- 自由的
检查目录条目以查找有问题的文件(我希望它位于偏移量处1a00
)。
字节内容
0-10 文件名(8 字节),带扩展名(3 字节)
[…]
26-27 起始簇(0 为空文件)
[…]
字节 26-27 应该适用0300
于您的情况。它是小端字节序,人类可读的(大端字节序)值为0003
。起始簇是 #3。
该文件从簇 #3 开始,下一个簇是 #4,它是此文件中的最后一个簇。该文件跨越两个簇。一切都合适。