无忧启动论坛

标题: 使用Grub2定制UEFI启动 (bootx64.efi) [打印本页]

作者: hilsonma    时间: 2019-3-21 07:49
标题: 使用Grub2定制UEFI启动 (bootx64.efi)
本帖最后由 hilsonma 于 2020-4-7 17:48 编辑

使用grub2做为uefi平台主引导的最大特色是:
当无法通过菜单项正常引导指定系统时,可以进入一个文件浏览菜单项,查找所有可能的引导项,以实现引导。
如果是grub2熟手,还可以临时修改菜单项,及进入grub2命令行。

附件是我定制的一个范例,下面附两张效果图。
启动菜单中第一项是默认启动Windows
第二项是启动efi区pe文件夹的PE镜像
第三项是将所有分区下的pe文件夹里的文件列为自动菜单,一键启动wim镜像。
自动菜单中第一项即两点开头那一项即是返回上一层文件夹,通过此项可浏览所有磁盘文件。
efi.7z (987.04 KB, 下载次数: 1847)

完整的范例请参考我的启动U盘 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414574
如果不想制启动U盘可以只看其中的esp文件夹,里面是完整的uefi启动文件包 (包括PE)

UEFI开机菜单(grub2菜单)


WIM/EFI自动菜单(grub2文件浏览极简版)


现在UEFI平台的启动,一般都是UEFI引导第一个fat分区或fat32分区的 \efi\boot\bootx64.efi ,再由bootx64.efi 启动操作系统。
之前分享了一个用xorboot来定制bootx64.efi的方法。http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413596

下面分享使用Grub2来定制bootx64.efi 的方法。这个方法主要来自Beatfan_N 的博文。https://blog.csdn.net/u010875635/article/details/74289971
也学习过 極限驅動 的贴子 Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑)http://bbs.wuyou.net/forum.php?mod=viewthread&tid=339411
还有其他前辈的贴子,不再一一列举。

定制开始
=======

首先下载grub2
官网下载: ftp://ftp.gnu.org/gnu/grub  选择 grub-x.xx-for-windows.zip (不推荐,因为没有wimboot模块)
建议下载 wintoflash 的新版:点我下载

下载解压后,建议将解压文件夹 grub-2.04-for-windows (官网版本) 或 builds-master (wintoflash新版) 更名为grub2.

在解压文件夹下新建一个文本文档 ,内容如下:

  1. @echo off
  2. :: 设置当前目录为脚本所在目录
  3. pushd %~dp0

  4. set format=x86_64-efi
  5. set prefix=/efi/grub
  6. set output=grubx64.efi
  7. set modules=part_msdos part_gpt fat exfat ntfs ext2 normal chain configfile search probe regexp test wimboot halt reboot help linux map blocklist vhd ntboot
  8. grub-mkimage -O %format% -p %prefix% -o %output% %modules%
复制代码

注意区分大小写,保存类型为所有文件,文件名为 z.cmd ,一定要将保存类型改为所有文件,不能是文本文档,它其实是windows脚本文件。

附件有我做好的 z.cmd ,不想自己做的话就下载附件解压放到grub2文件夹
grub2.7z (239.25 KB, 下载次数: 1087)

运行 z.cmd ,grub2文件夹里会产生一个 grubx64.efi 文件

如果下载的是wintoflash的grub2,会有一个build_grub.bat ,使用这个脚本会生成三个文件:64位efi的grubx64.efi 、32位efi的grubia32.efi、实模式的core.img 。全部包含所有的模块。默认prefix是\boot\grub,需要修改的话可使用notepad2或notepad++之类的工具。

在grub2 文件夹下新建一个文本文档 ,内容如下:
  1. set default=0
  2. set fallback=2
  3. set timeout=5

  4. menuentry "0.Windows" "/Windows/Boot/EFI/bootmgfw.efi" --hotkey=0 {
  5.         search -s -f $2
  6.         chainloader $2
  7. }
  8. menuentry "1.WinPE" --hotkey=1 {
  9.         export grub_find=/pe/pe.wim
  10.         configfile $prefix/grubfm.cfg
  11. }
  12. menuentry "2.Grubfm" --hotkey=2 {
  13.         export grub_find=/pe
  14.         configfile $prefix/grubfm.cfg
  15. }
  16. menuentry "3.Reboot" --hotkey=3 {reboot}
  17. menuentry "4.Halt" --hotkey=4 {halt}
  18. menuentry "Porteus" "/porteus/vmlinuz" {
  19.         search -s -f $2
  20.         linux $2 norootcopy nomagic
  21.         initrd /porteus/initrd.xz
  22. }
  23. menuentry "Boot WIM" "/test.wim" {
  24.         search -s wimroot -f $2
  25.         wimboot @:bootmgfw.efi:$prefix/wimboot/bootmgfw.efi \
  26.                         @:bcd:$prefix/wimboot/bcd \
  27.                         @:boot.sdi:$prefix/wimboot/boot.sdi \
  28.                         @:boot.wim:($wimroot)$2
  29. }
  30. menuentry "Boot ISO" "/test.iso" {
  31.         search -s -f $2
  32.         map $2
  33. }
  34. menuentry "Boot VHD" "/test.vhd" {
  35.         search -s -f $2
  36.         ntboot -e $prefix/wimboot/bootmgfw.efi -s $prefix/wimboot/boot.sdi $2
  37. }
  38. menuentry "Ntboot VHD" "/test.vhd" {
  39.         search -s -f $2
  40.         ntboot -e $prefix/wimboot/bootmgfw.efi -s $prefix/wimboot/boot.sdi $2
  41. }
复制代码

注意,保存类型为所有文件,文件名为 grub.cfg ,一定要将保存类型改为所有文件,不能是文本文档,它其实是grub2配置文件(grub2菜单)。
上面附件中也有我做好的 grub.cfg 和grubx64.efi 。

将grubx64.efi 放到第一个fat/fat32分区(也就是esp分区)中的文件夹 \efi\boot\ ,改名为 bootx64.efi
将grub.cfg 放到第一个fat/fat32分区(也就是esp分区)中的文件夹 \efi\grub\
重新启动后就会出现grub2菜单。

定制结束
========

要自动菜单浏览文件 需要加上grub2fm
要一键启动wim镜像 需要加上 wimboot
这些 efi.7z 都包含了。
如果启动windows有问题请运行重建win引导脚本.http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414828

注意,如果开启了安全启动(secureboot)的话要关掉,因为这个bootx64.efi是不能过安全启动的。

如何过安全启动
==============
将efi分区 \efi\boot\bootx64.efi 改名为 grubfmx64.efi
securebootloader.7z (529.04 KB, 下载次数: 726)
下载securebootloader解压
将解压得到的4个文件放到efi分区 \efi\boot\

重新启动后首先会进入 Shim 验证失败的界面
按任意键进入导入证书的界面
选择 Enroll key from disk
找到 GRUBFM.cer
选择 Continue
选择 Yes
在之后的菜单中选择 Reboot ,重启计算机。
注意:压缩文件里面的 EFI 文件不可改名,不可以放到其他文件夹下,不可修改内容,否则无效。GRUBFM.cer 为证书文件,可以改名,不可修改内容。

导入证书后会保存在nvram中,只要不清nvram,以后启动不再出现验证失败画面,直接过安全启动。
=============================================================

以上分享的菜单等待时间是5秒,为了不影响开机速度,所有菜单的等待时间我都设定为1秒,如果不是启动默认项就狂按上下箭头键吧。

20190729更新:
1.去除证书模块
2.默认镜像文件夹由\wim 改为\pe

20190527更新:
1.安全启动(secureboot)支持

