hhh333 发表于 2014-9-19 17:35:49

EFI启动及PXE/iPXE的BCD位置

本帖最后由 hhh333 于 2014-9-19 18:09 编辑

近期在调试EFI网启,BCD位置各有不同,笔记出来:

1、EFI本地启动与EFI网启BCD不一样
EFI本地启动:bootx64.efi-->efi\microsoft\boot\bcd-->pe.wim
EFI网络启动:bootx64.efi-->boot\bcd-->pe.wim

2、EFI网启时PXE与iPXE的BCD不一样
PXE过程:bootx64-->boot\bcd-->pe.wim
iPXE过程:snponly.efi-->wimboot-->bootx64.efi-->efi\microsoft\boot\bcd-->pe.wim

基于以上过程,如何修改自己的PE网启模块?下面谈一下经验:
新的wimboot可以支持EFI网启了,显然用iPXE/wimboot/HTTP配合网启目前速度是最快的。这个过程如下:
efi\boot\ipxe64.efi-->efi\H3_iPXEM.EFI-->BOOT\wimboot-->efi\boot\bootx64.efi-->efi\microsoft\boot\bcd-->UEFI PE(Win8 64或Win8.1 64)
其中ipxe64.efi是通过网络编译的,脚本很简单
#!ipxe
dhcp
chain efi/H3_iPXEM.EFI

H3_iPXEM.EFI是32位与64位共用的,如下:
#!ipxe
set menu-timeout 8000
set menu-default w8pe
isset ${ip} || dhcp
isset ${next-server} || set next-server 192.168.7.100
cpuid --ext 29 && set x64 Y || set x32 Y
:start
menu iPXE EFI Boot Menu
item --gap --             -------------------------------- H3 PE TOOL ---------------------------
item w8pe                   1-- Win8 PE
item w81pe                  2-- Win81 PE
item --gap --             -----------------------------------------------------------------------
choose --timeout ${menu-timeout} --default ${menu-default} selected
goto ${selected}

:failed
echo Booting failed, dropping to shell
goto shell

:w8pe
        set bootfile bootx64.efi && set tbcdfile BCD && set sbcdfile b64 && set pefile H3_864.WIM
        isset ${x32} && set bootfile bootia32.efi && set tbcdfile B32 && set sbcdfile b832 && set pefile H3_8PE.WIM ||
goto wimbootpe

:w81pe
        set bootfile bootx64.efi && set tbcdfile BCD && set sbcdfile b16 && set pefile H3_8164.WIM
        isset ${x32} && set bootfile bootia32.efi && set tbcdfile B32 && set sbcdfile b8132 && set pefile H3_81PE.WIM ||
goto wimbootpe

:wimbootpe
kernel http://${next-server}/BOOT/wimboot
initrd http://${next-server}/efi/boot/${bootfile}
initrd -n ${tbcdfile} http://${next-server}/efi/microsoft/boot/${sbcdfile}
initrd http://${next-server}/BOOT/boot.sdi
initrd http://${next-server}/BOOT/${pefile}
boot || goto failed
goto start

我是神仙 发表于 2014-9-19 22:22:00

EFI网启时PXE与iPXE的BCD不一样

这个其实是一样的,可以用同一位置的同一文件

因为wimboot对来源文件的路径不做任何要求 只要文件名对了就行。

我是神仙 发表于 2014-9-20 09:12:38

本帖最后由 我是神仙 于 2014-9-20 09:23 编辑

1、EFI本地启动与EFI网启BCD不一样
EFI本地启动:bootx64.efi-->efi\microsoft\boot\bcd-->pe.wim
EFI网络启动:bootx64.efi-->boot\bcd-->pe.wim

2、EFI网启时PXE与iPXE的BCD不一样
PXE过程:bootx64-->boot\bcd-->pe.wim
iPXE过程:snponly.efi-->wimboot-->bootx64.efi-->efi\microsoft\boot\bcd-->pe.wim


笼统的说 “EFI本地启动与EFI网启BCD不一样”不大好,因为下面紧接着就说了“EFI网启”有两种。
而有一种网启是可以和本地启动使用同一位置的同一文件的,另一种网启位置不同但内容可以是复制的同样文件


