phyuzhoukai 发表于 2019-6-17 23:24:42

本帖最后由 phyuzhoukai 于 2019-6-17 23:46 编辑

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

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

hilsonma 发表于 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的,你如果有兴趣可以从这个方向去自已设计。

phyuzhoukai 发表于 2019-6-18 17:06:11

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

好的,谢谢

ahxx 发表于 2019-6-30 21:53:44

先来感谢大神的热心分享,再来看文章{:1_186:}

lforl 发表于 2019-7-7 17:14:07

这个很像当初grub4dos那个简洁的启动风格了,我很喜欢,如果能自动(需要编程来判断了)搜索C盘根目录的PE.ISO加入到启动菜单里,那就妙哉。

pcfan120 发表于 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’
详细的信息我发消息给你了

pcfan120 发表于 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’
详细的信息我发消息给你了

hilsonma 发表于 2019-7-27 21:26:02

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

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

gdck 发表于 2019-8-8 00:41:06

下官方原版的没有wimboo模块

hilsonma 发表于 2019-8-8 14:10:04

gdck 发表于 2019-8-8 00:41
下官方原版的没有wimboo模块

建议下载wintoflash的新版

2011shenql 发表于 2019-8-9 15:19:05

谢谢分享,正需要

2011shenql 发表于 2019-8-12 10:32:46

非常感谢!
请问如何在菜单中显示中文?

hilsonma 发表于 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_outputgfxterm
loadfont unicode

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

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

为了简单,我很少使用中文,或者尽量使用默认显示没有问题的中文。
例如:”返回“ 的"返”默认显示有问题我就只使用一个字“回”,“搜索”显示有问题我就使用“查找”。
这样就不需要加字体语句。只要是utf-8编码,grub2一般都默认显示的。

2011shenql 发表于 2019-8-13 10:24:28

hilsonma 发表于 2019-8-12 15:04
在菜单中直接使用中文,以UTF-8编码保存菜单文件grub.cfg

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

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

sarsqlg 发表于 2019-8-15 15:29:28

大神啊,谢谢了。

sarsqlg 发表于 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_outputgfxterm
#加载字体文件
#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: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中指定新的配置文件

hilsonma 发表于 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平台中,你的改动已生效,引导已经到了你这个配置文件,但这个配置文件的内容导致启动无法继续下去。

sarsqlg 发表于 2019-8-15 21:46:43

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

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

hilsonma 发表于 2019-8-15 22:46:45

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

我没有用过主题,也不懂

sarsqlg 发表于 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;
iftest -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:53

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

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

Sho 发表于 2019-8-23 09:08:25

请问楼主,运行build_grub.bat,编译grubx64.efi时出现错误:
grub-mkimage.exe: error: relocation 0x4 is not implemented yet.

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

hilsonma 发表于 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

Sho 发表于 2019-8-23 09:58:42

hilsonma 发表于 2019-8-23 09:40
我也不懂。
你可以尝试自己排查
先用最基本的参数试试


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

Sho 发表于 2019-8-23 10:45:58

wintoflash 发表于 2019-8-23 10:27
32位windows?

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

ksafei 发表于 2019-8-23 21:06:25

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

wintoflash 发表于 2019-8-23 10:27
32位windows?

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

土老表 发表于 2019-8-25 19:32:39

1

zyy 发表于 2019-9-25 11:29:09

谢谢楼主的分享,学习中
页: 1 [2] 3 4 5 6 7 8 9 10 11
查看完整版本: 使用Grub2定制UEFI启动 (bootx64.efi)