20190526更新:
1.定制脚本自动获取管理员权限,自动定位脚本所在文件夹
2.定制脚本包含证书模块、文件管理相关模块、wimboot相关模块
3.可将wim镜像和efi程序统一放在任意磁盘的 \wim 文件夹中,WIM/EFI菜单项自动列表一键启动
作者: 2011npwjm    时间: 2019-3-21 08:50
不错,谢谢楼主的分享
作者: chishingchan    时间: 2019-3-21 10:18
这样是不是容易理解一点?
  1. @echo off
  2. cd /d d:\grub2

  3. :: bootx64.efi
  4. grub-mkimage -O x86_64-efi -p /efi/boot -o bootx64.efi normal part_gpt part_msdos fat exfat chain

  5. :: grub.cfg
  6. echo set default=0>grub.cfg
  7. echo set fallback=1>>grub.cfg
  8. echo set timeout=5>>grub.cfg
  9. echo.>>grub.cfg
  10. echo menuentry "0.xorboot" --hotkey=0 {>>grub.cfg
  11. echo   chainloader /efi/xorboot/xorboot.efi>>grub.cfg
  12. echo }>>grub.cfg
  13. echo menuentry "1.grub2 fileman" --hotkey=1 {>>grub.cfg
  14. echo   chainloader grubfmx64.efi>>grub.cfg
  15. echo }>>grub.cfg
  16. echo menuentry "2.mini linux" --hotkey=2 {>>grub.cfg
  17. echo   chainloader minilinux.efi>>grub.cfg
  18. echo }>>grub.cfg

  19. ::
  20. md \efi\boot>nul 2>nul
  21. ren \efi\boot\bootx64.efi grubfmx64.efi
  22. copy bootx64.efi \efi\boot\
  23. copy grub.cfg \efi\boot\

  24. :: if bootx64.efi == xorboot
  25. md \efi\xorboot>nul 2>nul
  26. ren \efi\boot\bootx64.efi \efi\xorboot\xorboot.efi
  27. move \efi\boot\xorboot.xor \efi\xorboot\

  28. :: if bootx64.efi == Shim
  29. :: if bootfmx64.efi == xorboot
  30. md \efi\boot>nul 2>nul
  31. md \efi\xorboot>nul 2>nul
  32. move \efi\boot\bootfmx64.efi \efi\xorboot\xorboot.efi
  33. copy bootx64.efi \efi\boot\bootfmx64.efi
复制代码

作者: rengrancunzai    时间: 2019-3-21 11:54
谢谢分享
作者: jxdeng2017    时间: 2019-3-21 17:24
普及W大的成果,赞一个。
作者: 秋月云开    时间: 2019-3-21 20:59
谢谢分享,
作者: qingyi78    时间: 2019-3-22 14:10
期待XORBOOT一统天下,就先G4D一样
作者: Pauly    时间: 2019-4-5 21:02
但有些efi程序xorboot不支持引导,比如 wintoflash 制作的单文件微型Linux系统 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=410295


经过测试,这个 EFI 在 QEMU 和我的 Surface Pro 6 上都是可以启动的呀
作者: hilsonma    时间: 2019-4-5 21:26
Pauly 发表于 2019-4-5 21:02
经过测试,这个 EFI 在 QEMU 和我的 Surface Pro 6 上都是可以启动的呀

0.2.4 是不能启动 minilinux.efi 的,0.2.5 可以了。

部份wim文件在逻辑分区时 xorboot 不能启动,例如微PE的核心文件wepe64.wim,放在esp能启动,放在E盘启动出错。而有的wim文件不论放哪个盘上0.2.5版都能成功启动。不知此问题是否会解决?
作者: tkfiles    时间: 2019-5-7 15:20
Grub2定制的启动界面支持鼠标操作吗?
作者: hilsonma    时间: 2019-5-8 06:13
tkfiles 发表于 2019-5-7 15:20
Grub2定制的启动界面支持鼠标操作吗?

就我知道的grub2菜单是键盘菜单,不支持鼠标操作的。
作者: devilma    时间: 2019-5-8 08:23
不错,感谢制作教程!
作者: hilsonma    时间: 2019-5-27 00:22
20190526更新:
1.定制脚本自动获取管理员权限,自动定位脚本所在文件夹
2.定制脚本包含证书模块、文件管理相关模块、wimboot相关模块
3.相关wim镜像和efi程序可统一放到任意磁盘 \wim 文件夹中,WIM/EFI菜单项自动列表启动
作者: hilsonma    时间: 2019-5-27 12:04
20190527更新:
1.安全启动(secureboot)支持
作者: ksafei    时间: 2019-5-27 12:38
非常好的学习贴,感谢分享。

grub2.7z不能下载,还请楼主处理下
作者: hilsonma    时间: 2019-5-27 12:47
ksafei 发表于 2019-5-27 12:38
非常好的学习贴,感谢分享。

grub2.7z不能下载,还请楼主处理下

已更新
作者: suge    时间: 2019-6-11 10:17
请问如何能加载背景图片呢?
作者: vm669    时间: 2019-6-11 15:49
看完,晕晕的,搞不定。
如果有这样一个 包含全部类型(包含深度DEEPIN)的启动菜单http://bbs.wuyou.net/forum.php?m ... amp;authorid=514118
让小白根据需要复制删除或修改一些启动选项估计才能玩的了

另外,请教 XORboot可以用在bios启动吗?家里的EFI启动现在用的不错,特别是你的小PE,以后再也不用拔插优盘启动了
作者: hilsonma    时间: 2019-6-12 10:34
suge 发表于 2019-6-11 10:17
请问如何能加载背景图片呢?

首先制作一张PNG格式的图片,分辨率最好是"1024x768"以保证较好的兼容性。然后将这张图片放到"$prefix/themes/1024x768.png"("$prefix"是你生成efi文件时使用的/p参数指定的目录)。然后在'grub.cfg'中加入如下内容:
  1. set gfxmode=1024x768,auto
  2. terminal_output  gfxterm
  3. background_image $prefix/themes/1024x768.png
复制代码

生成efi文件时需要添加 gfxterm png 这两个模块才能支持显示png图片
作者: hilsonma    时间: 2019-6-12 10:43
vm669 发表于 2019-6-11 15:49
看完,晕晕的,搞不定。
如果有这样一个 包含全部类型(包含深度DEEPIN)的启动菜单http://bbs.wuyou.net/ ...

完整的范例请参考我的启动U盘 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414574
如果不想制启动U盘可以只看其中的esp文件夹,里面是完整的uefi启动文件包 (包括PE)

我没有装过深度DEEPIN,不了解相关启动文件,所以没有提供这个系统的范例。

XorBoot可以用在bios启动,要用 XorBoot BIOS版本。BIOS下我用g4d已经足够了,所以没有了解XorBoot BIOS版。
作者: suge    时间: 2019-6-13 08:53
hilsonma 发表于 2019-6-12 10:34
首先制作一张PNG格式的图片,分辨率最好是"1024x768"以保证较好的兼容性。然后将这张图片放到"$prefix/th ...

你好,请问 gfxterm png 这两个模块放在从你处下载来的哪个文件夹内呢?
作者: hilsonma    时间: 2019-6-13 12:26
本帖最后由 hilsonma 于 2019-6-13 12:40 编辑

建议下载 wintoflash 的新版:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414244

是上面下载的grub2里有的,你要做的是生成grub2x64.efi (或者bootx64.efi)时使用的脚本要指定加上这两个模块。象下面这样:
  1. grub-mkimage -O x86_64-efi -p /efi/grub -o grubx64.efi normal part_gpt part_msdos fat exfat ntfs chain sbpolicy configfile loopback probe progress regexp test help search wimboot fb halt reboot gfxterm png
复制代码

最后面就是这两个模块。
因为我不想加背景图片,所以我原来的脚本是不含这两个模块的。
上面脚本中,normal开始直到结尾都是指定要使用的模块,顺序不论。你明白的情况下可以按自己意愿增减。你减了哪些模块,那些功能就不支持。你加了哪些模块,生成的efi文件就支持那些功能或命令。

另外一个方法就是将下载的grub2包中的整个x86_64-efi 文件夹复制到你指定的文件夹(跟grub2.cfg同一个文件夹,是生成efi文件时脚本的 -p参数指定的文件夹,又叫$prefix 文件夹),然后要使用到某个模块时就用insmod载入,我不使用这个方法。这个方法多用了一些磁盘空间,目录结构略为复杂,好外是efi程序按需载入模块,占用较少内存。
作者: hilsonma    时间: 2019-6-13 12:50
本帖最后由 hilsonma 于 2019-6-13 12:51 编辑
suge 发表于 2019-6-13 08:53
你好,请问 gfxterm png 这两个模块放在从你处下载来的哪个文件夹内呢?


如果你生成efi文件时指定了这两个模块,那么生成的grubx64.efi本身就包含这两个模块了,可以使用相关功能。
如果生成efi文件时没有指定这两个模块,就要把下载的grub2包中的x86_64-efi这个文件夹中的 gfxterm.mod 和png.mod 这两个文件复制到 \efi\grub\ 文件夹,然后在用到这两个命令时先用 insmod 载入这两个模块。
  1. insmod gfxterm
  2. insmod png
  3. set gfxmode=1024x768,auto
  4. terminal_output  gfxterm
  5. background_image $prefix/themes/1024x768.png
复制代码

作者: 扬帆起航    时间: 2019-6-13 16:12
感谢分享
作者: suge    时间: 2019-6-17 10:48
hilsonma 发表于 2019-6-13 12:50
如果你生成efi文件时指定了这两个模块,那么生成的grubx64.efi本身就包含这两个模块了,可以使用相关功 ...

