对于包含 FAT32 的分区,`file` 命令输出中的“隐藏扇区”是什么?

对于包含 FAT32 的分区,`file` 命令输出中的“隐藏扇区”是什么?

我使用 GParted 将外部 USB 硬盘分成两个分区。两个分区都是格式化为 FAT32 的主分区,大小相同(500 GB)。以下是输出file -s

/dev/sdb1: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 64, reserved sectors 64, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 2048, sectors 976760832 (volumes > 32 MB), FAT (32 bit), sectors/FAT 119232, reserved 0x3, serial number 0x99034dfb, label: "TOSHIBA1   "

/dev/sdb2: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 64, reserved sectors 64, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 976762880, sectors 976760832 (volumes > 32 MB), FAT (32 bit), sectors/FAT 119232, reserved 0x1, serial number 0x96cbe274, label: "TOSHIBA2   "

在 中/dev/sdb2,是什么hidden sectors?为什么它比 大sectors?差值是 2048,而这恰好是 的值hidden sectors/dev/sdb1这是巧合吗?是 GParted 或命令的错误file?更重要的是,这是值得关注的事情吗?

答案1

总结

完全不用担心。


维基百科文章FAT文件系统的设计多次提到“隐藏扇区”,相关元数据条目的常见描述是

包含此 FAT 卷的分区之前的隐藏扇区数。在未分区的媒体上,此字段应始终为零。

(有一些怪癖)。这个描述似乎符合您在特定情况下观察到的值。


我预计 Linux 工具默认不会使用此值。在您的情况下,相应的值2048976762880在上下文中有效/dev/sdb,但如果您分别考虑/dev/sdb1和,/dev/sdb2则这些设备未分区,因此在它们的上下文中“隐藏扇区”应该是0

使用类似命令挂载是很常见的mount /dev/sdb1 /some/mountpoint,但如果分区从 2048 个 512 字节扇区的偏移量开始,那么你可以使用以下命令执行相同操作

mount -o offset=$((2048*512)) /dev/sdb /some/mountpoint

因此,就 Linux 而言,没有明确的迹象表明哪个上下文是“正确的”。另一个表明“隐藏扇区”值不重要的提示是,它将属于分区表的信息嵌入到文件系统的元数据结构中。如今,我们倾向于不混合这样的抽象层。“不同步”这两条信息相对容易。而且由于操作系统首先需要读取分区表来查找文件系统,因此只有在您已经知道偏移量后才可用的有关偏移量的冗余信息几乎没有用处。

注意还有另一个冗余信息:分区表包含分区 ID(MBR)或分区类型 GUID(GPT)应该与分区中的实际文件系统相对应,但可能不是。但是,如果这些信息连贯一致,则非常有用,因为您可以通过检查分区表来了解预期的内容(什么操作系统、可能的多重引导、交换分区)。在实践中,有时这对人类有用,有时对机器有用;尤其是 UEFI 需要知道哪个分区是EFI 系统分区。但是如果你告诉 Linux,mount /dev/sdb1 …它将尝试检测那里的实际文件系统而不是检查/dev/sdb、读取分区表并使用分区 ID/GUID。

我不知道“隐藏扇区”背后的原理是什么。不过似乎有些设备以某种方式依赖这个值。比较man 8 mkfs.fat

-h number-of-hidden-sectors
选择卷中的隐藏扇区数。显然,如果您给某些数码相机提供没有此类隐藏扇区的 CF 卡,它们会感到不适,此选项可让您满足它们的需求。0如果命令行中未提供任何值,则假定为。

看来 GParted 已经尝试满足“一些数码相机”或其他东西的需求。因此,这是一个好事。您绝对不需要用另一个工具重新做。

答案2

“隐藏扇区”是对分区偏移量的误称,它存储在 FAT 或 NTFS 引导扇区中,位于一个数据结构中(也具有误导性),称为BIOS 参数块;此处,“BIOS”是指 MS-DOS 的一个组件,而不是系统固件。该值(应该是)磁盘上引导扇区之前的扇区数。不多也不少。对于驻留在非分区媒体上并跨越整个磁盘的 FAT 文件系统,它应该为零。

当加载 FAT 或 NTFS 引导扇区时,它会使用“隐藏扇区”值来定位磁盘上的分区。从那里,引导扇区能够定位文件系统结构并加载后期引导加载程序,例如 IO.SYS (MSLOAD)、NTLDR 或 BOOTMGR。除此之外,通常不使用该值。因此,如果您不打算从 BIOS 系统上的文件系统启动,那么这根本就不重要……尽管您永远不知道会遇到什么疯狂的 FAT 实现。

相关内容