我最近偶然发现了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
支持的想法
- 虽然我不确定该区别意味着什么,但
ntldr
它是模块而不是命令。或者,如果您愿意,也可以动态加载命令。
跟随您的源代码链接,并查看第152(GRUB_MOD_INIT
)和159(GRUB_MOD_FINI
)行,您可以看到要加载和...的代码。
GRUB显然实现了许多功能,您可能会认为它们是“ 命令 ”作为模块。我知道用法的唯一区别是,在使用模块之前,必须确保已使用命令加载了该模块insmod ntldr
。
另外:我一直想知道GRUB为什么不支持reboot
。原来该命令存在,但是它是一个模块。如果reboot
返回unknown command
,则insmod reboot
允许GRUB“记住”reboot
命令。
旁白:什么时候以及为什么GRUB可以“ 卸载 ”模块,我还不知道。也许是类似于“ 垃圾收集 ”的结果?我注意到,即使在系统关闭电源并重新启动后,一旦加载,这些模块似乎仍会保留。当然,您不能依靠它,但这似乎是它在实践中经常如何工作。 - 他们基于有趣的是,
ntldr
上chainloader
。我没有看过chainloader.c
代码。我想它也可能在Intel 16位实模式下进行重定位吗?
我感到相当高兴他们没有实现ntldr
作为一个选项chainloader
。我同意弗拉基米尔。无论幕后有什么相似之处,用法语法都非常不同。当前的方法比较简单。 - 有趣的是,显然没有将这个命令添加到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的newntldr
。我想知道开发人员是否会对这感兴趣。我希望他们没有预料到这种情况。
我想知道Windows以外的其他引导加载程序ntldr
以及bootmgr
GRUB ntldr
命令是否可以加载?