你好,按照你的方法,背景图折腾一翻,搞好了。还有一个问题,在 z.cmd中加了font模块,在grub文件夹中加入了unicode.pf2与locale文件夹,在grub.cfg中加上 set gfxterm_font=unicode
set lang=zh_CN
set locale_dir=$prefix/locale
insmod gfxterm
terminal_output  gfxterm
loadfont unicode
但还是显示不了中文,请问如何解决呢?谢谢。。
作者: suge    时间: 2019-6-17 10:56
suge 发表于 2019-6-17 10:48
你好,按照你的方法,背景图折腾一翻,搞好了。还有一个问题,在 z.cmd中加了font模块,在grub文件夹中加 ...

感觉还是xorboot比较容易操作些,但有些功能只有GRUB2有,两者混合着用比较完美。。。。
作者: hilsonma    时间: 2019-6-17 13:07
suge 发表于 2019-6-17 10:48
你好,按照你的方法,背景图折腾一翻,搞好了。还有一个问题,在 z.cmd中加了font模块,在grub文件夹中加 ...

字体文件unicode.pf2 放到 $prefix/fonts 比如 \efi\grub\fonts
作者: hilsonma    时间: 2019-6-17 13:09
suge 发表于 2019-6-17 10:56
感觉还是xorboot比较容易操作些,但有些功能只有GRUB2有,两者混合着用比较完美。。。。

同感。别的电脑我都是用xorboot引导,只有我自己用的电脑才是用grub2引导,便于尝试各种pe各种efi
作者: devilma    时间: 2019-6-17 15:39
学习了!谢谢
作者: suge    时间: 2019-6-17 18:06
hilsonma 发表于 2019-6-17 13:07
字体文件unicode.pf2 放到 $prefix/fonts 比如 \efi\grub\fonts

谢谢。解决了。看了http://bbs.wuyou.net/forum.php?m ... 837&ordertype=1此文wintoflash对另一网友的回复,原来忽略了utf8编码
作者: phyuzhoukai    时间: 2019-6-17 23:24
本帖最后由 phyuzhoukai 于 2019-6-17 23:46 编辑

问一下,efi下有没有办法利用自动生成菜单来直接引导vhdx文件?

以及自动生成菜单能生成二级文件目录里的文件名吗?
作者: hilsonma    时间: 2019-6-18 11:49
本帖最后由 hilsonma 于 2019-6-18 12:03 编辑
phyuzhoukai 发表于 2019-6-17 23:24
问一下,efi下有没有办法利用自动生成菜单来直接引导vhdx文件?

以及自动生成菜单能生成二级文件目录里 ...


grub2文件浏览功能可以查看任意层次的文件夹的任意文件名,查看方式本身就是自动生成菜单,但是一键启动就要看支持的文件类型。
目前efi文件和支持uefi的wim文件可以一键启动,iso文件还不支持,vhdx文件应该是可以支持的,因为我之前很少用vhd,所以还没有设计去引导,但bcd菜单本身是支持引导vhdx的,你如果有兴趣可以从这个方向去自已设计。
作者: phyuzhoukai    时间: 2019-6-18 17:06
hilsonma 发表于 2019-6-18 11:49
grub2文件浏览功能可以查看任意层次的文件夹的任意文件名,查看方式本身就是自动生成菜单,但是一键启 ...

好的,谢谢
作者: ahxx    时间: 2019-6-30 21:53
先来感谢大神的热心分享,再来看文章
作者: lforl    时间: 2019-7-7 17:14
这个很像当初grub4dos那个简洁的启动风格了,我很喜欢,如果能自动(需要编程来判断了)搜索C盘根目录的PE.ISO加入到启动菜单里,那就妙哉。
作者: pcfan120    时间: 2019-7-27 20:11
大师,现在选择的是Enroll hash 和 grubx64.efi,可以通过第一步的安全启动了,即出现了wepe,wim/efi 上下选择菜单,但接下来的菜单里,第一个菜单我选启动默认的wepe后,报错ox00000f,an unexpect error occurred  ,第二个菜单 我选择自定义pe下的wim 启动,出现蓝色error界面 ‘could not install securitu protocol (2)Invalid Parameter’
详细的信息我发消息给你了
作者: pcfan120    时间: 2019-7-27 20:21
hilsonma 发表于 2019-6-18 11:49
grub2文件浏览功能可以查看任意层次的文件夹的任意文件名,查看方式本身就是自动生成菜单,但是一键启 ...


大师刚测试了,现在选择的是Enroll hash 和 grubx64.efi,可以通过第一步的安全启动了,即出现了wepe,wim/efi 上下选择菜单,但接下来的菜单里,第一个菜单我选启动默认的wepe后,报错ox00000f,an unexpect error occurred  ,第二个菜单 我选择自定义pe下的wim 启动,出现蓝色error界面 ‘could not install securitu protocol (2)Invalid Parameter’
详细的信息我发消息给你了
作者: hilsonma    时间: 2019-7-27 21:26
pcfan120 发表于 2019-7-27 20:21
大师刚测试了,现在选择的是Enroll hash 和 grubx64.efi,可以通过第一步的安全启动了,即出现了wepe, ...

看来还是没有办法进行简化。谢谢你的帮助。
作者: gdck    时间: 2019-8-8 00:41
下官方原版的没有wimboo模块
作者: hilsonma    时间: 2019-8-8 14:10
gdck 发表于 2019-8-8 00:41
下官方原版的没有wimboo模块

建议下载wintoflash的新版
作者: 2011shenql    时间: 2019-8-9 15:19
谢谢分享,正需要
作者: 2011shenql    时间: 2019-8-12 10:32
非常感谢!
请问如何在菜单中显示中文?
作者: hilsonma    时间: 2019-8-12 15:04
本帖最后由 hilsonma 于 2019-8-12 15:19 编辑
2011shenql 发表于 2019-8-12 10:32
非常感谢!
请问如何在菜单中显示中文?


在菜单中直接使用中文,以UTF-8编码保存菜单文件grub.cfg

如果显示有问题就在grub.cfg中加上相关字体参数
set gfxterm_font=unicode
set lang=zh_CN
set locale_dir=$prefix/locale
insmod gfxterm
terminal_output  gfxterm
loadfont unicode

相应地,使用了以上语句,就要在相应的文件夹放置相应的文件,如:
语言文件 locale/zh_CN.mo
字体文件 fonts/unicode.pf2

由于使用了gfxterm模块,所以也要相应的模块文件 x86_64-efi/gfxterm.mod

为了简单,我很少使用中文,或者尽量使用默认显示没有问题的中文。
例如:”返回“ 的"返”默认显示有问题我就只使用一个字“回”,“搜索”显示有问题我就使用“查找”。
这样就不需要加字体语句。只要是utf-8编码,grub2一般都默认显示的。
作者: 2011shenql    时间: 2019-8-13 10:24
hilsonma 发表于 2019-8-12 15:04
在菜单中直接使用中文,以UTF-8编码保存菜单文件grub.cfg

如果显示有问题就在grub.cfg中加上相关字 ...

感谢回复
折腾了一下,没成功
选择了第三个菜单后,在路径中会显示中文,我以为很简单地增加一两条命令就可以在菜单中显示中文。。。
需要的文件太多太复杂,暂时不折腾了
作者: sarsqlg    时间: 2019-8-15 15:29
大神啊,谢谢了。
作者: sarsqlg    时间: 2019-8-15 17:07
大神你好,我改成这样了。改完后我希望我的grub.cfg中的配置能生效要怎么办呢。

在efi分区要目录加了你的efi目录,然后我加了自己的另外两个目录linux,pe结构是这样的。传不了图,我直接打出来
efi根目录文件:

efi,linux,pe,wepe.wim

efi目录主要是改了grub中的内容添加了几个文件grub的内容是

fonts,i386-pc,locale,themes,grub.cfg,grub32.cfg,grubenv,grubfm.cfg

grubcfg的配置改成了:
#################
## (1)特殊变量 ##
#################
#设置菜单的超时时间为5秒
set timeout=3600
#默认启动第4个菜单项众从0开始
set default=3
#
#set vt_handoff=vt.handoff=7
#
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
#自动匹配分辨率
set gfxmode=auto
set timeout_style=menu
#将GRUB2设置为简体中文界面
set lang=zh_CN
set gfxterm_font=unicode

#################
## (2)公共模块 insmod module 载入名为"module"的GRUB2模块。 ##
#################
#两种最流行的磁盘分区格式(partmap.lst)
insmod part_gpt
insmod part_msdos
#常见文件系统驱动(fs.lst)
insmod fat
insmod exfat
insmod ntfs
insmod iso9660
insmod ext2
insmod xfs
#一次性加载所有可用的视频驱动
insmod all_video
#图形模式终端
insmod gfxterm
#背景图片支持
insmod png
insmod jpeg
#
insmod gettext
#可用于提供主题支持
insmod gfxmenu     
#将"file"文件映射为"device"回环设备   
insmod loopback        

