无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 16854|回复: 26
打印 上一主题 下一主题

[已解决] GURB2 UEFI环境如何引导光盘上的非镜像PE系统

    [复制链接]
跳转到指定楼层
1#
发表于 2014-12-8 19:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jebbs 于 2014-12-10 11:17 编辑

我最近将自己的启动光盘迁移到GRUB2方案,做成BIOS和UEFI双启的方案。所有的难题都啃下来了,只剩下无法在UEFI环境下,GRUB2-->CHAINLOADER-->BOOTX64.EFI(WIN,在光盘中)。

先介绍下我的方案:
一个光盘中集成三个主要工具,分别是WIN8PE32、WIN8PE64和Parted Magic。预期是三者在BIOS和UEFI方案下都能正常启动
目前Parted Magic是OK的,唯一PE有问题,就卡在上面那条路上。我个人的理解是,EFI环境一定要FAT格式,而BOOTX64.EFI在光盘中,不是FAT,因而CHAINLOADER是不成功的,无论是有没有载入文件系统支持的模块。
目前感觉唯一可行的方案只能是MEMDISK了,但一是费内存,二是32和64之前不能共用外置了,都不是好办法。
不知道哪位大神对此有研究,有解决办法的?先在此谢过!



最新测试:我将微软的BOOTX64.EFI改名PE.EFI,放在efisys.bin中,loopback了也不能加载(此时GRUB的EFI是可以chainloader的)。原因可能是PE.efi访问不了Loop,也可能是其他未知问题

已解决,解决办法参见13楼和18楼,感谢2012hxwgz!

评分

参与人数 1无忧币 +5 收起 理由
有阴也有阳 + 5 很给力!

查看全部评分

2#
发表于 2014-12-8 19:38:34 | 只看该作者
本帖最后由 2011niumao 于 2014-12-8 20:32 编辑

我制作的的一个 小grub通用启动器-2014-12-06,可以参考.
汇集了 grub4ods grub2-pc grub2-efi(x86_64) grubia32-efi几种启动方式.
主要是引导UBUNTU系统.对于Windows 以及WINPE 还没有什么经验.
http://pan.baidu.com/s/1hqopezq

点评

谢谢,有些高级语句,学到了。 我在想是不是能MAP一个PE启动文件的FAT磁盘镜像,再chainloader到镜像中,再启动回CD。不知这个方案可行不  详情 回复 发表于 2014-12-9 09:01
回复

使用道具 举报

3#
 楼主| 发表于 2014-12-9 09:01:57 | 只看该作者
2011niumao 发表于 2014-12-8 19:38
我制作的的一个 小grub通用启动器-2014-12-06,可以参考.
汇集了 grub4ods grub2-pc grub2-efi(x86_64) gru ...

谢谢,有些高级语句,学到了。
我在想是不是能MAP一个PE启动文件的FAT磁盘镜像,再chainloader到镜像中,再启动回CD。不知这个方案可行不
回复

使用道具 举报

4#
发表于 2014-12-9 09:31:03 来自手机 | 只看该作者
loopback loop1 winpe.img chainloader (loop1)+1 boot 试一下,没用过!
回复

使用道具 举报

