无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: hilsonma

[分享] 使用Grub2定制UEFI启动 (bootx64.efi)

    [复制链接]
发表于 2019-6-17 23:24:42 | 显示全部楼层
本帖最后由 phyuzhoukai 于 2019-6-17 23:46 编辑

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

以及自动生成菜单能生成二级文件目录里的文件名吗?
回复

使用道具 举报

 楼主| 发表于 2019-6-18 11:49:03 | 显示全部楼层
本帖最后由 hilsonma 于 2019-6-18 12:03 编辑
phyuzhoukai 发表于 2019-6-17 23:24
问一下,efi下有没有办法利用自动生成菜单来直接引导vhdx文件?

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


grub2文件浏览功能可以查看任意层次的文件夹的任意文件名,查看方式本身就是自动生成菜单,但是一键启动就要看支持的文件类型。
目前efi文件和支持uefi的wim文件可以一键启动,iso文件还不支持,vhdx文件应该是可以支持的,因为我之前很少用vhd,所以还没有设计去引导,但bcd菜单本身是支持引导vhdx的,你如果有兴趣可以从这个方向去自已设计。
回复

使用道具 举报

发表于 2019-6-18 17:06:11 | 显示全部楼层
hilsonma 发表于 2019-6-18 11:49
grub2文件浏览功能可以查看任意层次的文件夹的任意文件名,查看方式本身就是自动生成菜单,但是一键启 ...

好的,谢谢
回复

使用道具 举报

发表于 2019-6-30 21:53:44 | 显示全部楼层
先来感谢大神的热心分享,再来看文章
回复

使用道具 举报

发表于 2019-7-7 17:14:07 | 显示全部楼层
这个很像当初grub4dos那个简洁的启动风格了,我很喜欢,如果能自动(需要编程来判断了)搜索C盘根目录的PE.ISO加入到启动菜单里,那就妙哉。
回复

使用道具 举报

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

使用道具 举报

发表于 2019-7-27 20:21:15 | 显示全部楼层
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’
详细的信息我发消息给你了
回复

使用道具 举报

 楼主| 发表于 2019-7-27 21:26:02 | 显示全部楼层
pcfan120 发表于 2019-7-27 20:21
大师刚测试了,现在选择的是Enroll hash 和 grubx64.efi,可以通过第一步的安全启动了,即出现了wepe, ...

看来还是没有办法进行简化。谢谢你的帮助。
回复

使用道具 举报

发表于 2019-8-8 00:41:06 | 显示全部楼层
下官方原版的没有wimboo模块
回复

使用道具 举报

 楼主| 发表于 2019-8-8 14:10:04 | 显示全部楼层
gdck 发表于 2019-8-8 00:41
下官方原版的没有wimboo模块

建议下载wintoflash的新版
回复

使用道具 举报

发表于 2019-8-9 15:19:05 | 显示全部楼层
谢谢分享,正需要
回复

使用道具 举报

发表于 2019-8-12 10:32:46 | 显示全部楼层
非常感谢!
请问如何在菜单中显示中文?
回复

使用道具 举报

 楼主| 发表于 2019-8-12 15:04:18 | 显示全部楼层
本帖最后由 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一般都默认显示的。
回复

使用道具 举报

发表于 2019-8-13 10:24:28 | 显示全部楼层
hilsonma 发表于 2019-8-12 15:04
在菜单中直接使用中文,以UTF-8编码保存菜单文件grub.cfg

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

感谢回复
折腾了一下,没成功
选择了第三个菜单后,在路径中会显示中文,我以为很简单地增加一两条命令就可以在菜单中显示中文。。。
需要的文件太多太复杂,暂时不折腾了
回复

使用道具 举报

发表于 2019-8-15 15:29:28 | 显示全部楼层
大神啊,谢谢了。
回复

使用道具 举报

发表于 2019-8-15 17:07:06 | 显示全部楼层
大神你好,我改成这样了。改完后我希望我的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;
}


回复

使用道具 举报

 楼主| 发表于 2019-8-15 18:04:35 | 显示全部楼层
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中指定新的配置文件
回复

使用道具 举报

 楼主| 发表于 2019-8-15 18:06:28 | 显示全部楼层
本帖最后由 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平台中,你的改动已生效,引导已经到了你这个配置文件,但这个配置文件的内容导致启动无法继续下去。
回复

使用道具 举报

发表于 2019-8-15 21:46:43 | 显示全部楼层
hilsonma 发表于 2019-8-15 18:06
如果你定制时使用的参数是 -p /efi/grub
那么你修改 /efi/grub/grub.cfg 你的配置就会生效。
如果你 ...

大神,的确我的菜单生效了但点了后没有实际想要的效果,而且主题也没生效,我之前在BIOS的都可以生效,但我现在想要改成uefi的方式了。哪我现在要怎么改才能和bios一样的效果呢。还是通过guub引导的方式。
回复

使用道具 举报

 楼主| 发表于 2019-8-15 22:46:45 | 显示全部楼层
sarsqlg 发表于 2019-8-15 21:46
大神,的确我的菜单生效了但点了后没有实际想要的效果,而且主题也没生效,我之前在BIOS的都可以生效,但 ...

我没有用过主题,也不懂
回复

使用道具 举报

发表于 2019-8-18 00:22:11 | 显示全部楼层
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;
}

回复

使用道具 举报

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

恩,谢谢,的确是有些模块没加载,写脚本遇到了新问题帮忙看看哈。。
回复

使用道具 举报

发表于 2019-8-23 09:08:25 | 显示全部楼层
请问楼主,运行build_grub.bat,编译grubx64.efi时出现错误:
grub-mkimage.exe: error: relocation 0x4 is not implemented yet.

efi32位和legacy都没有错误,是啥原因?
回复

使用道具 举报

 楼主| 发表于 2019-8-23 09:40:43 | 显示全部楼层
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
回复

使用道具 举报

发表于 2019-8-23 09:58:42 | 显示全部楼层
hilsonma 发表于 2019-8-23 09:40
我也不懂。
你可以尝试自己排查
先用最基本的参数试试

最基本的参数也试了,一样的错误,我再换台电脑试试吧
回复

使用道具 举报

发表于 2019-8-23 10:45:58 | 显示全部楼层

64位windows10 1903
晚上回家试试家里的电脑,再向老大汇报哈!
回复

使用道具 举报

发表于 2019-8-23 21:06:25 | 显示全部楼层

W大,grub2_0812版在64位windows10_1809中运行build_grub.bat生成 的grubx64.efi 0k,之前版本则正常,请查验
回复

使用道具 举报

发表于 2019-8-23 22:00:31 | 显示全部楼层

W大,回家试了也是同样的错误,和楼上这位仁兄一样grubx64.efi 0k
看了国外的论坛,似乎有个patch要打补丁?请查验下,我也是下的0812的版本的
回复

使用道具 举报

发表于 2019-8-25 19:32:39 | 显示全部楼层
1
回复

使用道具 举报

发表于 2019-9-25 11:29:09 | 显示全部楼层
谢谢楼主的分享,学习中
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-28 19:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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