#列出已经加载的所有模块
lsmod

#########################################
## (3)公共命令(必须放在模块和变量之后) ##
#########################################
#激活图形模式的输出终端,以允许使用中文和背景图
terminal_output  gfxterm
#加载字体文件
#loadfont (hd0,1)/efi/grub/themes/Vimix/unifont-regular-16.pf2 #设置字体
set theme=(hd0,1)/efi/grub/themes/Vimix/theme.txt #设置主题
#set theme=(hd0,1)/efi/grub/themes/breeze/theme.txt #设置主题
export theme

   
#################
## (4)菜单项   ##
# chainloader [--force] file :链式加载"file"文件。通常使用磁盘块表示法,例如用'+1'表示当前根分区的第一个扇区。
# linux file … 使用32位启动协议从"file"载入一个Linux内核映像,并将其余的字符作为内核的命令行参数逐字传入。
#--class 指定icon,在/themes/主题名/icons目录下有同名文件即可显示icon
#################

set root=(hd0,1)

menuentry "Windows 10 enterprise_x64 ISO" --class windows {
   
    chainloader +1
}

menuentry "ubuntu 18.04.2 desktop amd64 ISO " --class ubuntu --class gun-linux {
    set isofile=/linux/ubuntu_18_04/ubuntu-18.04.2-desktop-amd64.iso
    loopback loop0 $isofile
    linux (loop0)/casper/vmlinuz boot=casper iso-scan/filename=$isofile locale=zh_CN.UTF-8
    initrd (loop0)/casper/initrd
}

menuentry "Start WePE ISO " --class windows {
    set isofile=/pe/wepe/wepe_64.iso
    set g4d_dir="/efi/Grub4dos/"
    set cfgfile="find --ignore-floppies --ignore-cd --set-root $isofile; map --mem $isofile (0xff);map --hook;chainloader (0xff)"
    linux $g4d_dir/grub.exe --config-file=$cfgfile
}

#menuentry "hard disk boot" --class harddrive {
#    set root='hd1'
#    chainloader +1
#}

#menuentry "hard disk boot" --class harddrive {
#    set root='hd0,msdos5'
#    set g4d_dir="/Grub4dos/"
#    set cfgfile="map (hd0) (hd1);map (hd1) (hd0);map --hook;rootnoverify (hd0,0);makeactive;chainloader +1"
#    linux $g4d_dir/grub.exe --config-file=$cfgfile
#}

menuentry "Reboot" --class restart {
    reboot;
}

menuentry "ShutDown" --class shutdown {
    halt;
}



作者: hilsonma    时间: 2019-8-15 18:04
sarsqlg 发表于 2019-8-15 17:07
大神你好,我改成这样了。改完后我希望我的grub.cfg中的配置能生效要怎么办呢。

在efi分区要目录加了你 ...

定制efi文件的时候就定义了你的grub2路径

grub-mkimage -O x86_64-efi -p /efi/grub -o grubx64.efi part_msdos fat normal

这是最简单的定制,少了任何一项都无法进入普通模式,只会进入救援模式。
-O x86_86-efi 定义生成的文件是用于64位EFI平台(注意是大写的O)
-p /efi/grub 定义生成的文件使用的grub2路径是 /efi/grub ,有关grub2的文件都放在这个文件夹里。(小写的p)
-o grubx64.efi 定义生成的文件为grubx64.efi (小写的o)
part_msdos 定义可识别的分区格式
fat 定义可识别的文件系统
normal 定义可使用的命令集
后面三个参数是模块文件列表,要包含的模块都可以在这里列出,如果使用没有包含在这里的模块就要将模块文件放在grub2文件夹中,在配置文件中使用insmod 命令导入。

默认的配置文件是grub2文件夹中的 grub2.cfg
要改变默认配置文件就要在定制时加上内置配置参数,如 -c my.cfg 然后在my.cfg中指定新的配置文件
作者: hilsonma    时间: 2019-8-15 18:06
本帖最后由 hilsonma 于 2019-8-15 18:40 编辑
sarsqlg 发表于 2019-8-15 17:07
大神你好,我改成这样了。改完后我希望我的grub.cfg中的配置能生效要怎么办呢。

在efi分区要目录加了你 ...


如果你定制时使用的参数是 -p /efi/grub
那么你修改 /efi/grub/grub.cfg 你的配置就会生效。
如果你直接使用我定制的grubx64.efi 那么修改 /efi/grub/grub.cfg 就会生效
当然前提是引导定制的grubx64.efi (或者已改名为bootx64.efi或grubfmx64.efi等等)


你在grub文件夹中添加的
i386-pc是用于bios平台的,efi启动用不到
grub32.cfg 必需在其他配置文件中引用
grubfm.cfg 原本我已在grub.cfg中引用

你修改的grub.cfg
insmod part_msdos
insmod fat
这两项一般不需要,引导文件正常已包含,除非不是fat分区启动。
你的菜单项中基本都是bios启动的,所以你的配置文件生效了,但无法启动

也就是说,你这个配置文件其实是bios启动平台的
定制时应该使用的参数是 -O i386-pc -p /boot/grub -o core.img
然后 Copy /B i386-pc\boot.img+core.img g2ldr
最后在bios引导中指向g2ldr这个引导文件才能引导成功
当然,相关的文件都要放到 /boot/grub 而不是 /efi/grub

至于uefi平台,你这个配置文件无法启动。
在uefi平台中,你的改动已生效,引导已经到了你这个配置文件,但这个配置文件的内容导致启动无法继续下去。
作者: sarsqlg    时间: 2019-8-15 21:46
hilsonma 发表于 2019-8-15 18:06
如果你定制时使用的参数是 -p /efi/grub
那么你修改 /efi/grub/grub.cfg 你的配置就会生效。
如果你 ...

大神,的确我的菜单生效了但点了后没有实际想要的效果,而且主题也没生效,我之前在BIOS的都可以生效,但我现在想要改成uefi的方式了。哪我现在要怎么改才能和bios一样的效果呢。还是通过guub引导的方式。
作者: hilsonma    时间: 2019-8-15 22:46
sarsqlg 发表于 2019-8-15 21:46
大神,的确我的菜单生效了但点了后没有实际想要的效果,而且主题也没生效,我之前在BIOS的都可以生效,但 ...

我没有用过主题,也不懂
作者: sarsqlg    时间: 2019-8-18 00:22
hilsonma 发表于 2019-8-15 22:46
我没有用过主题,也不懂

可以加载主题了,是我用了你定制的grub efi,但你定制的没有加载主题需要的模块所以没效果。我从新定制后可以加载了。现在遇到了新问题。我看了grubfm.cfg后有了想法。想搜索磁盘中按照一定规则的文件显示出来。但好像现本有些问题能帮我看看吗,脚本是这样的。

grub.cfg菜单中有项是这样的。

menuentry "2.wepe startup find, name [.wim .iso .efi]" --hotkey=2 --class windows {
        export op='((\.wim)|(\.iso)|(\.efi))$'
        configfile "${prefix}"/wepe_startup_find.cfg
}

解释:
export op='((\.wim)|(\.iso)|(\.efi))$'             #传入一个正则表达式过滤出定制的文件
configfile "${prefix}"/wepe_startup_find.cfg  #转到wepe_startup_find.cfg

wepe_startup_find.cfg 大概是这样的。
grubfm_init;
if  test -f "${op}"; then
        echo "grubfm grubfm_open"
        echo "op:${op}"
        grubfm_open "${op}"
        unset op;
else
        echo "grubfm grubfm_find"
        echo "op:${op}"
        #set name_regexp="${op}"
        grubfm_find "${op}"
        unset op;
fi

#name_check
function name_check {
        echo "name_check arg1:${1}";
       
        set name_file="${1}";
        if ! test -f "${name_file}"; then
                unset name_file;
                return false
        fi
       
        if ! regexp "${name_regexp}" "${name_file}"; then
                unset name_file;
                return false
        fi
       
        menuentry "${name_file}" "${name_file}" {
                #$1=title,$2=
                export op=$2;
                configfile ${grub_fm};
        }

        unset name_file;
}

