无忧启动论坛

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

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

    [复制链接]
78#
发表于 2019-10-14 20:53:09 | 只看该作者
本帖最后由 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  这个文件还能改名
回复

使用道具 举报

77#
 楼主| 发表于 2019-10-14 20:27:42 | 只看该作者
本帖最后由 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,没办法给建议,你设置好了不妨在这里分享一下。

点评

时隔多年再来寻找这段指导,再次感谢大大 目前的本本和台式老机安装deepin和mint已经可以自动安装显卡等驱动,完美支持 目前还是多系统,win10+win8.1VHD+linux, 为了一级菜单多系统启动,再次寻找大大这段回  详情 回复 发表于 2023-4-10 21:27
今天在虚拟机操作,cfg文件改了boot7.efi, BCD也放在C盘的 \Windows\Boot\EFI\ 文件夹 开机还是提示找不到BCD 这是什么情况呢? 其他启动文件用的是你的三分区U盘的grub2  详情 回复 发表于 2019-11-8 09:42
不要忘了每个windows分区都要配置一个bcd文件,就放在各自的 \Windows\Boot\EFI\ 文件夹 我觉得还是应该放在EFI区,系统分区经常重装再搞BCD麻烦 我觉得应该像你之前思路启动文件统一放在EFI区, 各自系统盘怎  详情 回复 发表于 2019-10-15 08:41
对头,就是这样,你厉害 我刚好看到这边文章“bootmgfw.efi 任意存放 , 引導不同的 BCD” 但是你更厉害,bootmgfw.efi 这个文件还能改名  详情 回复 发表于 2019-10-14 20:53
回复

使用道具 举报

76#
发表于 2019-10-14 20:12:04 | 只看该作者
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,只是初步想法,
回复

使用道具 举报

75#
 楼主| 发表于 2019-10-14 18:02:26 | 只看该作者
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
}

点评

是这样吗?我以为他的 set root='(hd0,gpt2)' 是指定启动分区呢? 我以后将说分区:EFI,win7,win8,win10,DEEPIN,。。 然后用 set root='(hd0,gpt2)' 这样来指定启动不同系统。 ============ 如果我想  详情 回复 发表于 2019-10-14 20:12
回复

使用道具 举报

74#
发表于 2019-10-14 15:20:08 | 只看该作者
本帖最后由 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吧
回复

使用道具 举报

73#
发表于 2019-10-14 14:06:00 | 只看该作者
hilsonma 发表于 2019-10-14 10:47
是的,本贴所表述的定制其实就两段代码,一段是编译生成efi文件,一段是编辑配置文件。你可以回头再仔 ...

谢谢你

开始安装虚拟机,准备学习GRUB2
也是想每个文件夹一个启动
回复

使用道具 举报

72#
 楼主| 发表于 2019-10-14 10:47:29 | 只看该作者
本帖最后由 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平台。

点评

谢谢你 开始安装虚拟机,准备学习GRUB2 也是想每个文件夹一个启动  详情 回复 发表于 2019-10-14 14:06
回复

使用道具 举报

71#
发表于 2019-10-14 09:11:58 | 只看该作者
hilsonma 发表于 2019-10-14 05:20
grub2引导到命令行是因为默认路径找不到grub.cfg
grub.cfg的位置与grubx64.efi的位置无关,是在编译grub ...

原来的grubx64.EFI还可以在编译来修改grub.cfg文件的位置吗?
回复

使用道具 举报

70#
 楼主| 发表于 2019-10-14 05:44:56 | 只看该作者
本帖最后由 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会更灵活。
回复

使用道具 举报

69#
 楼主| 发表于 2019-10-14 05:20:41 | 只看该作者
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放到这个位置就会起作用,不再是直接进入命令行。

点评

原来的grubx64.EFI还可以在编译来修改grub.cfg文件的位置吗?  详情 回复 发表于 2019-10-14 09:11
回复

使用道具 举报

68#
发表于 2019-10-13 18:50:08 | 只看该作者
这两天增加凤凰Os
然后发现grubx64.efi启动需要的grub。cfg是需要放在boot里面
但是深度自己的shimx64.efi的cfg确实放在自己文件夹,就是shimx64.efi和grub.cfg是一起放在deepin文件夹的,是不是这个文件修改过啊?
我后来自己建立一个凤凰文件夹,用深度的shimx64.efi和凤凰的cfg,可以启动凤凰的os

呵呵呵

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

使用道具 举报

67#
发表于 2019-10-13 16:36:41 | 只看该作者
谢谢,收藏测试
回复

使用道具 举报

66#
发表于 2019-10-13 16:07:52 | 只看该作者
大大在吗?我用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菜单了
回复

使用道具 举报

65#
发表于 2019-10-11 22:03:48 | 只看该作者
先收藏,慢慢消化
回复

使用道具 举报

64#
 楼主| 发表于 2019-10-1 11:00:21 | 只看该作者
本帖最后由 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.
回复

使用道具 举报

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

请教一下,是不是vhd也不能引导?

点评

是的,vhd也不能在自动菜单中一键引导,只能每个vhd都设置用bootmgfw.efi+bcd 引导。 目前自动菜单一键引导的镜像文件就只有wim文件。  详情 回复 发表于 2019-10-1 11:00
回复

使用道具 举报

62#
 楼主| 发表于 2019-9-29 21:20:59 | 只看该作者
本帖最后由 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下直接引导。

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

点评

请教一下,是不是vhd也不能引导?  详情 回复 发表于 2019-10-1 06:17
回复

使用道具 举报

61#
发表于 2019-9-29 19:50:37 | 只看该作者
楼主你好,我下载了你那个uboot测试,那个把所有PE放到pe文件夹,自动加载菜单太好用了,可是我测试以前一直正常的几个PE,很多都启动不了,只有其中一个可以成功,哎,是什么原因啊?其它我只想要在我现在的GRUB2的基础上添加那个微软认证。有没有简单的方法?

点评

[attachimg]401917[/attachimg]  详情 回复 发表于 2019-9-29 21:20
回复

使用道具 举报

60#
发表于 2019-9-25 11:29:09 | 只看该作者
谢谢楼主的分享,学习中
回复

使用道具 举报

59#
发表于 2019-8-25 19:32:39 | 只看该作者
1
回复

使用道具 举报

58#
发表于 2019-8-23 22:00:31 | 只看该作者

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

使用道具 举报

57#
发表于 2019-8-23 21:06:25 | 只看该作者

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

使用道具 举报

56#
发表于 2019-8-23 10:45:58 | 只看该作者

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

使用道具 举报

55#
发表于 2019-8-23 09:58:42 | 只看该作者
hilsonma 发表于 2019-8-23 09:40
我也不懂。
你可以尝试自己排查
先用最基本的参数试试

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

使用道具 举报

54#
 楼主| 发表于 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
回复

使用道具 举报

53#
发表于 2019-8-23 09:08:25 | 只看该作者
请问楼主,运行build_grub.bat,编译grubx64.efi时出现错误:
grub-mkimage.exe: error: relocation 0x4 is not implemented yet.

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

使用道具 举报

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

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

使用道具 举报

51#
发表于 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;
}

回复

使用道具 举报

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

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

使用道具 举报

49#
发表于 2019-8-15 21:46:43 | 只看该作者
hilsonma 发表于 2019-8-15 18:06
如果你定制时使用的参数是 -p /efi/grub
那么你修改 /efi/grub/grub.cfg 你的配置就会生效。
如果你 ...

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-7 08:04

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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