hilsonma 发表于 2019-3-21 07:49:52

使用Grub2定制UEFI启动 (bootx64.efi)

本帖最后由 hilsonma 于 2020-4-7 17:48 编辑

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

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


完整的范例请参考我的启动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.

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

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

set format=x86_64-efi
set prefix=/efi/grub
set output=grubx64.efi
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
grub-mkimage -O %format% -p %prefix% -o %output% %modules%
注意区分大小写,保存类型为所有文件,文件名为 z.cmd ,一定要将保存类型改为所有文件,不能是文本文档,它其实是windows脚本文件。

附件有我做好的 z.cmd ,不想自己做的话就下载附件解压放到grub2文件夹


运行 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 文件夹下新建一个文本文档 ,内容如下:
set default=0
set fallback=2
set timeout=5

menuentry "0.Windows" "/Windows/Boot/EFI/bootmgfw.efi" --hotkey=0 {
      search -s -f $2
      chainloader $2
}
menuentry "1.WinPE" --hotkey=1 {
      export grub_find=/pe/pe.wim
      configfile $prefix/grubfm.cfg
}
menuentry "2.Grubfm" --hotkey=2 {
      export grub_find=/pe
      configfile $prefix/grubfm.cfg
}
menuentry "3.Reboot" --hotkey=3 {reboot}
menuentry "4.Halt" --hotkey=4 {halt}
menuentry "Porteus" "/porteus/vmlinuz" {
      search -s -f $2
      linux $2 norootcopy nomagic
      initrd /porteus/initrd.xz
}
menuentry "Boot WIM" "/test.wim" {
      search -s wimroot -f $2
      wimboot @:bootmgfw.efi:$prefix/wimboot/bootmgfw.efi \
                        @:bcd:$prefix/wimboot/bcd \
                        @:boot.sdi:$prefix/wimboot/boot.sdi \
                        @:boot.wim:($wimroot)$2
}
menuentry "Boot ISO" "/test.iso" {
      search -s -f $2
      map $2
}
menuentry "Boot VHD" "/test.vhd" {
      search -s -f $2
      ntboot -e $prefix/wimboot/bootmgfw.efi -s $prefix/wimboot/boot.sdi $2
}
menuentry "Ntboot VHD" "/test.vhd" {
      search -s -f $2
      ntboot -e $prefix/wimboot/bootmgfw.efi -s $prefix/wimboot/boot.sdi $2
}
注意,保存类型为所有文件,文件名为 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解压
将解压得到的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:03

不错,谢谢楼主的分享

chishingchan 发表于 2019-3-21 10:18:18

这样是不是容易理解一点?
@echo off
cd /d d:\grub2

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

:: grub.cfg
echo set default=0>grub.cfg
echo set fallback=1>>grub.cfg
echo set timeout=5>>grub.cfg
echo.>>grub.cfg
echo menuentry "0.xorboot" --hotkey=0 {>>grub.cfg
echo   chainloader /efi/xorboot/xorboot.efi>>grub.cfg
echo }>>grub.cfg
echo menuentry "1.grub2 fileman" --hotkey=1 {>>grub.cfg
echo   chainloader grubfmx64.efi>>grub.cfg
echo }>>grub.cfg
echo menuentry "2.mini linux" --hotkey=2 {>>grub.cfg
echo   chainloader minilinux.efi>>grub.cfg
echo }>>grub.cfg

::
md \efi\boot>nul 2>nul
ren \efi\boot\bootx64.efi grubfmx64.efi
copy bootx64.efi \efi\boot\
copy grub.cfg \efi\boot\

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

:: if bootx64.efi == Shim
:: if bootfmx64.efi == xorboot
md \efi\boot>nul 2>nul
md \efi\xorboot>nul 2>nul
move \efi\boot\bootfmx64.efi \efi\xorboot\xorboot.efi
copy bootx64.efi \efi\boot\bootfmx64.efi

rengrancunzai 发表于 2019-3-21 11:54:59

谢谢分享

jxdeng2017 发表于 2019-3-21 17:24:17

普及W大的成果,赞一个。{:1_183:}

秋月云开 发表于 2019-3-21 20:59:18

谢谢分享,

qingyi78 发表于 2019-3-22 14:10:24

期待XORBOOT一统天下,就先G4D一样

Pauly 发表于 2019-4-5 21:02:17

但有些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:29

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:33

Grub2定制的启动界面支持鼠标操作吗?

hilsonma 发表于 2019-5-8 06:13:10

tkfiles 发表于 2019-5-7 15:20
Grub2定制的启动界面支持鼠标操作吗?

就我知道的grub2菜单是键盘菜单,不支持鼠标操作的。