这里实际有谈到三种EFI启动(还有光盘UEFI是另外一种)
1 EFI本地启动:\efi\boot\bootx64.efi--> \efi\microsoft\boot\bcd --> pe.wim
2 PXE EFI过程:bootx64.efi --> \boot\bcd --> pe.wim
3 iPXE EFI过程:snponly.efi --> wimboot --> bootx64.efi--> bcd-->pe.wim

前面有\开头的文件是绝对目录,不能改,其他文件可以是任意目录。

即 1EFI本地启动 和 2PXE EFI网启由于目录名使用了不同的绝对目录 不能使用同一BCD文件。而且目录名差异过大,主要是长度差异太大,无法通过修改的方式指向同一文件。
但 3 iPXE EFI过程这个全部使用的是任意目录,所以它可以和 1EFI本地启动使用同一文件, 也可以和 2PXE EFI网启使用同一文件。

均测试通过

initrd ${base}/efi/boot/bootx64.efi
initrd ${base}/efi/microsoft/boot/bcd
initrd ${base}/boot/boot.sdi   
initrd ${base}/sources/boot.wim
这就和本地EFI启动使用同一BCD文件

改成
initrd ${base}/boot/bcd
这就和PXE的EFI启动使用同一BCD文件

都可以启动。








2、我之所以说iPXE与PXE不一样应该是有根据的:
因为我已经将bootx64.efi中的网启的BCD改成了boot\bxe,如果是网启它应该找BXE文件,也即wimboot应该要将你从服务器获得的BCD改成BXE,而现在还是使用BCD文件名。
当然,如果wimboot永远使用bcd作为bcd文件的文件名也有可能。



我记得在另一贴中回复过你的
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=338135&page=3#pid2966506

发表于 2014-9-10 14:08:11 | 只看该作者

    hhh333 发表于 2014-9-10 13:58
    我改过bootx64.efi,没有问题,不想搞很多启动文件


刚才我也试了下 查找5C 00 42 00 43 00 44 即\BCD 改为其他的如BCG 确实可以启动。



这是81update1中的bootx64.efi网启时的BCD位置:


好像不是这里吧。好像有两处
一处是\bcd
一处是\boot\bcd
都要改吧?反正我两处都改了,可以启动



kernel wimboot
initrd ${base}/efi/boot/bootx64.efi
initrd ${base}/efi/microsoft/boot/bxe
initrd ${base}/boot/boot.sdi   
initrd ${base}/sources/boot.wim

完全可以启动


我使用的boot.wim其实就是你那个h3cdall.iso里面pe8164.wim


对这个bcd文件的重复使用 我前几天研究过怎么用最少的文件支持各种启动,还发了个帖子
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=337945
所以还是比较熟悉
不过这些启动方式也就这几天熟悉,过几天可能就忘了 总归是太复杂了

hhh333 发表于 2014-9-20 07:20:41

本帖最后由 hhh333 于 2014-9-20 07:43 编辑

我是神仙 发表于 2014-9-19 22:22
EFI网启时PXE与iPXE的BCD不一样

这个其实是一样的,可以用同一位置的同一文件


1、不知道什么原因,MS在EFI的本地启动与网络启动要使用不同的BCD
2、我之所以说iPXE与PXE不一样应该是有根据的:
因为我已经将bootx64.efi中的网启的BCD改成了boot\bxe,如果是网启它应该找BXE文件,也即wimboot应该要将你从服务器获得的BCD改成BXE,而现在还是使用BCD文件名。
当然,如果wimboot永远使用bcd作为bcd文件的文件名也有可能。

又看了不是EFI情况下的ipxe菜单:
:w8pe
kernel http://${next-server}/BOOT/wimboot
initrd http://${next-server}/BOOT/H3_MGRW8.BIN        bootmgr
initrd http://${next-server}/BOOT/BW8        BW8
initrd http://${next-server}/BOOT/boot.sdi        boot.sdi
initrd http://${next-server}/BOOT/H3_8PE.WIM        H3_8PE.WIM
boot || goto failed
goto start

我已经将H3_MGRW8.BIN中的BCD改成了BW8,则wimboot时必须是BW8,不能是BCD,说明wimboot还是根据启动文件来决定BCD文件的名称的。
这是81update1中的bootx64.efi网启时的BCD位置:


