启动windowsXP和windows7为例
chainloader +1
chainloader /ntldr
ntldr /NTLDR
chainloader (hd0,msdos1)+1
chainloader (hd0,msdos1)/bootmgr
chainloader /bootmgr
ntldr /bootmgr
请教一下,这些命令哪些是通用的方法可以大概率在不同环境下成功启动?
请教grub2启动windows的几个命令的区别
- 疯无可疯
- 帖子: 64
- 注册时间: 2009-03-13 21:27
请教grub2启动windows的几个命令的区别
大道至简,大象无形。
- astolia
- 论坛版主
- 帖子: 6542
- 注册时间: 2008-09-18 13:11
Re: 请教grub2启动windows的几个命令的区别
你先弄清楚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也不是放在根目录下,所以上面的命令都不适用
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的几个命令的区别
多谢版主详细的说明,谢谢!补充一下,我原来提问说成功概率大一点是出于这个考虑:我编辑了可启动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的几个命令的区别
ntldr/chainloader的加载目标就是要按具体情况来,没有通用的语法。chainloader +1这个也是存在缺陷的,如果PBR被破坏或者被grub本身的代码覆盖,它也没办法跳转到win的引导程序里。
你想做得通用点,就只能是在ntldr/chainloader之前,进行各种情况的检测,利用grub提供的if语句,执行不同的ntldr/chainloader。差不多像这样
或者用多个菜单项代替多个if判断,用的时候人工判断选择。
你想做得通用点,就只能是在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
- 疯无可疯
- 帖子: 64
- 注册时间: 2009-03-13 21:27
Re: 请教grub2启动windows的几个命令的区别
感谢版主的提示(❁´ω`❁),我再去思考学习一下astolia 写了: ↑2020-04-22 15:42 ntldr/chainloader的加载目标就是要按具体情况来,没有通用的语法。chainloader +1这个也是存在缺陷的,如果PBR被破坏或者被grub本身的代码覆盖,它也没办法跳转到win的引导程序里。
你想做得通用点,就只能是在ntldr/chainloader之前,进行各种情况的检测,利用grub提供的if语句,执行不同的ntldr/chainloader。差不多像这样或者用多个菜单项代替多个if判断,用的时候人工判断选择。代码: 全选
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
大道至简,大象无形。
- bzimage
- 帖子: 716
- 注册时间: 2006-03-14 10:25