研究未记录的功能

研究未记录的功能

我最近偶然发现了 GRUBntldr模块。

显然,它的用途之一是作为chainloader启动 NT >= 6.0 版本的 Windows 的替代方案,如下例所示。 (如果 Windows 分区的卷引导记录损坏了,这非常方便。)

menuentry "Windows 7 (bootmgr on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    ntldr ($root)/bootmgr
}

我可以在哪里了解有关如何使用此引导指令的更多信息?我查看时没有看到它列出HTML版本GNU GRUB 手册


回复 ckhan 的回答

非常感谢!我几乎决定必须尝试挖掘源代码以了解有关 GRUBntldr命令/模块的更多信息。但你做得比我好得多。

我从来没有想过要查看电子邮件档案来了解编写代码的人可能进行过哪些设计讨论。这个方法听起来对未来很有帮助。谢谢你提到它。

ntldr我对 GRUB支持的看法

  1. 虽然我不太确定区别有多大,但ntldr它是一个模块,而不是一个命令。或者如果您愿意的话,也可以是动态加载的命令。

    关注您的源代码链接查看第 152 ( GRUB_MOD_INIT) 行和第 159 ( GRUB_MOD_FINI) 行,您可以看到要加载的代码以及...我猜...卸载模块。

    GRUB 显然实现了许多您可能认为是的功能“命令“作为模块。据我所知,使用上的唯一区别是,在使用模块之前,必须确保它已使用命令加载insmod ntldr

    在旁边:我一直想知道为什么 GRUB 不支持reboot.事实证明该命令存在,但它是一个模块。如果reboot返回unknown command,则insmod reboot允许 GRUB “记住”该reboot命令。

    在旁边:GRUB 何时以及为何可能“卸下“一个模块,我还不知道。也许它是类似的结果”垃圾收集“?我注意到,一旦加载模块似乎就会持续存在,即使在系统断电并重新启动后也是如此。当然,你不能依靠对此,但这似乎是它在实践中经常起作用的方式。
  2. 有趣的是,他们ntldr基于chainloader.我没有看过chainloader.c代码。我猜它可能还会在 Intel 16 位中重新定位负载真实的模式?

    很高兴他们没有将ntldr其作为chainloader.我同意弗拉基米尔的观点。无论表面上有什么相似之处,使用语法都非常不同。目前的方法不太笨拙。
  3. 有趣的是,人们显然对将此命令添加到 GRUB 缺乏热情。显然 GRUB 开发人员认为会对 Windows 造成损害分区引导记录 (PBR)可能性极小。不过,我可以概述如何在足够普通的安装过程中执行此操作。

    首先假设用户的系统上安装了 Windows。他们现在安装 Ubuntu (12.04 LTS)”旁边“ Windows。在 Ubuntu 安装过程中的某一时刻,他们显然可以决定将 GRUB 安装在哪里。由于我无法开始猜测的原因,他们中的一些人决定将 GRUB 安装到安装 Windows 的分区中。

    安装完成后,他们可以成功启动 Ubuntu,但是,当他们尝试通过选择 GRUB 菜单中的条目来启动 Windows 时,Windows 却无法成功启动。不是开始。相反,尝试使用 GRUB 启动 Windows 只是重新显示 GRUB 菜单?

    为什么?显然,当他们选择将 GRUB 安装到 Windows 分区时,实际发生的情况是 Windows 分区的 PBR 被 GRUB 的 PBR 覆盖。因此chainloader +1不会链式加载 Windows 引导加载程序,而是重新加载 GRUB。

    国际海事组织,最安全快的在这种情况下,允许用户启动 Windows 的一种方法就是使用 GRUB 的新功能ntldr。我不知道开发人员是否对此感兴趣。我估计他们没有预料到这种情况。

我想知道除了 Windows 之外,GRUB命令ntldr还可以加载哪些引导加载程序?bootmgrntldr

答案1

研究未记录的功能

你说得对ntldr命令(它是命令,而不是模块)没有记录。所以这是一个很好的借口去冒险 代码考古学

每当我发现未记录的功能时,首先要做的就是检查来源。

  • 来源位于萨凡纳 git 仓库 显示它于2010年8月合并到主线。

  • 源分支似乎不再存在,但你仍然可以看到它那年早些时候成立,2010 年 4 月。来自“Vladimir 'phcoder' Serbinenko”的签入评论是

    ntldr support. (based on information from nyu but no code from him)
    

它非常紧密地基于chainloader命令,以至于标题注释中的文件名仍然没有更新。

现在我们有了准确的签入和名称,我们可以检查邮件档案。您可以看到开发人员一年前在哪里讨论过添加此功能 grub-devel 邮件列表:

该线程的一些相关摘录:

罗伯特·米兰该补丁实现了 NTLDR 启动语义的加载程序(在 BootMGR 中相同,因此两者都受支持)

罗伯特·米兰如果我们想要这个功能,我认为它应该是链加载器中的一个选项,而不是一个独立的命令。它实际上与 chainloader 几乎相同,唯一的区别是 ntldr 是在 PBR 之后由 GRUB 加载,而不是由 PBR 本身加载。

弗拉基米尔·塞尔比年科我认为这没有任何问题,因为 ntldr 仅使用此 PBR 作为超级块来识别分区。因此,我宁愿将此加载视为传递 $root 的特殊情况,只是它的形式有点奇怪

伊夫·布鲁索关于该命令,我认为如果我们只有一个命令:chainloader(如 grub4dos 中的),它将尝试检测引导加载程序的类型,那么对用户来说会更简单。这只是我个人的意见。

弗拉基米尔·塞尔比年科我不同意这一点。 chainloader 和 ntldr 不共享相同的语法:chainloader 需要一个引导扇区,而 ntldr 需要一个 ntldr ot bootmgr 文件。 GRUB2 的目的是打破 GRUB1 的错误设计决策,其中之一就是“内核”命令。 GRUB4DOS 在这个问题上遵循 GRUB1。

罗伯特·米兰好吧。让我们将其设为一个单独的命令。我认为它仍然应该与 chainloader.c 共享代码(与一些 ifdef)。

回答你的问题

仔细研究了所有这些之后,我们对如何使用它了解多少?

  • 它基于链式装载机。

  • 它需要一个参数:要打开的文件。

  • 它避免了分区引导记录:因此它可以绕过那里的损坏。看这个帖子详细说明他们如何测试这一点。

  • 它是仅约160行代码,您可以看到那里没有太多其他内容。

希望这有用!

相关内容