【问题标题】:How Grub (legacy) recognizes and processes various file systems?Grub(旧版)如何识别和处理各种文件系统?
【发布时间】:2023-04-04 13:41:01
【问题描述】:

我一直在阅读有关 Grub 旧版引导加载程序的信息。令我印象深刻的是 Grub 如何处理文件系统。 Grub 支持大量文件系统。 我的疑问是,Grub 如何相互识别这些文件系统? 即使他们被识别,他们是如何被处理的?就像每个文件系统都有自己的实现一样。 Grub 是否从磁盘加载运行时库?

我知道这个问题太宽泛了。但请给我一些提示以帮助您开始。

谢谢。

【问题讨论】:

  • I know the question is too broad. - 如果是这样,你为什么问它?

标签: assembly x86 kernel bootloader grub


【解决方案1】:

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

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

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

Grub Wikipedia 文章描述了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 嵌入。

【讨论】:

    【解决方案2】:

    典型设置是 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);每个都尽力检测它是为它的,包括签名检查和分区表中的分区类型检查。我不知道为什么选择这种风格,但似乎他们希望 FS 类型检测稳定。

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

    (此描述不包括stage1.5,因为后者是在相当特定的情况下使用的。)

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

    Grub 如何识别这些文件系统?

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

    Grub 是否从磁盘加载运行时库?

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

    但是请给我一些开始的提示。

    如果你会读 C,最好的方法是克隆它的 repository,签出 grub-legacy 分支并阅读它的源代码。

    【讨论】:

    • 我很确定我记得嵌入 stage1.5 是在普通桌面系统上使用 grub-legacy 的典型方式。维基百科有类似的高级描述。更新了我的答案。
    • @PeterCordes 好吧,我似乎已经遗漏了一些主要细节,我从文档中恢复了它们。如果某些设置倾向于使用 1.5 阶段,那么这仍然不是整个设置正常工作的原则。遗憾的是,我使用的最古老的 Linux 系统已经安装了 GRUB 2。
    • 我有一台仍在使用 GRUB 0.97 的机器。不过,我实际上并不想重新运行grub-install 来查看输出,以防它破坏某些东西!但我确实在我的回答中包含了/boot/grub 的目录列表,因此您可以看到每个不同文件系统的 stage1_5 的大小。
    猜你喜欢
    • 2018-01-11
    • 2016-12-21
    • 2018-08-02
    • 2011-02-28
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2015-12-15
    • 2015-05-27
    相关资源
    最近更新 更多