无忧启动论坛

标题: GURB2 UEFI环境如何引导光盘上的非镜像PE系统 [打印本页]

作者: jebbs    时间: 2014-12-8 19:12
标题: GURB2 UEFI环境如何引导光盘上的非镜像PE系统
本帖最后由 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!
作者: 2011niumao    时间: 2014-12-8 19:38
本帖最后由 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
作者: jebbs    时间: 2014-12-9 09:01
2011niumao 发表于 2014-12-8 19:38
我制作的的一个 小grub通用启动器-2014-12-06,可以参考.
汇集了 grub4ods grub2-pc grub2-efi(x86_64) gru ...

谢谢,有些高级语句,学到了。
我在想是不是能MAP一个PE启动文件的FAT磁盘镜像,再chainloader到镜像中,再启动回CD。不知这个方案可行不
作者: my9823    时间: 2014-12-9 09:31
loopback loop1 winpe.img chainloader (loop1)+1 boot 试一下,没用过!
作者: my9823    时间: 2014-12-9 09:38
不好意思,手机发帖没办法换行!如果不可以,就 insmod ntldr ntldr (loop1)/ntldr  (第二个ntldr可以是其他pe启动文件。 先说好,没实验,不知道进去实模式后会消失么。
作者: jebbs    时间: 2014-12-9 09:54
my9823 发表于 2014-12-9 09:38
不好意思,手机发帖没办法换行!如果不可以,就 insmod ntldr ntldr (loop1)/ntldr  (第二个ntldr可以是其 ...

谢谢。GRUB2的BIOS下PE启动成功的哦,现在的问题是限定在UEFI模式下,因此肯定是chainloader *.efi,ntldr没用的哦。
loopback试过了,GRUB2里认loop,chainloader 后面的efi认不到,也启动不了
作者: jebbs    时间: 2014-12-9 09:58
本帖最后由 jebbs 于 2014-12-9 09:59 编辑

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

PS,纯UEFI下,bootx64.efi可能是在EFI镜像里的
作者: 2011niumao    时间: 2014-12-9 10:17
本帖最后由 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错误。很常见的.百度中.....

作者: my9823    时间: 2014-12-9 10:28
这个板块不是有个grub2全内置的efi吗,你可以用它做bootx64.efi
作者: my9823    时间: 2014-12-9 10:29
俺们还是7-8年前的电脑,没办法折腾uefi
作者: jebbs    时间: 2014-12-9 11:13
2011niumao 发表于 2014-12-9 10:17
我把ISO文件解开到VHD上使用VBOX测试,可以使用grub2-efi,chainloader 方式启动到WINPE的那个bootx64. ...

这个问题应该是和我的同理的。如果有任何进展记得分享给我啊
我怀疑是chainloader的时候,后者所在的分区格式问题,GPT+FAT,这两个条件在ISO上一个也不满足
作者: jebbs    时间: 2014-12-9 11:27
my9823 发表于 2014-12-9 10:29
俺们还是7-8年前的电脑,没办法折腾uefi

我是在虚拟机上折腾的。GRUB2 EFI已经完工了的,能引导EFI版的parted magic了,但无论如何,需要微软的bootx64.efi来读取BCD,引导WIM文件。但GRUB2交给微软引导时行不通
作者: hxwgz    时间: 2014-12-9 13:58
本帖最后由 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


作者: jebbs    时间: 2014-12-9 16:37
本帖最后由 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
作者: hxwgz    时间: 2014-12-9 19:21
本帖最后由 2012hxwgz 于 2014-12-9 19:23 编辑

要确保fs0 则电脑的硬盘不能有FAT卷。另外可用startup.nsh进行控制启动卷,语法同CMD的批处理类似。进入EFI shell 后可用 help -b 来显示命令帮助.
作者: jebbs    时间: 2014-12-10 08:45
2012hxwgz 发表于 2014-12-9 19:21
要确保fs0 则电脑的硬盘不能有FAT卷。另外可用startup.nsh进行控制启动卷,语法同CMD的批处理类似。进入EFI ...

startup.nsh 控制启动卷,能说得详细点吗?谢谢
作者: jebbs    时间: 2014-12-10 09:25
本帖最后由 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!


作者: 2011niumao    时间: 2014-12-10 18:47
jebbs 发表于 2014-12-10 09:25
echo -off

set efiname64 "cdboot8pe64"


如果合盘不太大,求分享成品 或者 给个模板ISO 嘿嘿...
作者: 青青草    时间: 2014-12-10 20:26
jebbs 发表于 2014-12-10 09:25
echo -off

set efiname64 "cdboot8pe64"

“32位和64位的自动选择”
在bios环境中,此方法好像失效。
作者: jebbs    时间: 2014-12-11 08:48

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

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

作者: jebbs    时间: 2014-12-11 10:14
2011niumao 发表于 2014-12-10 18:47
如果合盘不太大,求分享成品 或者 给个模板ISO 嘿嘿...

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

见我新发的帖子,链接稍后附上
作者: 2011niumao    时间: 2014-12-11 12:26
jebbs 发表于 2014-12-11 10:14
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=349503

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

多谢.下载中.
作者: 一笑随缘    时间: 2014-12-15 00:46
学习
作者: husiqin    时间: 2015-6-2 19:06
楼主,下了你的合盘看了下,还是不懂怎么样启动的
你写的是EFI: efisys.bin->Bootia32.efi->GRUB2->shell32.efi->startup.nsh->cdboot8pe32.efi->bootmgr.efi->BCD->Win8PE.WIM->boot.sdi
但我把红色的删了还是能正常启动,别外绿色部分你的合盘里都没有

作者: devilma    时间: 2015-8-17 12:26
嗯,看看先,,,楼主写的很详细。。。。
作者: 110654    时间: 2016-1-26 16:05
有意思  我之前也测试过各种实体机器,有机会我们一起探讨一下解决这个问题,QQ344043074
作者: zengqcyxx    时间: 2016-3-18 20:33
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形式当然可删除。




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