本地启动时的BCD文件名位置:

会自动到efi\microsoft\boot下找

hhh333 发表于 2014-9-20 10:25:52

本帖最后由 hhh333 于 2014-9-20 10:31 编辑

我是神仙 发表于 2014-9-20 09:12
笼统的说 “EFI本地启动与EFI网启BCD不一样”不大好,因为下面紧接着就说了“EFI网启”有两种。
...

如上面的图所示:
将bootx64.efi用winhex查找\bcd,会找到两个,一个是\Boot\BCD--PXE启动时使用的BCD(真正位置:${pxeserver root}\Boot\BCD),另一个是\BCD--本地启动时BCD,而且前面有变量,实际指向\efi\microsoft\boot\bcd,因为将这个改一个名如B64,则会到这个地方去找B64

32位与此相似,在我发布的盘中这两个地方都改成了B32,实际上是不同地方的B32。

我是神仙 发表于 2014-9-20 11:31:24

hhh333 发表于 2014-9-20 10:25
如上面的图所示:
将bootx64.efi用winhex查找\bcd,会找到两个,一个是\Boot\BCD--PXE启动时使用的BCD ...

总之都改了 wimboot就可以用改过名字的bcd 了

hhh333 发表于 2014-9-20 11:56:40

我是神仙 发表于 2014-9-20 11:31
总之都改了 wimboot就可以用改过名字的bcd 了

两个代表的意义不同好不好,你改两个地方,如果用这个来本地启动,你必须在efi\microsoft\boot下准备改名的BCD文件。
近期在与Tiny PXE Server 作者交流他这个软件,他有一种更方便的方式,用DHCP 252 option带@arch变量来指明BCD位置,感觉也不错。就是段的功能还没有很好地实现。

我是神仙 发表于 2014-9-20 12:18:03

hhh333 发表于 2014-9-20 11:56
两个代表的意义不同好不好,你改两个地方,如果用这个来本地启动,你必须在efi\microsoft\boot下准备改名 ...

无所谓啊正好三者都用同一个bcd文件252好像hanwin不支持

caocaofff 发表于 2014-10-18 23:04:06

怎么修改wimboot文件的boot路径呢?就是存放wim的,例如/boot/h3_864.wim。现在我wim放在其它地方,例如/1234/h3_864.wim,改名后的BCD已经指定了路径为/1234/h3_864.wim(这里先不讨论BCD),uefi ipxe时错误,路径都改为/boot/...就没问题。或者能给出委婉的解决办法?

zhaohj 发表于 2014-11-12 15:25:14

本帖最后由 zhaohj 于 2014-11-12 15:27 编辑

准备使用 iPXE测试看看,问大家:
原先的PXE启动的使用中文的,bcd中包含很多pe,如w8pe/w8pe.wim、w8pe/w8pe1.wim、w8pe/w8pe2.wim ......
现在用 iPXE,BCD怎么写?
我用普通的bios启动的,非efi

devilma 发表于 2016-3-6 20:32:28

不错参考价值太大了

510819776 发表于 2018-1-23 02:45:49

可惜现在情况变了,
本地启动efi   bootx64.efi和bcd同目录就行
新版wimboot更不限制bcd位置,一样与bootx64同目录就好
只不过非要用微软的bootx64.efi通过pxe启动,bcd只能是/boot/bcd 当然通过winhex可以改下
最后结果都放一起就好了

2012masterasia 发表于 2018-4-1 14:55:49

ipxe支持启动win10吗

su@xisrd.com 发表于 2018-4-6 20:19:08

謝謝分享

papago 发表于 2018-10-20 23:57:41

EFI启动及PXE/iPXE的BCD位置      

papago 发表于 2018-10-20 23:58:12

分析pxe的引导过程

王彬784428960 发表于 2020-10-24 08:43:51

感谢分析 好多看不懂 还在学习中

王彬784428960 发表于 2020-10-24 08:52:04

我的是群辉启动PXE 加载的文件是pxeboot.n12 但是在启动的时候提示File:\boot\bxdStatus:0xc000000f这个文件出错 这个文件在tftp根目录下也是有的不知道为什么就是报错
页: [1]
查看完整版本: EFI启动及PXE/iPXE的BCD位置