我正在编写一个简单的操作系统引导程序(首先以传统模式启动)。在了解了启动过程之后(膜生物反应器正在加载可变比特率等)我开始研究不同文件系统的规格,以了解它们如何处理这种旧式的启动。
这是必要的,因为卷引导记录 (VBR) 按照设计位于磁盘上“活动”分区的第一个扇区中。换句话说,第一个扇区的字节(通常为 512 字节)实际上不是文件系统数据结构,而是操作系统的引导代码。
首先,我查看了 FAT 的简单性。令我惊讶的是,我发现了对“引导扇区“内置于规范中。具体来说,当您使用 FAT 文件系统格式化磁盘时,可以在开头为特殊代码块(如 VBR)“保留”一定数量的扇区。在这种情况下,所有文件系统数据结构都被此数量的保留块所取代。太棒了!这正是我所寻找的。
但是,我在其他文件系统(特别是 ext)中找不到类似的东西。这些其他文件系统必须支持“传统”风格的启动(例如,VBR 引导操作系统的空间),因为它们在 UEFI 启动规范之前就已经可用。
答案1
这些其他文件系统必须支持“传统”风格的启动(例如,VBR 引导操作系统的空间),因为它们在 UEFI 启动规范之前就已经可用。
不,他们不需要。参见GNU GRUB 手册 2.02:
传统上在 PC BIOS 平台上使用的分区表格式称为主引导记录 (MBR) 格式;这种格式允许最多四个主分区和附加逻辑分区。使用此分区表格式,有两种安装 GRUB 的方法:可以将其嵌入在 MBR 和第一个分区之间的区域(有各种名称,例如“引导轨道”、“MBR 间隙”或“嵌入区域”,通常至少为 31 KiB),或者可以将核心映像安装在文件系统中,并将组成它的块列表存储在该分区的第一个扇区中。
每种方法都有不同的问题。没有办法完全安全地在嵌入区域保留空间,而且一些专有软件会使用它来使用户难以绕过许可限制;有时系统在分区时会在第一个分区之前没有留下足够的空间。另一方面,安装到文件系统意味着 GRUB 的块很容易被文件系统功能(例如尾部打包)移动,甚至容易被激进的
fsck
实现移动,因此这种方法非常脆弱;而且这种方法只能在 /boot 文件系统与 BIOS 启动的磁盘相同时使用,这样 GRUB 就不必依赖于猜测 BIOS 驱动器号。GRUB 开发团队通常建议将 GRUB 嵌入到第一个分区之前,除非您有特殊要求。您必须确保第一个分区从磁盘起始处开始至少 31 KiB(63 个扇区);在现代磁盘上,将分区对齐到较大的边界上通常具有性能优势,因此第一个分区可能从磁盘起始处开始 1 MiB。
这意味着引导加载程序可能驻留在第一个 VBR 之前,甚至驻留在文件系统内部。