无忧启动论坛

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

光盘一启接管EFI太难了

    [复制链接]
跳转到指定楼层
1#
发表于 2017-11-26 16:12:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hhh333 于 2017-12-15 08:23 编辑

目前有一些EFI启动阶段的工具,如MemTest7.4,Konboot等,想把它们做到ISO文件中发布,这样就要求具备EFI引导功能的菜单工具接管EFI启动,即标题所述由光盘作第一启动进入EFI引导菜单。经过试验发现都不尽如人意。
一、XORBOOT
1、做好菜单文件xorboot.xor,导出引导文件bootx64.efi,打包到启动映像efisys.bin,再OSCDIMG或MKISOFS打包成EFI启动光盘;
2、虚拟机测试,无论把xorboot.xor放那个位置,无论是否为UDF还是标准ISO格式,都是启动错误;
结论:失败


注:经过P大连续奋战,最新版将以上的问题全部解决了,可以说是最完美的方案了




二、rEfind
1、与上述相似,编辑好菜单,将refind_x64.efi改名为bootx64.efi,最后做出UDF光盘;
2、启动是成功的但出不了图形界面,继续将那几个子目录放启动映像,终于做出图形界面;
也有一些问题:
1、读不了外面光盘的东西,只能读启动映像里面的东西。要转winpe,就必须把windows原版的bootx64.efi或bootmgfw.efi(两个是一个文件改名来的)放到映像中调用它才能够转windows
2、MemTest7.4,Konboot等光盘中调用不了,也只有放映像中才能调用,这样启动映像就比较大了,修改也不方便;
3、也没找到判断64位和32位的语句,也不会定制,使用了一样的配置文件refind.conf,只能在菜单中把两者都写上,显得比较乱;
(注:把windows 32位和64位的两个启动文件分别改名为cdbootx64.efi和cdbootia32.efi放映像的根目录,rEfind会自动识别到第一个菜单项上面)
结论:是成功的,也可正常转windows PE,但不能读取光盘上的其他启动与工具。因此要解决的问题为三个:
①如何读取光盘上的文件?
②如何针对32位和64位定制不同的配制文件或
③在同一配制文件中使用判断以便自动区分32和64位;
顺便说一下,这种横排的图形界面有点不习惯。


三、grub2
1、编辑好菜单,由于功能强大,做了个bios与EFI使用的超级大菜单,再用grub-mkimage生成启动文件,做成启动映像,菜单与支持文件不用放启动映像中,生成启动时固定将$prefix定义到/efi/grub,初始查找文件定义为grub.cfg,最后打包成ISO;
2、启动成功,但转bootmgfw.efi,那么都不成功,最后只有按论坛中的方法,先转EFI SHELL再通过定制startup.nsh自动转bootmgfw.efi,绕一圈回来启动Windows PE;
这种方法没有上面的毛病,定制和读光盘上的文件都方便,但就是不能直接chainloader bootmgfw.efi