#dir_earch
function dir_earch {
        echo "dir earch find arg1:${1}";
       
        set dir="${1}";
        for item in ${dir}/*; do
                if test -d "${item}"; then
                        #dir_deep_3 "${item}"
                else
                        name_check "${item}"
                fi;
        done;
        unset dir;
}

# grubfm_find DIR
function grubfm_find {
        set default=1;
        set name_regexp="${1}"

        menuentry ".." --class dir {
                configfile "${grub_fm}";
        }

        #列出grub可见的设备
        ls

        for device in (*); do
                echo "earch device:${device}"
               
                if test -d "${device}"; then
                       
                        #probe --set=fs -f "${device}";
                        #probe --set=label -l "${device}";
               
                        if regexp 'loop' "${device}"; then
                                continue;
                        elif test "${device}" = "(memdisk)" -o "${device}" = "(proc)"; then
                                continue;
                        fi;
                fi;
               

                for item in ${device}/*; do
                        #regexp --set=name '.*/(.*)$' "${item}";

                        if test -d "${item}"; then
                                dir_earch "${item}"
                        else
                                name_check "${item}
                        fi;
                done;
        done;

        unset name_regexp;
}


作者: sarsqlg    时间: 2019-8-18 00:22
wintoflash 发表于 2019-8-16 09:42
没有图片,我也看不出个所以然,只能假定你把需要加载的模块都加载了。
我一般是这样写的:
看起来你没 ...

恩,谢谢,的确是有些模块没加载,写脚本遇到了新问题帮忙看看哈。。
作者: Sho    时间: 2019-8-23 09:08
请问楼主,运行build_grub.bat,编译grubx64.efi时出现错误:
grub-mkimage.exe: error: relocation 0x4 is not implemented yet.

efi32位和legacy都没有错误,是啥原因?
作者: hilsonma    时间: 2019-8-23 09:40
Sho 发表于 2019-8-23 09:08
请问楼主,运行build_grub.bat,编译grubx64.efi时出现错误:
grub-mkimage.exe: error: relocation 0x4 i ...


我也不懂。
你可以尝试自己排查
先用最基本的参数试试
grub-mkimage -O x86_64-efi -p /efi/grub -o grubx64.efi part_msdos fat normal

如果没有问题再加上自己需要的模块,如我现在的
grub-mkimage -O x86_64-efi -p /efi/grub -o grubx64.efi part_msdos part_gpt fat exfat ntfs normal chain configfile probe regexp test search wimboot halt reboot help linux
作者: Sho    时间: 2019-8-23 09:58
hilsonma 发表于 2019-8-23 09:40
我也不懂。
你可以尝试自己排查
先用最基本的参数试试

最基本的参数也试了,一样的错误,我再换台电脑试试吧
作者: Sho    时间: 2019-8-23 10:45
wintoflash 发表于 2019-8-23 10:27
32位windows?

64位windows10 1903
晚上回家试试家里的电脑,再向老大汇报哈!
作者: ksafei    时间: 2019-8-23 21:06
wintoflash 发表于 2019-8-23 10:27
32位windows?

W大,grub2_0812版在64位windows10_1809中运行build_grub.bat生成 的grubx64.efi 0k,之前版本则正常,请查验
作者: Sho    时间: 2019-8-23 22:00
wintoflash 发表于 2019-8-23 10:27
32位windows?

W大,回家试了也是同样的错误,和楼上这位仁兄一样grubx64.efi 0k
看了国外的论坛,似乎有个patch要打补丁?请查验下,我也是下的0812的版本的
作者: 土老表    时间: 2019-8-25 19:32
1
作者: zyy    时间: 2019-9-25 11:29
谢谢楼主的分享,学习中
作者: zck132    时间: 2019-9-29 19:50
楼主你好,我下载了你那个uboot测试,那个把所有PE放到pe文件夹,自动加载菜单太好用了,可是我测试以前一直正常的几个PE,很多都启动不了,只有其中一个可以成功,哎,是什么原因啊?其它我只想要在我现在的GRUB2的基础上添加那个微软认证。有没有简单的方法?
作者: hilsonma    时间: 2019-9-29 21:20
本帖最后由 hilsonma 于 2019-9-29 21:43 编辑
zck132 发表于 2019-9-29 19:50
楼主你好,我下载了你那个uboot测试,那个把所有PE放到pe文件夹,自动加载菜单太好用了,可是我测试以前一 ...


我下载的pe都能成功启动,你的什么情况我不清楚。
有两点是确定的:
引导程序是64位的,只能引导64位的pe wim镜像。32位的pe wim镜像要么在bios平台下引导,要么在32位efi平台使用32位引导程序引导。
目前只是使用了wintoflash的wimboot模块实现wim镜像的引导,iso镜像暂未能在grub2下直接引导。

关于添加认证贴中已经说了,请仔细再看。


作者: lgstd    时间: 2019-10-1 06:17
hilsonma 发表于 2019-9-29 21:20
我下载的pe都能成功启动,你的什么情况我不清楚。
有两点是确定的:
引导程序是64位的,只能引导64位 ...

请教一下,是不是vhd也不能引导?
作者: hilsonma    时间: 2019-10-1 11:00
本帖最后由 hilsonma 于 2019-10-1 11:11 编辑
lgstd 发表于 2019-10-1 06:17
请教一下,是不是vhd也不能引导?


是的,vhd也不能在自动菜单中一键引导,只能每个vhd都设置用bootmgfw.efi+bcd 引导。
目前自动菜单一键引导的镜像文件就只有wim文件。

当然,grub2可以通过引导bootmgfw.efi 再去引导vhd文件,只是还做不到在自动菜单中一键引导。bios平台可能可以吧,但我在bios平台都是用grub4dos的SISO实现的,没有尝试过bios平台下用grub2.
作者: wjzj    时间: 2019-10-11 22:03
先收藏,慢慢消化
作者: vm669    时间: 2019-10-13 16:07
大大在吗?我用XOR启动的增加一个凤凰系统
引导efi文件grubx64.efi,启动后运行到命令行就没了

是那个文件出错呢?

我的grubx64.efi和grub.cfg放在一起


set timeout=6

menuentry ‘Phoenix OS’ --class android-x86 {
search --set=root --file /PhoenixOS/kernel
linux /PhoenixOS/kernel quiet root=/dev/ram0 SRC=/PhoenixOS vga=auto
initrd /PhoenixOS/initrd.img

这个是在deepin的40_启动菜单复制出来的
是语法出错还是iefi文件错误呢?
发现用XORboot的人太少了,网上查找的帮助也太简单了
搞得我都要准备换grub2菜单了
作者: zihan0926    时间: 2019-10-13 16:36
谢谢,收藏测试
作者: vm669    时间: 2019-10-13 18:50
这两天增加凤凰Os
然后发现grubx64.efi启动需要的grub。cfg是需要放在boot里面
但是深度自己的shimx64.efi的cfg确实放在自己文件夹,就是shimx64.efi和grub.cfg是一起放在deepin文件夹的,是不是这个文件修改过啊?
我后来自己建立一个凤凰文件夹,用深度的shimx64.efi和凤凰的cfg,可以启动凤凰的os

呵呵呵

只是另外的kernel和initrd的命令方式在xor里面没成功,我觉得这个比较直接

作者: hilsonma    时间: 2019-10-14 05:20
vm669 发表于 2019-10-13 16:07
大大在吗?我用XOR启动的增加一个凤凰系统
引导efi文件grubx64.efi,启动后运行到命令行就没了

grub2引导到命令行是因为默认路径找不到grub.cfg
grub.cfg的位置与grubx64.efi的位置无关,是在编译grubx64.efi时指定的

例如:
  1. grub-mkimage -O x86_64-efi -p /efi/grub -o grubx64.efi part_msdos part_gpt fat exfat ntfs normal chain configfile probe regexp test search wimboot halt reboot help linux
复制代码

上面编译命令中,-p /efi/grub 这个参数就是指定安装路径是 /efi/grub,也就是编译生成的grubx64.efi 使用的配置文件是 /efi/grub/grub.cfg 。如果这个路径的grub.cfg不存在,启动时就会进入命令行。
在grub2命令行中,输入set, 会显示所有grub2环境变量值,其中 prefix= 后面的值就是grub.cfg的默认位置,只要将修改好的grub.cfg放到这个位置就会起作用,不再是直接进入命令行。
作者: hilsonma    时间: 2019-10-14 05:44
本帖最后由 hilsonma 于 2019-10-14 06:11 编辑
vm669 发表于 2019-10-13 18:50
这两天增加凤凰Os
然后发现grubx64.efi启动需要的grub。cfg是需要放在boot里面
但是深度自己的shimx64.ef ...


xorboot的话请参考下图,这是想象中的设置,我没有测试过,你可以试试,不成功的话就变换一些参数再试



当然,如果不是直接用linux内核方式启动,也可以用 efi 方式启动,先引导grubx64.efi 再由grubx64引导phoenix.

我个人认为,比较简单固定的菜单,使用xorboot比较合适,文件结构也简单;如果要测试各种pe镜像或其他系统,使用grub2会更灵活。
作者: vm669    时间: 2019-10-14 09:11
hilsonma 发表于 2019-10-14 05:20
grub2引导到命令行是因为默认路径找不到grub.cfg
grub.cfg的位置与grubx64.efi的位置无关,是在编译grub ...

原来的grubx64.EFI还可以在编译来修改grub.cfg文件的位置吗?
作者: hilsonma    时间: 2019-10-14 10:47
本帖最后由 hilsonma 于 2019-10-14 11:05 编辑
vm669 发表于 2019-10-14 09:11
原来的grubx64.EFI还可以在编译来修改grub.cfg文件的位置吗?


是的,本贴所表述的定制其实就两段代码,一段是编译生成efi文件,一段是编辑配置文件。你可以回头再仔细阅读。
最基本的编译参数是 grub-mkimage -O x86_64-efi -p /efi/grub -o grubx64.efi part_msdos fat normal
O 参数是指定用于什么平台,编译时就会使用相应文件夹的模块 (x86_64-efi)
p 参数是指定prefix变量值,安装文件夹,也就是配置文件所在文件夹 (/efi/grub)
o 参数是指定生成的efi文件名 (grubx64.efi)
最后面是内置模块列表 part msdos fat normal 这四个模块是必备的,这样才能在启动时进入正常模式,否则会进入救援模式。

要将配置文件放在deepin文件夹,编译命令类似这样:
grub-mkimage -O x86_64-efi -p /deepin -o grubx64.efi part_msdos fat normal

但是对于linux系统,grub.cfg 是由系统自动生成的,用户不应该编辑修改,用户修改的应该是你之前说的 40_启动菜单 这类用户定义配置。

你可以将自己的prefix值设置为 /efi/grub、/efi/boot、/boot、/boot/grub 等等。前面两个这一类一般是efi平台,后面两个这一类一般是bios平台。
作者: vm669    时间: 2019-10-14 14:06
hilsonma 发表于 2019-10-14 10:47
是的,本贴所表述的定制其实就两段代码,一段是编译生成efi文件,一段是编辑配置文件。你可以回头再仔 ...

谢谢你

开始安装虚拟机,准备学习GRUB2
也是想每个文件夹一个启动
作者: vm669    时间: 2019-10-14 15:20
本帖最后由 vm669 于 2019-10-14 15:21 编辑

也学习过 極限驅動 的贴子 Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑)http://bbs.wuyou.net/forum.php?mod=viewthread&tid=339411