devilma 发表于 2019-5-8 08:23:31

不错,感谢制作教程!

hilsonma 发表于 2019-5-27 00:22:35

20190526更新:
1.定制脚本自动获取管理员权限,自动定位脚本所在文件夹
2.定制脚本包含证书模块、文件管理相关模块、wimboot相关模块
3.相关wim镜像和efi程序可统一放到任意磁盘 \wim 文件夹中,WIM/EFI菜单项自动列表启动

hilsonma 发表于 2019-5-27 12:04:56

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

ksafei 发表于 2019-5-27 12:38:29

非常好的学习贴,感谢分享。

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

hilsonma 发表于 2019-5-27 12:47:24

ksafei 发表于 2019-5-27 12:38
非常好的学习贴,感谢分享。

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

已更新

suge 发表于 2019-6-11 10:17:41

请问如何能加载背景图片呢?

vm669 发表于 2019-6-11 15:49:35

看完,晕晕的,搞不定。
如果有这样一个 包含全部类型(包含深度DEEPIN)的启动菜单http://bbs.wuyou.net/forum.php?mod=viewthread&tid=397494&page=1&authorid=514118
让小白根据需要复制删除或修改一些启动选项估计才能玩的了

另外,请教 XORboot可以用在bios启动吗?家里的EFI启动现在用的不错,特别是你的小PE,以后再也不用拔插优盘启动了

hilsonma 发表于 2019-6-12 10:34:38

suge 发表于 2019-6-11 10:17
请问如何能加载背景图片呢?

首先制作一张PNG格式的图片,分辨率最好是"1024x768"以保证较好的兼容性。然后将这张图片放到"$prefix/themes/1024x768.png"("$prefix"是你生成efi文件时使用的/p参数指定的目录)。然后在'grub.cfg'中加入如下内容:
set gfxmode=1024x768,auto
terminal_outputgfxterm
background_image $prefix/themes/1024x768.png
生成efi文件时需要添加 gfxterm png 这两个模块才能支持显示png图片

hilsonma 发表于 2019-6-12 10:43:28

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:07

hilsonma 发表于 2019-6-12 10:34
首先制作一张PNG格式的图片,分辨率最好是"1024x768"以保证较好的兼容性。然后将这张图片放到"$prefix/th ...

你好,请问 gfxterm png 这两个模块放在从你处下载来的哪个文件夹内呢?

hilsonma 发表于 2019-6-13 12:26:38

本帖最后由 hilsonma 于 2019-6-13 12:40 编辑

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

是上面下载的grub2里有的,你要做的是生成grub2x64.efi (或者bootx64.efi)时使用的脚本要指定加上这两个模块。象下面这样:
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:05

本帖最后由 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 载入这两个模块。
insmod gfxterm
insmod png
set gfxmode=1024x768,auto
terminal_outputgfxterm
background_image $prefix/themes/1024x768.png

扬帆起航 发表于 2019-6-13 16:12:45

感谢分享

suge 发表于 2019-6-17 10:48:40

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_outputgfxterm
loadfont unicode
但还是显示不了中文,请问如何解决呢?谢谢。。

suge 发表于 2019-6-17 10:56:52

suge 发表于 2019-6-17 10:48
你好,按照你的方法,背景图折腾一翻,搞好了。还有一个问题,在 z.cmd中加了font模块,在grub文件夹中加 ...

感觉还是xorboot比较容易操作些,但有些功能只有GRUB2有,两者混合着用比较完美。。。。

hilsonma 发表于 2019-6-17 13:07:16

suge 发表于 2019-6-17 10:48
你好,按照你的方法,背景图折腾一翻,搞好了。还有一个问题,在 z.cmd中加了font模块,在grub文件夹中加 ...

字体文件unicode.pf2 放到 $prefix/fonts 比如 \efi\grub\fonts

hilsonma 发表于 2019-6-17 13:09:38

suge 发表于 2019-6-17 10:56
感觉还是xorboot比较容易操作些,但有些功能只有GRUB2有,两者混合着用比较完美。。。。

同感。别的电脑我都是用xorboot引导,只有我自己用的电脑才是用grub2引导,便于尝试各种pe各种efi

devilma 发表于 2019-6-17 15:39:41

学习了!谢谢

suge 发表于 2019-6-17 18:06:19

hilsonma 发表于 2019-6-17 13:07
字体文件unicode.pf2 放到 $prefix/fonts 比如 \efi\grub\fonts

谢谢。解决了。看了http://bbs.wuyou.net/forum.php?mod=viewthread&tid=404837&ordertype=1此文wintoflash对另一网友的回复,原来忽略了utf8编码{:1_185:}
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 使用Grub2定制UEFI启动 (bootx64.efi)