hhh333 发表于 2017-11-26 16:12:40

光盘一启接管EFI太难了

本帖最后由 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位自适应)
set default=1
set fallback=0
set gfxmode=800x600,auto
set gfxterm_font=unicode
set lang=zh_CN
set locale_dir=$prefix/locale
set pager=1
set timeout=30

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

if [ "${grub_platform}" == "efi" ]; then
if [ "${grub_cpu}" == "x86_64" ]; then
        # 此处可添加EFI64工具
        menuentry "Windows 8/81/10 X64_EFI(by EFI Shell)" --class fedora --class os {
                search --no-floppy --file --set=root /efi/shellx64.efi
                chainloader /efi/shellx64.efi
        }
        menuentry "KonBoot 2.6 EFI64" --class gentoo --class os {
                search --no-floppy --file --set=root /efi/boot/KonBootx64.efi
                chainloader /efi/boot/KonBootx64.efi
        }
        menuentry "MemTest 7.4 EFI64" --class recovery --class os {
                search --no-floppy --file --set=root /efi/boot/MEMBOOTX64.EFI
                chainloader /efi/boot/MEMBOOTX64.EFI
        }
else
        # 此处可添加EFI32工具
        menuentry "Windows 8/81/10 X32_EFI(by EFI Shell)" --class fedora --class os {
                search --no-floppy --file --set=root /efi/shellia32.efi
                chainloader /efi/shellia32.efi
        }
        menuentry "KonBoot 2.6 EFI32" --class gentoo --class os {
                search --no-floppy --file --set=root /efi/boot/KonBootia32.efi
                chainloader /efi/boot/KonBootia32.efi
        }
        menuentry "MemTest 7.4 EFI32" --class recovery --class os {
                search --no-floppy --file --set=root /efi/boot/MEMBOOTIA32.EFI
                chainloader /efi/boot/MEMBOOTIA32.EFI
        }
fi
else
# 此处可添加Bios工具
        menuentry "启动 WIN7 PE" --class windows --class os {
                insmod part_msdos
                insmod fat
                ntldr /BOOT/H3_MGRW7.BIN
        }
        menuentry "启动 WIN8 PE" --class windows --class os {
                insmod part_msdos
                insmod fat
                ntldr /BOOT/H3_MGRW8.BIN
        }
        menuentry "启动 WIN8 PE 64" --class windows --class os {
                insmod part_msdos
                insmod fat
                ntldr /BOOT/H3_MGR64.BIN
        }
        menuentry "启动 WIN8.1 PE" --class windows --class os {
                insmod part_msdos
                insmod fat
                ntldr /BOOT/H3_MGR81.BIN
        }
menuentry "启动 WIN8.1 PE 64" --class windows --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_MGR16.BIN
}
menuentry "启动 WIN10 PE" --class windows --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_MGR10.BIN
}
menuentry "启动 WIN10 PE 64" --class windows --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_MGR06.BIN
}
        menuentry "启动 Win2003 PE" --class windows --class os {
                insmod part_msdos
                insmod fat
                #set root='(hd0,msdos1)'
                ntldr /BOOT/H3_LDR03.BIN
        }
menuentry "启动 Win2003 PE 全内置" --class windows --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_LDRIN.BIN
}
menuentry "启动 Win2003 PE Native" --class windows --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_LDRNV.BIN
}
menuentry "启动 Win2003 PE 非RAM" --class windows --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_LDRRM.BIN
}
menuentry "启动 Slitaz Linux 系 统" --class slitaz --class os {
        linux /BOOT/BZIMAGE rw root=/dev/null vga=normal autologin
        initrd /BOOT/ROOTFS.GZ
}
# menuentry "启动 DOS分区克隆工具(驱动USB/SCSI/1394/CDROM并克隆)" --class osx {
#        linux16 /winly/memdisk img raw
#        initrd16 /BOOT/IMGS/GRGHOST.IMG
# }
# menuentry "启动 MaxDos7强化版(各种DOS下的磁盘、BIOS及网克工具)" --class osx --class os {
#        insmod part_msdos
#        insmod fat
#        linux16 /winly/memdisk img raw
#        initrd16 /BOOT/IMGS/MAXDOS.IMG
# }
menuentry "启动第二硬盘第一分区系统" --class windows --class os {
        insmod part_msdos
        insmod ntfs
        set root='(hd1,msdos1)'
        chainloader +1
}
menuentry "进入DOS工具集" --class osx --class os {
        insmod part_msdos
        insmod fat
        ntldr /BOOT/H3_GRDOS.BIN
}
menuentry "转Grub4DOS菜单" --class submenu --class os {
        insmod part_msdos
        insmod fat
        ntldr /grldr
}
fi

