在哪里可以了解有关如何使用GRUB`ntldr`命令(模块)的更多信息?


16

我最近偶然发现了GRUB ntldr模块。

显然,它可以用来做的事情之一是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的答案

非常感谢你!我已经决定要尝试深入研究源代码以了解有关GRUB ntldr命令/模块的更多信息。但是您做的工作比我做的要好得多。

我从来没有想过要查看电子邮件归档文件,以查看编写代码的人可能进行过哪些设计讨论。听起来这种方法将来可能会很有帮助。感谢您提及。

我对GRUB ntldr支持的想法

  1. 虽然我不确定该区别意味着什么,但ntldr它是模块而不是命令。或者,如果您愿意,也可以动态加载命令。

    跟随您的源代码链接,并查看第152(GRUB_MOD_INIT)和159(GRUB_MOD_FINI)行,您可以看到要加载和...的代码。

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

    另外:我一直想知道GRUB为什么不支持reboot。原来该命令存在,但是它是一个模块。如果reboot返回unknown command,则insmod reboot允许GRUB“记住” reboot命令。

    旁白:什么时候以及为什么GRUB可以“ 卸载 ”模块,我还不知道。也许是类似于“ 垃圾收集 ”的结果?我注意到,即使在系统关闭电源并重新启动后,一旦加载,这些模块似乎仍会保留。当然,您不能依靠它,但这似乎是它在实践中经常如何工作。
  2. 他们基于有趣的是,ntldrchainloader。我没有看过chainloader.c代码。我想它也可能在Intel 16位模式下进行重定位吗?

    感到相当高兴他们没有实现ntldr作为一个选项chainloader。我同意弗拉基米尔。无论幕后有什么相似之处,用法语法都非常不同。当前的方法比较简单。
  3. 有趣的是,显然没有将这个命令添加到GRUB的热情。显然,GRUB开发人员认为损坏Windows 分区启动记录(PBR)的可能性很小。但是,我可以勾勒出在足够普通的安装过程中该如何做。

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

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

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

    IMO,在这种情况下允许用户启动Windows 的最安全快捷方法是使用GRUB的new ntldr。我想知道开发人员是否会对这感兴趣。我希望他们没有预料到这种情况。

我想知道Windows以外的其他引导加载程序ntldr以及bootmgrGRUB ntldr命令是否可以加载?


1
好东西!我真的认为您应该在grub-devel邮件列表上打上一行,并要求他们窥视这个问题,也许可以解决一些未回答的问题,并且/或者纠正我们的一些假设。首先感谢您提出问题!
ckhan 2012年

Answers:


14

研究未记录的功能

您说对了ntldr(没有命令,而是命令,不是命令)。因此,这是代码考古学中一些冒险的绝妙借口 。

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

  • 在源萨凡纳混帐回购协议 显示,它被合并为主线,2010年8月。

  • 源分支似乎不再存在,但是您仍然可以看到它在当年早些时候( 2010年4月)成立。

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

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

现在我们有了一个准确的签入名和名称,我们可以检查邮件存档了。您可以在grub-devel邮件列表中看到开发人员一年前就如何添加此功能进行讨论的地方 :

该线程的一些相关摘录:

Robert Millan此修补程序为NTLDR引导语义实现了加载程序(BootMGR中的语义相同,因此两者均受支持)

Robert Millan如果我们完全想要此功能,我认为它应该是chainloader中的一个选项,而不是一个独立的命令。它实际上与chainloader几乎相同,唯一的区别是ntldr是在GR之后由GRUB而不是由PBR本身加载的。

Vladimir Serbinenko我认为这没有任何问题,因为ntldr仅将此PBR用作超级块来标识分区。因此,我宁愿将此加载作为传递$ root的特殊情况,只是它的形式有点奇怪

Yves Blusseau关于命令,我认为如果只有一个命令,它将对用户更简单:chainloader(如grub4dos)将尝试检测引导程序的类型。这只是我个人的看法。

弗拉基米尔·谢尔比年科(Vladimir Serbinenko),我不同意这一点。chainloader和ntldr使用不同的语法:chainloader需要引导扇区,而ntldr需要ntldr或bootmgr文件。使用GRUB2可以打破GRUB1的错误设计决策,其中之一是“内核”命令。在这个问题上,GRUB4DOS遵循GRUB1。

Robert Millan好吧。让我们将其设为单独的命令。我认为它仍然应该与chainloader.c共享代码(与一些ifdefs共享)。

回答你的问题

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

  • 它基于chainloader。

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

  • 它避免了分区启动记录:因此它可以绕过那里的损坏。请参阅这篇文章,详细说明他们如何进行测试。

  • 只有大约160行代码,你可以看到有没有多少人在那里。

希望这是有用的!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.