这篇很好,里面有一个
x64.cfg内容示例:
有挺多系统的,应该都是grub2的的吧,直接参考可以吧

前面一大堆看不懂,后面的
menuentry "启动 delta win7" --class windows --class os {
        insmod ntfs
        set root='(hd0,gpt2)'

        clear
        echo "Start Windows"
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

menuentry "local win7" --class windows --class os {
        insmod ntfs
        set root='(hd0,gpt3)'
       

        clear
        echo "Start Windows"
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi

}

————————————————
版权声明:本文为CSDN博主「Beatfan_N」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010875635/article/details/74289971

这些感觉挺好仿写的,可以套用在你的Uboot的ESP里面grub.cfg吧

作者: hilsonma    时间: 2019-10-14 18:02
vm669 发表于 2019-10-14 15:20
也学习过 極限驅動 的贴子 Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑)http://bbs.wuyou.net/for ...

他这两个菜单项是分别引导两个分区内的 /efi/microsoft/boot/bootmgfw.efi,这两个分区应该都是efi分区
其实没有必要多个efi分区,直接引导每个windows分区的 \Windows\Boot\EFI\bootmgfw.efi 就可以了
比如可以把第一个windows分区的 \Windows\Boot\EFI\bootmgfw.efi 复制一份命名为 boot1.efi
把第二个windows分区的 \Windows\Boot\EFI\bootmgfw.efi 复制一份命名为 boot2.efi
菜单项如下:
menuentry "第一Windows分区" "/Windows/Boot/EFI/boot1.efi" {
        search --no-floppy --set --file $2
        chainloader $2
}
menuentry "第二Windows分区" "/Windows/Boot/EFI/boot2.efi" {
        search --no-floppy --set --file $2
        chainloader $2
}

作者: vm669    时间: 2019-10-14 20:12
hilsonma 发表于 2019-10-14 18:02
他这两个菜单项是分别引导两个分区内的 /efi/microsoft/boot/bootmgfw.efi,这两个分区应该都是efi分区
...

是这样吗?我以为他的 set root='(hd0,gpt2)'
是指定启动分区呢?

我以后将说分区:EFI,win7,win8,win10,DEEPIN,。。
然后用 set root='(hd0,gpt2)' 这样来指定启动不同系统。
============

如果我想前面三个分别启动7,8,10
对应的cfg中你的这句
menuentry "0.Windows 7" --hotkey=0 {
  chainloader /efi/microsoft/bootx64.efi
}
menuentry "0.Windows 8.1" --hotkey=0 {
  chainloader /efi/microsoft/bootx64.efi
}
menuentry "0.Windows 10" --hotkey=0 {
  chainloader /efi/microsoft/bootx64.efi
}
是不是要三次都是bootx64.efi,那怎么分辨是哪个磁盘分区,不是用et root='(hd0,gpt**)'这句吗?

然后
menuentry "ubuntu16.04 x86" --class ubuntu --class os {
        insmod ext2
        set root='(hd0,gpt5)'
        linux /vmlinuz ro root=/dev/sda5
        initrd /initrd.img
        echo "Start Ubuntu 16.04"
}
这句准备修改一下用来启动deepin


还没搞明白grub2,只是初步想法,
作者: hilsonma    时间: 2019-10-14 20:27
本帖最后由 hilsonma 于 2019-10-14 20:37 编辑
vm669 发表于 2019-10-14 20:12
是这样吗?我以为他的 set root='(hd0,gpt2)'
是指定启动分区呢?


set root='(hd0,gpt2)' 是指定启动分区
但我的操作通常不用指定分区,都是根据启动文件来查找启动分区。
win7, win8, win10 都存在 \Windows\Boot\EFI\bootmgfw.efi
分别复制改名或直接改名,
win7的叫做 \Windows\Boot\EFI\boot7.efi
win8的叫做 \Windows\Boot\EFI\boot8.efi
win10的叫做 \Windows\Boot\EFI\boot10.efi

cfg语句为
menuentry "0.Windows 7" "/Windows/Boot/EFI/boot7.efi" --hotkey=0 {
        search --no-floppy --set --file $2
        chainloader $2
}
menuentry "1.Windows 8" "/Windows/Boot/EFI/boot8.efi" --hotkey=1 {
        search --no-floppy --set --file $2
        chainloader $2
}
menuentry "2.Windows 10" "/Windows/Boot/EFI/boot10.efi" --hotkey=2 {
        search --no-floppy --set --file $2
        chainloader $2
}

当然,不要忘了每个windows分区都要配置一个bcd文件,就放在各自的 \Windows\Boot\EFI\ 文件夹

我没有用过deepin,没办法给建议,你设置好了不妨在这里分享一下。
作者: vm669    时间: 2019-10-14 20:53
本帖最后由 vm669 于 2019-10-14 21:15 编辑
hilsonma 发表于 2019-10-14 20:27
set root='(hd0,gpt2)' 是指定启动分区
但我的操作通常不用指定分区,都是根据启动文件来查找启动分区 ...


这个https://bbs.deepin.org/forum.php?mod=viewthread&tid=133379

对头,就是这样,你厉害


我刚好看到这边文章“bootmgfw.efi 任意存放 , 引導不同的 BCD”

但是你更厉害,bootmgfw.efi  这个文件还能改名
作者: vm669    时间: 2019-10-15 08:41
hilsonma 发表于 2019-10-14 20:27
set root='(hd0,gpt2)' 是指定启动分区
但我的操作通常不用指定分区,都是根据启动文件来查找启动分区 ...

不要忘了每个windows分区都要配置一个bcd文件,就放在各自的 \Windows\Boot\EFI\ 文件夹

我觉得还是应该放在EFI区,系统分区经常重装再搞BCD麻烦
我觉得应该像你之前思路启动文件统一放在EFI区,
各自系统盘怎么折腾都没事,照样能启动到win系统
作者: hilsonma    时间: 2019-10-15 13:18
本帖最后由 hilsonma 于 2019-10-15 13:21 编辑
vm669 发表于 2019-10-15 08:41
不要忘了每个windows分区都要配置一个bcd文件,就放在各自的 \Windows\Boot\EFI\ 文件夹

我觉得还是应 ...


正是为了统一的efi区,不管哪台电脑,多次重装,efi区引导都不用变动。

而每次重装系统或每台不同的电脑,bcd都是不同的,所以我建议bcd放在windows分区跟bootmgfw.efi放一起。
efi区的启动文件(无论是xorboot还是grub2)都是引导到windows分区的bootmgfw.efi 这样efi区才不需要每次更新