# 此处可添加共同工具
menuentry "重启Reboot" --class reboot --class os{
        reboot
}
menuentry "关机Shutdown" --class Shutdown --class os{
        halt
}

这个菜单有个毛病,启动阶段有几个错误提示,不知道是不是打包方式有问题,请各位有经验的看一下,帮忙解决。我的打包命令如下:(菜单错误提示已解决见15# 17#)
64位EFI:
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:
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:
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 ,内容如下:
if search -s -f /efi/grub/grub.cfg ; then
        configfile /efi/grub/grub.cfg
# else
#        echo "Could not find /efi/grub/grub.cfg file!"
fi


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

my9823 发表于 2017-11-26 17:37:37

-c参数会把这个efigrub.cfg内置到efi中吧!

my9823 发表于 2017-11-26 18:00:17

以我的理解是这个efi文件只是微型grub2,而你的大菜单有的命令需要insmod插入必要模块,因为grub2是模块化的,大菜单需要前边需要插入必要模块。

wuyufeng 发表于 2017-11-26 18:42:03

学习学习,谢谢分享

hhh333 发表于 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启动文件的

hhh333 发表于 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命令也有问题。这个要加什么模块?

my9823 发表于 2017-11-26 19:31:38

你的grub2不是原版吧,菜单建议不要用记事本编辑。/locale/zh_CN.mo吧,不记得有个gmo文件

hhh333 发表于 2017-11-26 19:45:12

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

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

my9823 发表于 2017-11-26 20:31:06

感觉是你的内置菜单有问题,建议问下wintoflash大侠。

my9823 发表于 2017-11-26 20:36:58

看过wintoflash大侠的教程,说是normal和configfile作用一样,试试insmod mormal后再normal 配置文件看看!

hhh333 发表于 2017-11-26 21:38:10

my9823 发表于 2017-11-26 20:36
看过wintoflash大侠的教程,说是normal和configfile作用一样,试试insmod mormal后再normal 配置文件看看!


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

窄口牛 发表于 2017-11-26 21:47:29

本帖最后由 窄口牛 于 2017-11-26 22:12 编辑

utf8

hhh333 发表于 2017-11-26 22:14:33

窄口牛 发表于 2017-11-26 21:47
utf8

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

hhh333 发表于 2017-11-26 22:16:53

本帖最后由 hhh333 于 2017-11-27 07:47 编辑

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

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

my9823 发表于 2017-11-26 22:28:04

不是提示这个文件找不到,看看这个目录有没有,注意大小写!

hhh333 发表于 2017-11-26 22:29:10

干脆把zh_CN下的文件复制到locale下改名为zh.gmo,再不出错误提示了。

my9823 发表于 2017-11-26 22:30:17

如果没有可以把grub2的/locale/zh_CN.mo改下文件名放到那里

l3429900 发表于 2017-11-26 22:42:32

大神威武,学习学习

窄口牛 发表于 2017-11-26 23:12:29

研究一下大img打包iso就能实现你的想法了。有个xp光盘版,它就把五百多兆的img打包进了光盘里。

曾经沧海 发表于 2017-11-27 06:31:36

是高手之间的交流,顶帖路过!

devilma 发表于 2017-11-27 08:09:04

不错的说,大菜单收走,谢谢!!!

Pauly 发表于 2017-11-28 22:35:25

很抱歉,0.24 测试版在检查光盘启动时一直有一个问题,之前没有进行测试就发布了。有条件的朋友可以测试一下 2017.11.28 发布的新版。

hhh333 发表于 2017-11-29 12:42:31

Pauly 发表于 2017-11-28 22:35
很抱歉,0.24 测试版在检查光盘启动时一直有一个问题,之前没有进行测试就发布了。有条件的朋友可以测试一 ...

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

my9823 发表于 2017-12-7 21:00:26

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

窄口牛 发表于 2017-12-7 21:08:43

是的,体积小的efi的img可以看到。

rkr077 发表于 2017-12-10 00:01:21

GRUB2 EFI的语法和GRUB2 MBR的语法不同。见我的帖子。

armymangl 发表于 2017-12-10 13:42:12

纯粹的学术交流,h3老大执着钻研的劲头令人佩服

huiwu21 发表于 2017-12-11 09:40:39

说实话有点看不懂,BCD能否直接调用MEMTEST的EFI文件呢?

hhh333 发表于 2017-12-15 09:00:05

huiwu21 发表于 2017-12-11 09:40
说实话有点看不懂,BCD能否直接调用MEMTEST的EFI文件呢?

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

窄口牛 发表于 2017-12-15 09:07:45

这个应该可以,把efi打包进img就行了,它体积不是很大。
页: [1] 2
查看完整版本: 光盘一启接管EFI太难了