无忧启动论坛

 找回密码
 注册
搜索
一次装机 终生领工资最纯净的「微PE装机优盘」UEPON大师作品★IDC大全★服务器租赁、托管★优惠促销★
可防勒索的强大数据备份恢复软件卡瑞飞系统和装机二合一超级U盘广告联系 QQ:184822951 微信:wuyouceo
查看: 5666|回复: 36

光盘一启接管EFI太难了

    [复制链接]
发表于 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格式,都是启动错误;
结论:失败
Windows 8 x64-EFI-2017-11-26-14-54-38.png

注:经过P大连续奋战,最新版将以上的问题全部解决了,可以说是最完美的方案了
Windows 8 32-EFI-2017-12-15-08-05-42.png

Windows 8 x64-EFI-2017-12-15-08-05-08.png

二、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位;
顺便说一下,这种横排的图形界面有点不习惯。
Windows 8 x64-EFI-2017-11-26-15-59-55.png

三、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
Windows 8 x64-EFI-2017-11-26-16-01-54.png

最后共享自己做的超级大菜单(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, 下载次数: 112)

评分

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

查看全部评分

发表于 2017-11-26 18:00:58 | 显示全部楼层
本帖最后由 wintoflash 于 2017-11-26 18:08 编辑

refind不认udf光盘是因为缺udf驱动。
udf驱动下载:
http://efi.akeo.ie/downloads/efifs-latest/
把udf驱动和refind菜单放映象里面。
菜单加上:
  1. scan_driver_dirs EFI/tools/drivers,drivers
复制代码

EFI/tools/drivers,driver之类的目录可以改,不过refind好像找不到菜单就会自动扫描这两个目录加载驱动。
相关说明:
  1. # Directories in which to search for EFI drivers. These drivers can
  2. # provide filesystem support, give access to hard disks on plug-in
  3. # controllers, etc. In most cases none are needed, but if you add
  4. # EFI drivers and you want rEFInd to automatically load them, you
  5. # should specify one or more paths here. rEFInd always scans the
  6. # "drivers" and "drivers_{arch}" subdirectories of its own installation
  7. # directory (where "{arch}" is your architecture code); this option
  8. # specifies ADDITIONAL directories to scan.
  9. # Default is to scan no additional directories for EFI drivers
复制代码

参考:
http://www.rodsbooks.com/refind/drivers.html

点评

没用。 1、说明好像是说额外指定时要用scan_driver_dirs,默认位置不要加; 2、ISO改成标准格式也不行; 3、加了scanfor internal,external,optical,manual、also_scan_dirs boot,H3CD:efi/boot也不行,这些位置  详情 回复 发表于 2017-11-26 19:02
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-26 17:37:37 来自手机 | 显示全部楼层
-c参数会把这个efigrub.cfg内置到efi中吧!
回复 支持 反对

使用道具 举报

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

点评

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

使用道具 举报

发表于 2017-11-26 18:42:03 | 显示全部楼层
学习学习,谢谢分享
回复 支持 反对

使用道具 举报

 楼主| 发表于 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启动文件的
回复 支持 反对

使用道具 举报

 楼主| 发表于 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命令也有问题。这个要加什么模块?
Windows 8 x64-EFI-2017-11-25-22-02-57.png
回复 支持 反对

使用道具 举报

发表于 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
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2017-11-26 20:31:06 来自手机 | 显示全部楼层
感觉是你的内置菜单有问题,建议问下wintoflash大侠。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2019-2-18 12:06

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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