Grub (legacy) 如何识别和处理各种文件系统?

How Grub (legacy) recognizes and processes various file systems?

我一直在阅读有关 Grub 遗留引导加载程序的信息。令我印象深刻的是 Grub 处理文件系统的方式。 Grub 支持很大一部分文件系统。 我的疑问是,Grub 如何相互识别这些文件系统? 即使识别出来了,又是如何处理的?就像每个文件系统都有自己的实现一样。 Grub 是否从磁盘加载运行时库?

我知道这个问题太宽泛了。但是请给我一些开始的提示。

谢谢。

FS 检测:分区前 4B 中的幻数,或类似的签名检测,我假设。

文件系统处理: stage1 加载嵌入在分区 table 和第一个分区开头之间的 space 中的 stage1.5。这包含文件系统的只读驱动程序,至少包含 /boot,它可以从中加载 stage2。

如果没有空间容纳 stage1.5,您将无法嵌入完整 stage2 的扇区地址,如 Netch 所描述的那样。这可能会在升级到 GRUB 时发生变化,或者只是在 /boot 中复制文件,所以它不是首选。

Grub 维基百科文章描述了 the operation of GRUB-legacy,它可能也记录在 GRUB-legacy 文档中。


在我仍然保留的一台古老的 Debian 机器上,它使用 GRUB 0.97 引导,/boot/grub 包含:

-rw-r--r-- 1 root root    197 2008-08-29 23:57 default
-rw-r--r-- 1 root root     46 2008-08-29 23:57 device.map
-rw-r--r-- 1 root root     31 2008-08-29 23:57 device.map~
-rw-r--r-- 1 root root   7552 2008-08-29 23:57 e2fs_stage1_5
-rw-r--r-- 1 root root   7424 2008-08-29 23:57 fat_stage1_5
-rw-r--r-- 1 root root   8192 2008-08-29 23:57 jfs_stage1_5
-rw-r--r-- 1 root root   3377 2012-04-19 20:41 menu.lst
-rw-r--r-- 1 root root   3377 2012-04-19 20:41 menu.lst~
-rw-r--r-- 1 root root   6848 2008-08-29 23:57 minix_stage1_5
-rw-r--r-- 1 root root   9248 2008-08-29 23:57 reiserfs_stage1_5
-rw-r--r-- 1 root root    512 2008-08-29 23:57 stage1
-rw-r--r-- 1 root root 108328 2008-08-29 23:57 stage2
-rw-r--r-- 1 root root   8872 2008-08-29 23:57 xfs_stage1_5

特定于 FS 的 stage1_5 文件 不是 在启动时从那里读取:需要读取 /boot 的文件由 grub-install 嵌入。

典型的设置是 GRUB 阶段 1(它是 1 扇区二进制文件)知道阶段 2 的位置并加载它。该位置由安装命令(setupinstall)写入阶段 1。 (更准确地说,第 2 阶段文件的开始使用其他文件部分的物理位置列表进行更新;第 1 阶段加载第 2 阶段的起始扇区,第 2 阶段使用第 2 阶段的其余部分继续此引导。)如果第 1 阶段不是使用真实的第 2 阶段设置进行更新,它预计第 2 阶段位于第 1 阶段之后的扇区(一种变体,例如 GRUB 软盘)。

加载第2阶段后,它可以进行以下所有操作。第 2 阶段为所有受支持的 FS 嵌入一组只读驱动程序;此类驱动程序比全功能驱动程序小得多。安装过程还包括将引导驱动器和分区编码到第 2 阶段,因此,引导后它知道在哪里可以找到有效的配置([/boot]/grub/menu.lst 此版本)。突然间,FS 类型没有在第 2 阶段配置区域中编码。 FS 类型的检测在 *_mount() 函数中完成(文件集 stage2/fsys_*.c);每一个都尽最大努力检测它是否适合它,包括分区 table 中的签名检查和分区类型检查。我不知道为什么选择这种风格,但似乎他们希望 FS 类型检测是 rock stable.

由于第 2 阶段已加载、提供适当的内部配置(设备、分区)并打开其 FS,它能够加载菜单并继续更高级别的逻辑。

(本说明不包括stage1.5,因为后者是在比较特殊的情况下使用。)

所以,回答你的具体问题,

How Grub recognizes these file systems from one another?

同时具有签名和分区类型(DOS、BSD...)

Does Grub loads runtime libraries from disk?

不,它使用自己的只读驱动程序。

But please give me some tips to kick start.

如果您可以阅读 C,最好的方法是克隆它的 repository,检查 grub-legacy 分支并阅读它的源代码。