最后共享自己做的超级大菜单(Bios与EFI自适应,32位与64位自适应)
  1. set default=1
  2. set fallback=0
  3. set gfxmode=800x600,auto
  4. set gfxterm_font=unicode
  5. set lang=zh_CN
  6. set locale_dir=$prefix/locale
  7. set pager=1
  8. set timeout=30

  9. #激活图形模式的输出终端,以允许使用中文和背景图
  10. terminal_output gfxterm
  11. #设置背景图片
  12. background_image $prefix/background.jpg
  13. #加载字体文件($prefix/fonts/unicode.pf2)
  14. loadfont unicode
  15. #加载主题
  16. set theme=$prefix/themes/winly/theme.txt
  17. export theme

  18. if [ "${grub_platform}" == "efi" ]; then
  19.   if [ "${grub_cpu}" == "x86_64" ]; then
  20.           # 此处可添加EFI64工具
  21.           menuentry "Windows 8/81/10 X64_EFI(by EFI Shell)" --class fedora --class os {
  22.                   search --no-floppy --file --set=root /efi/shellx64.efi
  23.                   chainloader /efi/shellx64.efi
  24.           }
  25.           menuentry "KonBoot 2.6 EFI64" --class gentoo --class os {
  26.                   search --no-floppy --file --set=root /efi/boot/KonBootx64.efi
  27.                   chainloader /efi/boot/KonBootx64.efi
  28.           }
  29.           menuentry "MemTest 7.4 EFI64" --class recovery --class os {
  30.                   search --no-floppy --file --set=root /efi/boot/MEMBOOTX64.EFI
  31.                   chainloader /efi/boot/MEMBOOTX64.EFI
  32.           }
  33.   else
  34.           # 此处可添加EFI32工具
  35.           menuentry "Windows 8/81/10 X32_EFI(by EFI Shell)" --class fedora --class os {
  36.                   search --no-floppy --file --set=root /efi/shellia32.efi
  37.                   chainloader /efi/shellia32.efi
  38.           }
  39.           menuentry "KonBoot 2.6 EFI32" --class gentoo --class os {
  40.                   search --no-floppy --file --set=root /efi/boot/KonBootia32.efi
  41.                   chainloader /efi/boot/KonBootia32.efi
  42.           }
  43.           menuentry "MemTest 7.4 EFI32" --class recovery --class os {
  44.                   search --no-floppy --file --set=root /efi/boot/MEMBOOTIA32.EFI
  45.                   chainloader /efi/boot/MEMBOOTIA32.EFI
  46.           }
  47.   fi
  48. else
  49.   # 此处可添加Bios工具
  50.         menuentry "启动 WIN7 PE" --class windows --class os {
  51.                 insmod part_msdos
  52.                 insmod fat
  53.                 ntldr /BOOT/H3_MGRW7.BIN
  54.         }
  55.         menuentry "启动 WIN8 PE" --class windows --class os {
  56.                 insmod part_msdos
  57.                 insmod fat
  58.                 ntldr /BOOT/H3_MGRW8.BIN
  59.         }
  60.         menuentry "启动 WIN8 PE 64" --class windows --class os {
  61.                 insmod part_msdos
  62.                 insmod fat
  63.                 ntldr /BOOT/H3_MGR64.BIN
  64.         }
  65.         menuentry "启动 WIN8.1 PE" --class windows --class os {
  66.                 insmod part_msdos
  67.                 insmod fat
  68.                 ntldr /BOOT/H3_MGR81.BIN
  69.         }
  70.   menuentry "启动 WIN8.1 PE 64" --class windows --class os {
  71.           insmod part_msdos
  72.           insmod fat
  73.           ntldr /BOOT/H3_MGR16.BIN
  74.   }
  75.   menuentry "启动 WIN10 PE" --class windows --class os {
  76.           insmod part_msdos
  77.           insmod fat
  78.           ntldr /BOOT/H3_MGR10.BIN
  79.   }
  80.   menuentry "启动 WIN10 PE 64" --class windows --class os {
  81.           insmod part_msdos
  82.           insmod fat
  83.           ntldr /BOOT/H3_MGR06.BIN
  84.   }
  85.         menuentry "启动 Win2003 PE" --class windows --class os {
  86.                 insmod part_msdos
  87.                 insmod fat
  88.                 #set root='(hd0,msdos1)'
  89.                 ntldr /BOOT/H3_LDR03.BIN
  90.         }
  91.   menuentry "启动 Win2003 PE 全内置" --class windows --class os {
  92.           insmod part_msdos
  93.           insmod fat
  94.           ntldr /BOOT/H3_LDRIN.BIN
  95.   }
  96.   menuentry "启动 Win2003 PE Native" --class windows --class os {
  97.           insmod part_msdos
  98.           insmod fat
  99.           ntldr /BOOT/H3_LDRNV.BIN
  100.   }
  101.   menuentry "启动 Win2003 PE 非RAM" --class windows --class os {
  102.           insmod part_msdos
  103.           insmod fat
  104.           ntldr /BOOT/H3_LDRRM.BIN
  105.   }
  106.   menuentry "启动 Slitaz Linux 系 统" --class slitaz --class os {
  107.           linux /BOOT/BZIMAGE rw root=/dev/null vga=normal autologin
  108.           initrd /BOOT/ROOTFS.GZ
  109.   }
  110.   # menuentry "启动 DOS分区克隆工具(驱动USB/SCSI/1394/CDROM并克隆)" --class osx {
  111.   #        linux16 /winly/memdisk img raw
  112.   #        initrd16 /BOOT/IMGS/GRGHOST.IMG
  113.   # }
  114.   # menuentry "启动 MaxDos7强化版(各种DOS下的磁盘、BIOS及网克工具)" --class osx --class os {
  115.   #        insmod part_msdos
  116.   #        insmod fat
  117.   #        linux16 /winly/memdisk img raw
  118.   #        initrd16 /BOOT/IMGS/MAXDOS.IMG
  119.   # }
  120.   menuentry "启动第二硬盘第一分区系统" --class windows --class os {
  121.           insmod part_msdos
  122.           insmod ntfs
  123.           set root='(hd1,msdos1)'
  124.           chainloader +1
  125.   }
  126.   menuentry "进入DOS工具集" --class osx --class os {
  127.           insmod part_msdos
  128.           insmod fat
  129.           ntldr /BOOT/H3_GRDOS.BIN
  130.   }
  131.   menuentry "转Grub4DOS菜单" --class submenu --class os {
  132.           insmod part_msdos
  133.           insmod fat
  134.           ntldr /grldr
  135.   }
  136. fi

  137. # 此处可添加共同工具
  138. menuentry "重启Reboot" --class reboot --class os{
  139.         reboot
  140. }
  141. menuentry "关机Shutdown" --class Shutdown --class os{
  142.         halt
  143. }
