无忧启动论坛

标题: 关于分区表项法中grldr的写法 [打印本页]

作者: lbw2007    时间: 2014-9-2 20:55
标题: 关于分区表项法中grldr的写法
本帖最后由 lbw2007 于 2014-9-3 16:59 编辑

自从使用了P大的分区表项法制作双启FBA以后(原帖http://bbs.wuyou.net/forum.php?mod=viewthread&tid=328601),原来的启动本地windows系统菜单便不好使了:

title 1.启动本地windows系统
find --set-root --devices=h /bootmgr || find --set-root --devices=h /ntldr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --devices=h /bootmgr || find --set-root --devices=h /ntldr
chainloader /bootmgr|| chainloader /ntldr

直接执行的话会进入uefi启动的win8pe。因为没看见过相关的帖子,我自己分析了一下
*没有映射efi映像,即没有将8pe.img这个分区映像添加到分区表之前,分区表的结构为:
(ud)——UD区
(hd0,0)——U盘可见区
*映射EFI区之后,分区结构变为:
(ud)——UD区
(hd0,0)——U盘可见区
(hd0,1)——uefi区

也就是说,按照原来的写法:grub会先在hd0中的uefi区中搜索到bootmgr并set root(因为我的uefi分区下存在bootmgr文件);接下来的两条map命令其实也仅仅是自己和自己调换并仿真;最后加载了uefi区中的bootmgr。实际执行效果等同于:
find --set-root --devices=h /bootmgr || find --set-root --devices=h /ntldr
chainloader /bootmgr|| chainloader /ntldr

因为我是小白,对grub命令不甚了解,所以我用小白的方法改良了一下:(红色字体代表有所改动)

title 1.启动本地windows系统
map (hd1) (hd0)
map (hd0) (hd1)
map --rehook
find --set-root --devices=h /bootmgr || find --set-root --devices=h /ntldr
chainloader /bootmgr|| chainloader /ntldr
改了以后在一部分机器上正常了,但是还有一小部分机器依然无效。我对此非常的费解:grub不是会把引导分区(即grldr所在分区)的设备设为hd0吗?百般无奈下,我又改了改:

title 1.启动本地windows系统
find --set-root --devices=h /SOURCES/boot.wim
map (hd1) ()
map () (hd1)
map --rehook
find --set-root --devices=h /Boot/BCD || find --set-root --devices=h /ntldr
chainloader /bootmgr|| chainloader /ntldr

以前不能正常启动的现在都能进到本地系统了。简单解释一下:我用的8pe是我心如水8pe,其中/SOURCES/boot.wim只有8pe中才存在,其他分区内检测不到自然就不会被set root了。
先搜索一个只有8pe中才包含的文件并将所在分区设为root区;然后将root区所在磁盘和hd1互换并仿真;最后搜索只有硬盘中win7或XP才存在的文件,将其分区set root并引导。

这样写确实解决了问题,但还是感觉怪怪的,不专业。
咱们g4d区相对来说还有挺有人气的,如果能帮忙提提意见的话,我也没白写,您也没白看。菜单嘛虽然挺小众化,但是也不是很好弄。本人不才,请指正!


作者: pseudo    时间: 2014-9-3 14:49
分区表项法那个帖子里,某楼曾经有网友提供一个现成bootmgr(好像还有bcd),可以放在efi而不是boot文件夹下。
作者: lbw2007    时间: 2014-9-3 16:28
谢谢P大,现在是BIOS启动U盘之后,g4d找不到本地系统。改不改bootmgr路径好像没什么关系……
作者: mdyblog    时间: 2014-9-5 15:43
本帖最后由 mdyblog 于 2015-1-14 17:15 编辑

这样写可能清楚些(0x80 就是hd0的数值形式):
title 1.启动本地windows系统
    rootnoverify (hd1,0) || rootnoverify (hd1,1) || rootnoverify (hd1,2) || rootnoverify (hd1,3) || rootnoverify (hd1,4) || set _=
    find --set-root --devices=h /boot/BCD || find --set-root --devices=h /ntldr
    set /A rootdrv=*0x82A0 & 0xFFFF
    if not %rootdrv% == 0x80 map (%rootdrv%) (0x80)
    if not %rootdrv% == 0x80 map (0x80) (%rootdrv%)
    if not %rootdrv% == 0x80 map --rehook
    if not %rootdrv% == 0x80 rootnoverify  (0x80) || set _=
    find --set-root --devices=h /boot/BCD || find --set-root --devices=h /ntldr
    chainloader /bootmgr || chainloader /ntldr


要注意,如P大所说:
8pe的 /bootmgr 不要 放在 /下面。否则 和 本地硬盘混淆。

其实 原来也没错的。

其实你碰到的问题就是:8pe的 /bootmgr  和 本地硬盘的/bootmgr , 混淆。
上面菜单 鲁棒点。







欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3