重装windows搞bcd不过是一个脚本的事,而且在windows分区搞bcd当然要比在efi区搞bcd简便得多。
作者: vm669    时间: 2019-10-16 11:15
本帖最后由 vm669 于 2019-10-16 12:29 编辑

基本成功了,只差kernel的命令行,真的不懂了

XOR方式:
DEEPIN启动:/EFI/deepin/shimx64.efi --> /EFI/deepin/grubx64.efi --> /EFI/ubuntu/grub.cfg --> 根分区的vmlinuz-initrd
凤凰OS启动:/EFI/Phoenix/grubx64.efi -->/EFI/BOOT/grub.cfg --> 根分区D的kernel-initrd
凤凰OS用命令行

出错



XOR的DEEPIN启动菜单再增加凤凰OS和win10

凤凰OS是按照官网方式增加,没有问题

添加Phoenix OS启动项
1. 重启进入到Deepin中,为Phoenix OS添加Grub的引导项,首先修改/etc/grub.d/40-custom文件,填入下列内容,并保存:
menuentry ‘Phoenix OS’ --class android-x86 {
search --set=root --file /PhoenixOS/kernel
linux /PhoenixOS/kernel quiet root=/dev/ram0 SRC=/PhoenixOS vga=auto
initrd /PhoenixOS/initrd.img
}
2. 修改/etc/default/grub文件,注释下列两行(在两行前加#),并保存;
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=TRUE
3. 生成新的Grub菜单;
通过下列命令行生成新的Grub菜单:
sudo grub-mkconfig -o /boot/grub/grub.cfg

win10是采用BCD方式,
修改 \Windows\Boot\EFI\bootmgfw.efi为 \Windows\Boot\EFI\bootmgfw10.efi,
再用BOOTICEx64增加BCD,放在windows分区跟bootmgfw10.efi放一起。
再到DEEPIN按照上面方式增加
menuentry "2.Windows 10" "/Windows/Boot/EFI/bootmgfw10.efi" --hotkey=2 {
        search --no-floppy --set --file $2
        chainloader $2
}
可以启动,但是启动时有暂停显示一个出错画面

不管它,一会儿还是可以进入win10的。不知道是菜单文件问题还是系统问题,这两天win10系统有点慢,经常鼠标不能动

感谢大侠,至此好像等于在不损启动的基础上初步学会照抄grub菜单
应该是这样吧。目前算是XOR嵌套grub,但是grub是DEEPIN的,接下去需要改为全部grub启动



作者: vm669    时间: 2019-10-16 12:36
再开一个帖子请教大侠
1、如果我不修改efi定义cfg文件位置,是不是cfg必须放在efi-boot里面。?
2、如果像deepin这样自己修改的shimx64.efi,那就必须按他的方式放,这个名字好像是你说过的安全启动方面的?
3、如果我清空目前的EFI区文件,要改为grub启动,是不是要安装grub启动?怎么安装?看网上说的修复启动那样,好像BOOTICEx64就可以,但是哪个grub4dos是grub还是grub2?还有其他方式吗?
4、如果按grub2启动,那就是只要一个grub.cfg文件了,放在boot里面,那么menuentry前面的一大堆的那些代码是一定要的还是可以不要,只要timeou时间简单几个就行?。看得头晕
5、假如我用你的uboot的efi放进去,需要注意什么?你的cfg文件也是放在grub里面的



作者: hilsonma    时间: 2019-10-16 18:20
vm669 发表于 2019-10-16 12:36
再开一个帖子请教大侠
1、如果我不修改efi定义cfg文件位置,是不是cfg必须放在efi-boot里面。?
2、如果 ...
1、如果我不修改efi定义cfg文件位置,是不是cfg必须放在efi-boot里面。?

对grub2来说,不存在修改不修改,配置文件应在位置是在编译efi文件时指定了的。
是你自己编译生成的efi文件,你会知道,这个位置是由 -p 参数指定的,如果忘记了或者是别人编译生成的efi文件,可以进入grub2命令行输入set来查看prefix的值。
2、如果像deepin这样自己修改的shimx64.efi,那就必须按他的方式放,这个名字好像是你说过的安全启动方面的?

shimx64.efi应该是安全启动需要的吧,后面的grubx64.efi才是真正的grub引导,生成这个grubx64.efi的时候 -p 参数指定了什么位置我们就要将配置文件放到什么位置。不知道的话同样是在grub2命令行输入set来查看。
3、如果我清空目前的EFI区文件,要改为grub启动,是不是要安装grub启动?怎么安装?看网上说的修复启动那样,好像BOOTICEx64就可以,但是哪个grub4dos是grub还是grub2?还有其他方式吗?

efi区改为grub2启动,只要将grub2的efi文件如grubx64.efi改名为bootx64.efi放到\efi\boot,然后将grub.cfg放到这个efi文件指定的文件夹就可以了。grub2的efi文件可以复制别人的,也可以是自己编译的。grub.cfg的位置不确定就在grub2命令行下输入set来查看。
bootice既可以安装grub4dos引导也可以安装grub2引导,但都是安装到mbr的,是bios平台的,不是uefi平台。
grub原来发展到0.97版就停止了,后来另外的团队继续开发,可以理解为两个团队走了两个分支,一个分支是grub4dos,另一个分支是grub2. 所以grub可以理解为有三个版本:原来的Grub Legacy, 后来的Grub2 和 Grub4Dos.
4、如果按grub2启动,那就是只要一个grub.cfg文件了,放在boot里面,那么menuentry前面的一大堆的那些代码是一定要的还是可以不要,只要timeou时间简单几个就行?。

一个grubx64.efi本来就只要一个grub.cfg,放在哪里同样是由grubx64.efi生成时指定的。 menuentry前面的一大堆的代码是可以不要的,只是那样就达不到原来的启动效果。你自己配置的话可以先做最简单的配置,只要能引导系统就可以了,有条件再学习各种启动效果。但如果编译grubx64.efi时少了的模块,启动要用到的话,加载模块语句少了会出错的,比如你前面的出错画面 (...... not found.) 有可能是没有加载ntfs模块导致不识别ntfs分区找不到bootmgfw.efi而造成的,不过我也不肯定。
5、假如我用你的uboot的efi放进去,需要注意什么?你的cfg文件也是放在grub里面的

我的efi 是指定配置文件为 \efi\grub\grub.cfg的,整套文件放进去然后修改grub.cfg为你需要的就可以了
作者: hilsonma    时间: 2019-10-17 13:38
本帖最后由 hilsonma 于 2019-10-17 13:39 编辑

@sea2moon
导入证书这个操作本身不会覆盖原来的文件,但会保存信息到nvram中
而导入证书的前提是你将主启动改为grub2,这个操作肯定会将原来的主启动文件覆盖(\efi\boot\bootx64.efi)

你可以使用原来的主启动bootmgfw.efi (\efi\boot\bootx64.efi),要启动到PE只要在bcd中设置就可以了 (\efi\microsoft\boot\bcd)

如果真的要改用grub2启动,一定要先备份efi区,至少要备份efi这个文件夹下的所有内容。
如果没有备份efi区而又改了的话,可以尝试用bcdboot恢复。
关键的是要备份windows分区,也就是预装系统的分区。
作者: sea2moon    时间: 2019-10-17 13:45
hilsonma 发表于 2019-10-17 13:38
@sea2moon
导入证书这个操作本身不会覆盖原来的文件,但会保存信息到nvram中
而导入证书的前提是你将主启 ...

好的,谢谢!
我所有的文件都已经备份好了。
这几天试着装win7,装不上去,已经破坏N次了。
官网上说电脑只支持win10,而且只有win10的驱动下载。

电脑在bios 设置界面有个单独的项目(supportassist os recovery)--不在启动项里面,昨天我修改启动文件后,就告诉我程序损坏了(可联网下载修复)。从备份文件恢复后可用。
作者: hilsonma    时间: 2019-10-17 14:06
sea2moon 发表于 2019-10-17 13:45
好的,谢谢!
我所有的文件都已经备份好了。
这几天试着装win7,装不上去,已经破坏N次了。

为什么要装win7呢,如果觉得win10卡可以尝试装这个win8.1 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=409320

如果主板只认win10可以尝试efi区用win10的bootmgfw.efi,也就是装了win7或win8.1后,将efi区启动文件改回你原来win10的启动文件。

安装win7或win8.1的时候不要使用安装程序,先格式化原windows分区,再用dism或wim工具将安装镜像展开到windows分区,最后新建一个bcd文件覆盖到efi区 \efi\microsoft\boot\bcd
完成这些操作后重启会进入系统安装设置画面,如卡停在硬件不适合按确定重启,这时不要理会,按Shift+F10, 会进入命令行,输入 cd oobe 回车后,再输入 msoobe 回车,就会出现用户设置界面,全部设置完成再重启就可以了

如果这样安装都安装不了那我也没有办法了,用回你原来预装的系统吧。
作者: cchh543    时间: 2019-10-17 14:24
詳細,看得懂,學習了
作者: sea2moon    时间: 2019-10-17 17:47
本帖最后由 sea2moon 于 2019-10-17 17:49 编辑
注意现在 \efi\boot\bootx64.efi 不再是xorboot生成的启动文件,而是Shim的主程序,xorboot生成的启动文件已更名为grubfmx64.efi (Shim+mok启动方案必须是这个名字才能引导成功)。

shim + mok
还请费心解释一下。通过bootx64再调用grubfmx64.efi?

大概是这个意思吧:https://www.kvaser.cn/developer-blog/secure-boot-linux-systems/
作者: hilsonma    时间: 2019-10-17 18:19
本帖最后由 hilsonma 于 2019-10-17 18:38 编辑
sea2moon 发表于 2019-10-17 17:47
shim + mok
还请费心解释一下。通过bootx64再调用grubfmx64.efi?



shim -> grub -> grubfm
  |          |
  +-- mokmanager

bootx64.efi         MokManager.efi + GRUBFM.cer          grubx64.efi       grubfmx64.efi
======= >> [==================== >>] ======= >> =========>>
Shim loader        mok管理               grubfm密钥          shim grub         用户grub

GRUB 目前尚无带有微软签名的版本,因此不能直接通过安全启动。必须通过 Shim 等加载。
Shim 通过了微软的认证,内置了一些 Linux 发行版维护者的密钥,例如 Red Hat (Fedora), Novell (SUSE), Canonical (Ubuntu)。
bootx64.efi 即为Shim的主程序。Shim 会检验 grubx64.efi 的证书。如果检验通过,则加载 grubx64.efi,否则加载 Mokmanager.efi。
Mokmanager 用于修改 Mok 列表,导入自己的密钥 (MOK)。

由shim loader 加载 shim grub, 如未检测到证书需要导入证书,所以第一次会加载Mokmanager来导入证书,然后才加载shim grub,最后由shim grub加载用户程序(用户grub).

所以用户只可以修改grubfmx64.efi,其他只可以照搬不可以修改,否则不能过secureboot.

以上就是shim+mok方案。
作者: sea2moon    时间: 2019-10-17 21:29
本帖最后由 sea2moon 于 2019-10-17 23:07 编辑

晚上回来试了下
附件把你efi压缩包中的bootx64改名为grubfmx64
然后把安全启动的四个文件放入boot

启动后 选 from disk 导入证书,显示不是有效格式

何解?
作者: hilsonma    时间: 2019-10-17 22:25
sea2moon 发表于 2019-10-17 21:29
晚上回来试了下
附件把你efi压缩包中的bootx64改名为grubfmx64
然后把安全启动的四个文件放入boot

安全启动四文件+grubfmx64 应该是5个文件
四文件修改日期是 2019-06-25 08:15 的
grubfmx64 修改日期是 2019-07-27 21:17 的
请重新下载再试
作者: sea2moon    时间: 2019-10-17 23:07
hilsonma 发表于 2019-10-17 22:25
安全启动四文件+grubfmx64 应该是5个文件
四文件修改日期是 2019-06-25 08:15 的
grubfmx64 修改日期是 ...

电脑型号:dell 灵越 5523

用xorboot测试无问题
改为附件后中的GRUB后不行,1启动系统提示BCD无效,2自动列表不生成,3手动选择PE后无反应,证书提示只有DER格式证书有效

睡觉……不试了……

efi.7z

1.26 MB, 下载次数: 23, 下载积分: 无忧币 -2


作者: hilsonma    时间: 2019-10-18 05:50
sea2moon 发表于 2019-10-17 23:07
电脑型号:dell 灵越 5523

用xorboot测试无问题

使用附件再试吧
efi.7z (1.3 MB, 下载次数: 33)

bcd无效就使用附件修复
重建Win引导_uefi.7z (803 Bytes, 下载次数: 16)
作者: sea2moon    时间: 2019-10-18 10:36
hilsonma 发表于 2019-10-18 05:50
使用附件再试吧

GRUB测试:不行。
已运行批处理。
效果如图
手动选择PE启动WIM格式成功,ISO格式无反应

另外:用xorboot开启安全启动证书提示一样,导入不进去。关了安全启动后启动正常

微信图片_201910181033186.jpg (165.1 KB, 下载次数: 270)

选择证书后提示

选择证书后提示

微信图片_201910181033187.jpg (100.48 KB, 下载次数: 291)

启动硬盘系统提示

启动硬盘系统提示

作者: hilsonma    时间: 2019-10-18 18:58
本帖最后由 hilsonma 于 2019-10-18 19:28 编辑
sea2moon 发表于 2019-10-18 10:36
GRUB测试:不行。
已运行批处理。
效果如图


安全启动:测试证明本贴的安全启动方案并不支持所有电脑,这是我原本不知道的。
或者你再试试以下步骤:(原来选Enroll key 现在选Enroll hash)
        重新启动后首先会进入 Shim 验证失败的界面 < ERROR >
        按回车键进入shim密钥管理画面 < Shim UEFI key management >
        按任意键进入mok管理画面 < perform MOK management >
        选择 Enroll hash from disk 进入 < Select Binary >
        选择 grubx64.efi 进入 < [Enroll MOK] >
        选择 Continue 进入 < Enroll the key(s)? >
        选择 Yes
        在之后的菜单中选择 Reboot ,重启计算机。


BCD错误:如果你已运行我前面提供的批处理,那么可能你并不是引导 \Windows\Boot\EFI\bootmgfw.efi 来加载系统的,你需要将bcd文件放到你引导的bootmgfw.efi同一个文件夹或者放到你引导的bootmgfw.efi所在分区的 \efi\microsoft\boot 文件夹。
作者: hilsonma    时间: 2019-10-19 07:19
sea2moon 发表于 2019-10-18 10:36
GRUB测试:不行。
已运行批处理。
效果如图

附件是使用wintoflash静默过安全启动方案 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=416924
略做修改的,你也可以试一试。
efi.7z (1.38 MB, 下载次数: 72)
作者: wintoflash    时间: 2019-10-19 08:18
hilsonma 发表于 2019-10-18 18:58
安全启动:测试证明本贴的安全启动方案并不支持所有电脑,这是我原本不知道的。
或者你再试试以下步骤 ...

这是上游软件gnu-efi的一个bug导致的。
选Enroll hash可规避。
作者: vm669    时间: 2019-10-23 10:37
hilsonma 发表于 2019-10-17 14:06
为什么要装win7呢,如果觉得win10卡可以尝试装这个win8.1 http://bbs.wuyou.net/forum.php?mod=viewthrea ...


再用dism或wim工具将安装镜像展开到windows分区,最后新建一个bcd文件覆盖到efi区 \efi\microsoft\boot\bcd
完成这些操作后重启会进入系统安装设置画面,如卡停在硬件不适合按确定重启,这时不要理会,按Shift+F10, 会进入命令行,输入 cd oobe 回车后,再输入 msoobe 回车,就会出现用户设置界面,全部设置完成再重启就可以了

就在上周家里本本win10用了很久太慢,重装系统,不知道是因为SSD原因还是什么ESP是xorboot启动问题,我使用winnetsetup安装了win7 win8.1 win10 5-6个版本,都在安装后重启后停一个画面,
后来网上看到这个oobe方法,用了但是没成功。
最后用了一个ghost版本的win7才可以,晕死了。本来我都把ghost版本的安装系统删光了。幸亏还留一个在摸一个U盘的里。

那个错误提示画面在手机里好像删了,没找到。

大大知道这个是为什么吗?
不知道以后还会遇到吗?当初刚安装SSD时时用pa迁移系统的,等于这次是第一次在SSD安装系统
作者: hilsonma    时间: 2019-10-23 13:44
vm669 发表于 2019-10-23 10:37
再用dism或wim工具将安装镜像展开到windows分区,最后新建一个bcd文件覆盖到efi区 \efi\microsoft\boot ...

我不知道你这个是什么原因。
不知道你的SSD是gpt还是mbr,如果是mbr就一定要bios启动完成安装设置直至能正常进入系统才可以转为uefi启动的。
作者: vm669    时间: 2019-11-4 21:23
家里本本是UEFI,办公室是BIOS。
来回折腾有时有点乱
问大大一个问题。这个做好的grub2启动U盘在BIOS启动的电脑上可以启动吗?




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