复制代码

这个菜单有个毛病,启动阶段有几个错误提示,不知道是不是打包方式有问题,请各位有经验的看一下,帮忙解决。我的打包命令如下:(菜单错误提示已解决见15# 17#)
64位EFI:
  1. grub-mkimage -o bootx64.efi -O x86_64-efi -d ./x86_64-efi/ -p /efi/grub -c efigrub.cfg -v newc iso9660 part_msdos part_gpt ext2 fat ntfs udf exfat cpio memdisk blocklist minicmd loopback reboot configfile normal echo test gfxmenu gfxterm search chain font multiboot help linux all_video video_bochs video_cirrus gettext jpeg png
复制代码


32位EFI:
  1. grub-mkimage -o bootia32.efi -O i386-efi -d ./i386-efi/ -p /efi/grub -c efigrub.cfg -v newc iso9660 part_msdos part_gpt ext2 fat ntfs udf exfat cpio memdisk blocklist minicmd loopback reboot configfile normal echo test gfxmenu gfxterm search chain font multiboot help linux all_video video_bochs video_cirrus gettext jpeg png
复制代码


BIOS:
  1. grub-mkimage -o g2ldr.0 -O i386-pc -d ./i386-pc/ -p /efi/grub -c efigrub.cfg -v newc iso9660 part_msdos part_gpt ext2 fat ntfs udf exfat btrfs reiserfs xfs zfs cpio memdisk blocklist minicmd loopback reboot configfile normal echo test gfxmenu gfxterm search chain font multiboot biosdisk help linux ntldr all_video vbe vga video_bochs video_cirrus gettext jpeg png
复制代码


不知以上是不是有毛病,请对grub2有研究的提出修改意见。

哦,对了,上述打包命令还用到1个初始配置文件efigrub.cfg ,内容如下:
  1. if search -s -f /efi/grub/grub.cfg ; then
  2.         configfile /efi/grub/grub.cfg
  3. # else
  4. #        echo "Could not find /efi/grub/grub.cfg file!"
  5. fi
复制代码


再把三个启动区镜像BIN文件共享出来吧: efi.7z (3.24 MB, 下载次数: 192) ,其中efisys.bin是MS公司的文件制作的,32位指向的BCD文件为efi\microsoft\boot\b32(64位为未经修改的原文件)。

评分

参与人数 8无忧币 +38 收起 理由
zhczf + 5 淡定
xinzi + 5 赞一个!
baosheng00 + 5 目前也想转到grub2,支持楼主
weiling103 + 3 很给力!
1400700226 + 5 感兴趣
糊涂 + 5
gtc + 5 赞一个!
ksafei + 5 很给力!

查看全部评分

2#
发表于 2017-11-26 17:37:37 来自手机 | 只看该作者
-c参数会把这个efigrub.cfg内置到efi中吧!
回复

使用道具 举报

3#
发表于 2017-11-26 18:00:17 来自手机 | 只看该作者
以我的理解是这个efi文件只是微型grub2,而你的大菜单有的命令需要insmod插入必要模块,因为grub2是模块化的,大菜单需要前边需要插入必要模块。

点评

把x86_64-efi目录放$prefix也不行。实际上常用模块都打包进去了的,请看一下命令。错误太快一闪就过了,好像说set命令也有问题。这个要加什么模块?  详情 回复 发表于 2017-11-26 19:07
回复

使用道具 举报

4#
发表于 2017-11-26 18:42:03 | 只看该作者
学习学习,谢谢分享
回复

使用道具 举报

5#
 楼主| 发表于 2017-11-26 19:02:08 | 只看该作者
wintoflash 发表于 2017-11-26 18:00
refind不认udf光盘是因为缺udf驱动。
udf驱动下载:
http://efi.akeo.ie/downloads/efifs-latest/

没用。
1、说明好像是说额外指定时要用scan_driver_dirs,默认位置不要加;
2、ISO改成标准格式也不行;
3、加了scanfor internal,external,optical,manual、also_scan_dirs boot,H3CD:efi/boot也不行,这些位置都是有EFI启动文件的
回复

使用道具 举报

6#
 楼主| 发表于 2017-11-26 19:07:12 | 只看该作者
本帖最后由 hhh333 于 2017-11-26 19:08 编辑
my9823 发表于 2017-11-26 18:00
以我的理解是这个efi文件只是微型grub2,而你的大菜单有的命令需要insmod插入必要模块,因为grub2是模块化的 ...


把x86_64-efi目录放$prefix也不行。实际上常用模块都打包进去了的,请看一下命令。错误太快一闪就过了,好像说set命令也有问题。这个要加什么模块?
回复

使用道具 举报

7#
发表于 2017-11-26 19:31:38 来自手机 | 只看该作者
你的grub2不是原版吧,菜单建议不要用记事本编辑。/locale/zh_CN.mo吧,不记得有个gmo文件

点评

可以用BOOTICE的GRUB菜单编辑器。先insmod加载模块先。  详情 回复 发表于 2018-7-18 00:59
ultraedit编辑,UTF-8格式,set应该都起作用了,不知是哪个出错? grub2不是原版怎么理解? 我是下原版文件再用命令生成的EFI启动文件。  详情 回复 发表于 2017-11-26 19:45
回复

使用道具 举报

8#
 楼主| 发表于 2017-11-26 19:45:12 | 只看该作者
my9823 发表于 2017-11-26 19:31
你的grub2不是原版吧,菜单建议不要用记事本编辑。/locale/zh_CN.mo吧,不记得有个gmo文件

ultraedit编辑,UTF-8格式,set应该都起作用了,不知是哪个出错?
grub2不是原版怎么理解?
我是下原版文件再用命令生成的EFI启动文件。
回复

使用道具 举报

9#
发表于 2017-11-26 20:31:06 来自手机 | 只看该作者
感觉是你的内置菜单有问题,建议问下wintoflash大侠。
回复

使用道具 举报

10#
发表于 2017-11-26 20:36:58 来自手机 | 只看该作者
看过wintoflash大侠的教程,说是normal和configfile作用一样,试试insmod mormal后再normal 配置文件看看!

点评

[attachimg]357367[/attachimg] 奇怪,并不是提示set有错,而是最前面那个词错误,无论是什么。  详情 回复 发表于 2017-11-26 21:38
回复

使用道具 举报

11#
 楼主| 发表于 2017-11-26 21:38:10 | 只看该作者
my9823 发表于 2017-11-26 20:36
看过wintoflash大侠的教程,说是normal和configfile作用一样,试试insmod mormal后再normal 配置文件看看!


奇怪,并不是提示set有错,而是最前面那个词错误,无论是什么。
回复

使用道具 举报

12#
发表于 2017-11-26 21:47:29 来自手机 | 只看该作者
本帖最后由 窄口牛 于 2017-11-26 22:12 编辑

utf8

点评

相关文档都改成了unix utf-8形式  详情 回复 发表于 2017-11-26 22:14
回复

使用道具 举报

13#
 楼主| 发表于 2017-11-26 22:14:33 | 只看该作者

相关文档都改成了unix utf-8形式
回复

使用道具 举报

14#
 楼主| 发表于 2017-11-26 22:16:53 | 只看该作者
本帖最后由 hhh333 于 2017-11-27 07:47 编辑

解决了,重建一个空白文档,再将内容放进去,前面那个错误提示不见了,只剩下后面两个了,不知是哪个语句引起的。

仔细回想,grub.cfg是由ANSI格式改成UTF-8的,可能有其他字符干扰。
回复

使用道具 举报

15#
发表于 2017-11-26 22:28:04 来自手机 | 只看该作者
不是提示这个文件找不到,看看这个目录有没有,注意大小写!
回复

使用道具 举报

16#
 楼主| 发表于 2017-11-26 22:29:10 | 只看该作者
干脆把zh_CN下的文件复制到locale下改名为zh.gmo,再不出错误提示了。
回复

使用道具 举报

17#
发表于 2017-11-26 22:30:17 来自手机 | 只看该作者
如果没有可以把grub2的/locale/zh_CN.mo改下文件名放到那里
回复

使用道具 举报

18#
发表于 2017-11-26 22:42:32 | 只看该作者
大神威武,学习学习
回复

使用道具 举报

19#
发表于 2017-11-26 23:12:29 来自手机 | 只看该作者
研究一下大img打包iso就能实现你的想法了。有个xp光盘版,它就把五百多兆的img打包进了光盘里。
回复

使用道具 举报

20#
发表于 2017-11-27 06:31:36 | 只看该作者
是高手之间的交流,顶帖路过!
回复

使用道具 举报

21#
发表于 2017-11-27 08:09:04 | 只看该作者
不错的说,大菜单收走,谢谢!!!
回复

使用道具 举报

22#
发表于 2017-11-28 22:35:25 | 只看该作者
很抱歉,0.24 测试版在检查光盘启动时一直有一个问题,之前没有进行测试就发布了。有条件的朋友可以测试一下 2017.11.28 发布的新版。

点评

这么快,测试一下,马上。  详情 回复 发表于 2017-11-29 12:42
回复

使用道具 举报

23#
 楼主| 发表于 2017-11-29 12:42:31 | 只看该作者
Pauly 发表于 2017-11-28 22:35
很抱歉,0.24 测试版在检查光盘启动时一直有一个问题,之前没有进行测试就发布了。有条件的朋友可以测试一 ...

这么快,测试一下,马上。
回复

使用道具 举报

24#
发表于 2017-12-7 21:00:26 | 只看该作者
今天决定尝试下refind引导的iso,下载了模版iso,用ultraiso找了半天发现里边没有uefi启动扇区文件,这个怎么看refind.conf呢,偶然间用7z打开了iso,里边有个[boot]目录,在打开里边有两个文件,一个4k,另外一个4M多,那个4M的竟然就是uefi的启动文件,能用ultraiso打开,终于看到了conf文件,是不是我火星了,用7zfm竟然能看到uefi启动文件?

点评

微软本身有工具 oscdimg.exe 可 "产生ISO", 下列内容仅供研究参考之用, 不保证ok -- 先将 原来的安装光碟存到 D:\10PE_for_CD 光碟EFI启动: oscdimg.exe -w4 -lCD-DVD-x64EFI -m -h -n -pEF -e -bD:\10PE_f  详情 回复 发表于 2018-7-17 23:05
回复

使用道具 举报

25#
发表于 2017-12-7 21:08:43 来自手机 | 只看该作者
是的,体积小的efi的img可以看到。
回复

使用道具 举报

26#
发表于 2017-12-10 00:01:21 来自手机 | 只看该作者
GRUB2 EFI的语法和GRUB2 MBR的语法不同。见我的帖子。
回复

使用道具 举报

27#
发表于 2017-12-10 13:42:12 | 只看该作者
纯粹的学术交流,h3老大执着钻研的劲头令人佩服
回复

使用道具 举报

28#
发表于 2017-12-11 09:40:39 | 只看该作者
说实话有点看不懂,BCD能否直接调用MEMTEST的EFI文件呢?

点评

BCD能直接调用就好了,但是没找到方法。  详情 回复 发表于 2017-12-15 09:00
回复

使用道具 举报

29#
 楼主| 发表于 2017-12-15 09:00:05 | 只看该作者
huiwu21 发表于 2017-12-11 09:40
说实话有点看不懂,BCD能否直接调用MEMTEST的EFI文件呢?

BCD能直接调用就好了,但是没找到方法。

点评

如果BCD不能調適的話 那請教一下 可否以KONBOOT為例,說明一下要怎麼加入啟動呢? 因為我用XORBOOT加入啟動是OK 但是若要用EFI啟動的話,不知道該怎麼下手  详情 回复 发表于 2018-5-19 07:40
回复

使用道具 举报

30#
发表于 2017-12-15 09:07:45 来自手机 | 只看该作者
这个应该可以,把efi打包进img就行了,它体积不是很大。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-27 09:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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