请教grub2启动windows的几个命令的区别

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
回复
头像
疯无可疯
帖子: 64
注册时间: 2009-03-13 21:27

请教grub2启动windows的几个命令的区别

#1

帖子 疯无可疯 » 2020-04-22 0:49

启动windowsXP和windows7为例
chainloader +1
chainloader /ntldr
ntldr /NTLDR
chainloader (hd0,msdos1)+1
chainloader (hd0,msdos1)/bootmgr
chainloader /bootmgr
ntldr /bootmgr
请教一下,这些命令哪些是通用的方法可以大概率在不同环境下成功启动?
大道至简,大象无形。
头像
astolia
论坛版主
帖子: 6542
注册时间: 2008-09-18 13:11

Re: 请教grub2启动windows的几个命令的区别

#2

帖子 astolia » 2020-04-22 10:58

你先弄清楚chainloader和ntldr各自的用法,自然就知道该怎么办了,也不会觉得成不成功是个概率问题

chainloader是个内置命令,它的目标参数要么是一个文件路径,要么用+1来代表当前分区的第一个扇区(也就是指Partition Boot Record,PBR)。表示要加载的下一个bootloader是那个文件或在PBR里。对于windows的PBR而言,它会去进一步加载分区根目录下的ntldr(存在于vista之前的系统)或bootmgr(存在于vista及之后系统)
ntldr是由ntldr模块引入的命令,如果模块不存在或损坏就用不了。它的参数只能是ntldr或bootmgr的路径

现在再来看你列出的命令:
chainloader +1:加载当前root变量指定的分区的PBR
chainloader /ntldr:加载当前root变量指定的分区中根目录下的ntldr文件
ntldr /NTLDR:加载当前root变量指定的分区中根目录下的NTLDR文件
chainloader (hd0,msdos1)+1:加载第一个硬盘第一个mbr分区的PBR
chainloader (hd0,msdos1)/bootmgr:加载第一个硬盘第一个mbr分区根目录下的bootmgr文件
chainloader /bootmgr:加载当前root变量指定的分区中根目录下的bootmgr文件
ntldr /bootmgr:加载当前root变量指定的分区中根目录下的bootmgr文件

它们各自有什么区别,在什么情况下有效我相信你也清楚了

另外要注意的是,如果使用EFI启动,分区的PBR会被忽略,bootmgr也不是放在根目录下,所以上面的命令都不适用
头像
疯无可疯
帖子: 64
注册时间: 2009-03-13 21:27

Re: 请教grub2启动windows的几个命令的区别

#3

帖子 疯无可疯 » 2020-04-22 13:10

多谢版主详细的说明,谢谢!补充一下,我原来提问说成功概率大一点是出于这个考虑:我编辑了可启动U盘的grub.cfg,先遍历各个分区查找NTLDR和bootmgr,找到后显示一个启动菜单找不到不出现菜单,当然了也不是说有这个文件就一定在这个分区有系统只是测试一下,目的是仿os-prober探测机器上所有已经安装的Windows系统,(那个os-prober原理我看不太懂),那么找到后要写启动命令,但是每台遇到的机器情况各不相同,所以想问哪种能比较应对大多数情况。ntldr命令只能启动NTLDR和bootmgr,这么说chainloader更通用一些,那chainloader 后面怎样写是不是一定要根据具体情况来改,还是可以有个通用的办法?我还没学清楚系统启动的流程和原理,问的问题如表达不清,请多包涵。
大道至简,大象无形。
头像
astolia
论坛版主
帖子: 6542
注册时间: 2008-09-18 13:11

Re: 请教grub2启动windows的几个命令的区别

#4

帖子 astolia » 2020-04-22 15:42

ntldr/chainloader的加载目标就是要按具体情况来,没有通用的语法。chainloader +1这个也是存在缺陷的,如果PBR被破坏或者被grub本身的代码覆盖,它也没办法跳转到win的引导程序里。

你想做得通用点,就只能是在ntldr/chainloader之前,进行各种情况的检测,利用grub提供的if语句,执行不同的ntldr/chainloader。差不多像这样

代码: 全选

set root=''
search --file --set=root /ntldr
if [ x$root != x ]; then
  ntldr /ntldr
else
  search --file --set=root /bootmgr
  if [ x$root != x ]; then
     ntldr /bootmgr
  fi
fi
或者用多个菜单项代替多个if判断,用的时候人工判断选择。
头像
疯无可疯
帖子: 64
注册时间: 2009-03-13 21:27

Re: 请教grub2启动windows的几个命令的区别

#5

帖子 疯无可疯 » 2020-04-22 21:22

astolia 写了: 2020-04-22 15:42 ntldr/chainloader的加载目标就是要按具体情况来,没有通用的语法。chainloader +1这个也是存在缺陷的,如果PBR被破坏或者被grub本身的代码覆盖,它也没办法跳转到win的引导程序里。

你想做得通用点,就只能是在ntldr/chainloader之前,进行各种情况的检测,利用grub提供的if语句,执行不同的ntldr/chainloader。差不多像这样

代码: 全选

set root=''
search --file --set=root /ntldr
if [ x$root != x ]; then
  ntldr /ntldr
else
  search --file --set=root /bootmgr
  if [ x$root != x ]; then
     ntldr /bootmgr
  fi
fi
或者用多个菜单项代替多个if判断,用的时候人工判断选择。
感谢版主的提示(❁´ω`❁),我再去思考学习一下😊
大道至简,大象无形。
头像
bzimage
帖子: 716
注册时间: 2006-03-14 10:25

Re: 请教grub2启动windows的几个命令的区别

#6

帖子 bzimage » 2020-04-22 23:07

mark
回复