5#
发表于 2014-12-9 09:38:26 来自手机 | 只看该作者
不好意思,手机发帖没办法换行!如果不可以,就 insmod ntldr ntldr (loop1)/ntldr  (第二个ntldr可以是其他pe启动文件。 先说好,没实验,不知道进去实模式后会消失么。

点评

谢谢。GRUB2的BIOS下PE启动成功的哦,现在的问题是限定在UEFI模式下,因此肯定是chainloader *.efi,ntldr没用的哦。 loopback试过了,GRUB2里认loop,chainloader 后面的efi认不到,也启动不了  详情 回复 发表于 2014-12-9 09:54
回复

使用道具 举报

6#
 楼主| 发表于 2014-12-9 09:54:22 | 只看该作者
my9823 发表于 2014-12-9 09:38
不好意思,手机发帖没办法换行!如果不可以,就 insmod ntldr ntldr (loop1)/ntldr  (第二个ntldr可以是其 ...

谢谢。GRUB2的BIOS下PE启动成功的哦,现在的问题是限定在UEFI模式下,因此肯定是chainloader *.efi,ntldr没用的哦。
loopback试过了,GRUB2里认loop,chainloader 后面的efi认不到,也启动不了
回复

使用道具 举报

7#
 楼主| 发表于 2014-12-9 09:58:00 | 只看该作者
本帖最后由 jebbs 于 2014-12-9 09:59 编辑

现在的问题就转化为,ISO文件里有 bootx64.efi, bcd,win8pe.wim,如果是 纯 uefi 引导盘,这样就足够了,但中间插了个GRUB2,不知道怎么转过去

PS,纯UEFI下,bootx64.efi可能是在EFI镜像里的

点评

我把ISO文件解开到VHD上使用VBOX测试,可以使用grub2-efi,chainloader 方式启动到WINPE的那个bootx64.efi. 接着我把他们做成ISO,结果就不能由grubx64.efi引导bootx64.efi了。 报错说是 BCD 文件有错。 可以推  详情 回复 发表于 2014-12-9 10:17
回复

使用道具 举报

8#
发表于 2014-12-9 10:17:34 | 只看该作者
本帖最后由 2011niumao 于 2014-12-9 11:06 编辑
jebbs 发表于 2014-12-9 09:58
现在的问题就转化为,ISO文件里有 bootx64.efi, bcd,win8pe.wim,如果是 纯 uefi 引导盘,这样就足够了,但 ...


我把ISO文件解开到VHD上使用VBOX测试,可以使用grub2-efi,chainloader 方式启动到WINPE的那个bootx64.efi.
接着我把他们做成ISO,结果就不能由grubx64.efi引导bootx64.efi了。
报错说是 BCD 文件有错。

可以推测  如果是做启动优盘,解开就可以。但是如果是做启动光盘不行。
而且这个错误很奇怪,不是说不能引导bootx64.efi(WINPE的),是说BCD有错。
也许是WINPE的系统内的问题吧。或者说调整一下WINPE的注册表是不是就行呢。

是 0xc000000e错误。很常见的.百度中.....

点评

这个问题应该是和我的同理的。如果有任何进展记得分享给我啊 我怀疑是chainloader的时候,后者所在的分区格式问题,GPT+FAT,这两个条件在ISO上一个也不满足  详情 回复 发表于 2014-12-9 11:13
回复

使用道具 举报

9#
发表于 2014-12-9 10:28:28 来自手机 | 只看该作者
这个板块不是有个grub2全内置的efi吗,你可以用它做bootx64.efi
回复

使用道具 举报

10#
发表于 2014-12-9 10:29:24 来自手机 | 只看该作者
俺们还是7-8年前的电脑,没办法折腾uefi

点评

我是在虚拟机上折腾的。GRUB2 EFI已经完工了的,能引导EFI版的parted magic了,但无论如何,需要微软的bootx64.efi来读取BCD,引导WIM文件。但GRUB2交给微软引导时行不通  详情 回复 发表于 2014-12-9 11:27
回复

使用道具 举报

11#
 楼主| 发表于 2014-12-9 11:13:31 | 只看该作者
2011niumao 发表于 2014-12-9 10:17
我把ISO文件解开到VHD上使用VBOX测试,可以使用grub2-efi,chainloader 方式启动到WINPE的那个bootx64. ...

这个问题应该是和我的同理的。如果有任何进展记得分享给我啊
我怀疑是chainloader的时候,后者所在的分区格式问题,GPT+FAT,这两个条件在ISO上一个也不满足
回复

使用道具 举报

12#
 楼主| 发表于 2014-12-9 11:27:40 | 只看该作者
my9823 发表于 2014-12-9 10:29
俺们还是7-8年前的电脑,没办法折腾uefi

我是在虚拟机上折腾的。GRUB2 EFI已经完工了的,能引导EFI版的parted magic了,但无论如何,需要微软的bootx64.efi来读取BCD,引导WIM文件。但GRUB2交给微软引导时行不通
回复

使用道具 举报

13#
发表于 2014-12-9 13:58:00 | 只看该作者
本帖最后由 2012hxwgz 于 2014-12-9 14:15 编辑

grub2 环境下无法启动光盘上的BCD
uefiboot->gurb2.efi->efi shell.efi->cdboot.efi->bootmgr.efi->BCD
efi shell 是命令符环境,要实现自动引导 cdboot.efi,要自己创建文本文件 startup.nsh,作用类似autoexec.bat。
cdboot.efi 在安装盘\efi\microsoft\boot目录,bootmgr.efi在安装盘根目录。

光盘引导文件镜像
\efi\boot\    放grub2的启动文件
\   放cdboot.efi、startup.nsh

光盘根目录
bootmgr.efi
shell.efi

grub2环境用 chainloader 引导 shell.efi, 进入EFI Shell 环境,光盘的引导文件被识别为fs0,或fs1、fs2... (视磁盘fat卷的多少,如果不存在fat卷,则为fs0。),搜索并自动运行 startup.nsh ,如果不能自动启动,则需手动运行 cdboot.efi 。

EFI_Shell_x64.zip

251.53 KB, 下载次数: 7355, 下载积分: 无忧币 -2

点评

太好了~我查阅了很多资料,都快放弃了,你的回复终于给了一线曙光啊。 能给一个大概的示例吗,因为efi shell的资料太少了。甚至我连cdboot.efi都找不到  详情 回复 发表于 2014-12-9 16:37

评分

参与人数 1无忧币 +5 收起 理由
wuxin9712 + 5

查看全部评分

回复

使用道具 举报

14#
 楼主| 发表于 2014-12-9 16:37:16 | 只看该作者
本帖最后由 jebbs 于 2014-12-9 17:36 编辑
2012hxwgz 发表于 2014-12-9 13:58
grub2 环境下无法启动光盘上的BCD
uefiboot->gurb2.efi->efi shell.efi->cdboot.efi->bootmgr.efi->BCD
e ...

太好了~我查阅了很多资料,都快放弃了,你的回复终于给了一线曙光啊。
已经见到window boot manager了,手工操作的,但能确保EFI镜像以后每次都是fs0:吗?
还有,似乎已经到WIN文件载入过程了,但虚拟机显示“发生错误,导致虚拟CPU进入关闭状态”。。同一个WIM镜像,非GRUB2引导过来的环境中,启动是OK的。请问,有知道这个问题的成因吗?(原因是用错了.efi的版本,要用win8里提取出来的
终于成功了,多谢 2012hxwgz
回复

使用道具 举报

15#
发表于 2014-12-9 19:21:26 | 只看该作者
本帖最后由 2012hxwgz 于 2014-12-9 19:23 编辑

要确保fs0 则电脑的硬盘不能有FAT卷。另外可用startup.nsh进行控制启动卷,语法同CMD的批处理类似。进入EFI shell 后可用 help -b 来显示命令帮助.

点评

echo -off echo Seach for "cdboot.efi"... for %b in fs0 fs1 fs2 fs3 fs4 fs5 fs6 fs7 fs8 fs9 echo Seaching %b ... if exist %b:\cdboot.efi then echo cdboot found in %b:! pause %b: cdboo  详情 回复 发表于 2014-12-10 09:25
startup.nsh 控制启动卷,能说得详细点吗?谢谢  详情 回复 发表于 2014-12-10 08:45
回复

使用道具 举报

16#
 楼主| 发表于 2014-12-10 08:45:20 | 只看该作者
2012hxwgz 发表于 2014-12-9 19:21
要确保fs0 则电脑的硬盘不能有FAT卷。另外可用startup.nsh进行控制启动卷,语法同CMD的批处理类似。进入EFI ...

startup.nsh 控制启动卷,能说得详细点吗?谢谢
回复

使用道具 举报

17#
 楼主| 发表于 2014-12-10 09:25:27 | 只看该作者
本帖最后由 jebbs 于 2014-12-10 11:16 编辑
2012hxwgz 发表于 2014-12-9 19:21
要确保fs0 则电脑的硬盘不能有FAT卷。另外可用startup.nsh进行控制启动卷,语法同CMD的批处理类似。进入EFI ...

echo -off

set efiname64 "cdboot8pe64"
set efiname32 "cdboot8pe32"
echo Seach for "%efiname64%.efi"...
for %b in fs0 fs1 fs2 fs3 fs4 fs5 fs6 fs7 fs8 fs9
echo Seaching %b ...
if exist %b:\%efiname64%.efi then
echo %efiname64% found in %b:!
%b:
%efiname64%
if not %lasterror% == 0 then
%efiname32%
endif

exit
endif
endfor

以上是可行的~但 fs0 fs1 fs2 fs3 fs4 fs5 fs6 fs7 fs8 fs9这段不满意,有办法自动获取所有fs,而不用这里指定吗?
GRUB配置:menuentry "启动 Win8 PE (请注意选择版本)"{
echo "正在加载 Win8 PE,请等待...."
if [ "${grub_cpu}" == "x86_64" ]; then
search --file /grub2/uefi/shell64.efi --set=root
chainloader /grub2/uefi/shell64.efi
fi
if [ "${grub_cpu}" == "i386" ]; then
search --file /grub2/uefi/shell32.efi --set=root
chainloader /grub2/uefi/shell32.efi
fi
}

以上所有红字部分实现了到windows boot manager 前,32位和64位的自动选择。
目前GRUB2合盘后,WIN部分的启动效果与单独未合盘前几乎一致了,终于可以暂时告一段落,谢谢各位!尤其是2012hxwgz!

点评

“32位和64位的自动选择” 在bios环境中,此方法好像失效。  详情 回复 发表于 2014-12-10 20:26
如果合盘不太大,求分享成品 嘿嘿...  详情 回复 发表于 2014-12-10 18:47
回复

使用道具 举报

18#
发表于 2014-12-10 18:47:06 | 只看该作者
jebbs 发表于 2014-12-10 09:25
echo -off

set efiname64 "cdboot8pe64"


如果合盘不太大,求分享成品 或者 给个模板ISO 嘿嘿...

点评

http://bbs.wuyou.com/forum.php?mod=viewthread&tid=349503 见我新发的帖子,链接稍后附上  详情 回复 发表于 2014-12-11 10:14
回复

使用道具 举报

19#
发表于 2014-12-10 20:26:48 | 只看该作者
jebbs 发表于 2014-12-10 09:25
echo -off

set efiname64 "cdboot8pe64"

“32位和64位的自动选择”
在bios环境中,此方法好像失效。
回复

使用道具 举报

20#
 楼主| 发表于 2014-12-11 08:48:21 | 只看该作者

补充:将cdboot8pe32.efi (原win版bootia32.efi)中的BCD用HEX编辑,将其中BCD改为B32,再将EFI的BCD复制一份,重命名为B32,B32中添加32位引导项,BCD中添加64位引导项,则WIN引导过程中也实现了32、64自动选择

至此EFI引导部分已经完全自动化了。
回复

使用道具 举报

21#
 楼主| 发表于 2014-12-11 10:14:11 | 只看该作者
2011niumao 发表于 2014-12-10 18:47
如果合盘不太大,求分享成品 或者 给个模板ISO 嘿嘿...

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=349503

见我新发的帖子,链接稍后附上

点评

多谢.下载中.  详情 回复 发表于 2014-12-11 12:26
回复

使用道具 举报

22#
发表于 2014-12-11 12:26:02 | 只看该作者
jebbs 发表于 2014-12-11 10:14
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=349503

见我新发的帖子,链接稍后附上

多谢.下载中.
回复

使用道具 举报

23#
发表于 2014-12-15 00:46:13 | 只看该作者
学习
回复

使用道具 举报

24#
发表于 2015-6-2 19:06:13 | 只看该作者
楼主,下了你的合盘看了下,还是不懂怎么样启动的
你写的是EFI: efisys.bin->Bootia32.efi->GRUB2->shell32.efi->startup.nsh->cdboot8pe32.efi->bootmgr.efi->BCD->Win8PE.WIM->boot.sdi
但我把红色的删了还是能正常启动,别外绿色部分你的合盘里都没有

点评

efisys.bin与Bootia32.efi实为同一文件,startup.nsh可用txt制作自动运行参数之后改名。cdboot8pe32.efi只是cdboot.efi改名而已,boot.sdi只是虚拟分区既然以CD形式当然可删除。  详情 回复 发表于 2016-3-18 20:33
回复

使用道具 举报

25#
发表于 2015-8-17 12:26:50 | 只看该作者
嗯,看看先,,,楼主写的很详细。。。。
回复

使用道具 举报

26#
发表于 2016-1-26 16:05:34 | 只看该作者
有意思  我之前也测试过各种实体机器,有机会我们一起探讨一下解决这个问题,QQ344043074
回复

使用道具 举报

27#
发表于 2016-3-18 20:33:09 | 只看该作者
husiqin 发表于 2015-6-2 19:06
楼主,下了你的合盘看了下,还是不懂怎么样启动的
你写的是EFI: efisys.bin->Bootia32.efi->GRUB2->shell3 ...

efisys.bin与Bootia32.efi实为同一文件,startup.nsh可用txt制作自动运行参数之后改名。cdboot8pe32.efi只是cdboot.efi改名而已,boot.sdi只是虚拟分区既然以CD形式当然可删除。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-26 03:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表