无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
楼主: hilsonma

[分享] 将grub2启动模板封装成efi单文件

  [复制链接]
发表于 2020-5-28 21:26:11 | 显示全部楼层
谢谢分享。
可以把grubfm.efi打包进去,在geub.cfg中作为一个菜单项运行吗?

点评

可以,但是似乎没必要。grubfm本身可以加载外部菜单,想要全内置,可以直接改grubfm源码生成efi。  详情 回复 发表于 2020-5-28 21:30
回复

使用道具 举报

发表于 2020-5-28 21:30:26 | 显示全部楼层
pseudo 发表于 2020-5-28 21:26
谢谢分享。
可以把grubfm.efi打包进去,在geub.cfg中作为一个菜单项运行吗?

可以,但是似乎没必要。grubfm本身可以加载外部菜单,想要全内置,可以直接改grubfm源码生成efi。

点评

试了一下没成功,不知道是哪里弄错。 我用楼主模板,grub文件夹下只放grub.cfg和grubfmx64.efi(5月14日)两个文件。grub.cfg内容为: menuentry "grubfm" { ls (loop)/boot/grub/; chainloader (loop)/boot  详情 回复 发表于 2020-5-28 22:39
回复

使用道具 举报

发表于 2020-5-28 22:39:32 | 显示全部楼层
wintoflash 发表于 2020-5-28 21:30
可以,但是似乎没必要。grubfm本身可以加载外部菜单,想要全内置,可以直接改grubfm源码生成efi。

试了一下没成功,不知道是哪里弄错。

我用楼主模板,grub文件夹下只放grub.cfg和grubfmx64.efi(5月14日)两个文件。grub.cfg内容为:
menuentry "grubfm" {
ls (loop)/boot/grub/;
chainloader (loop)/boot/grub/grubfmx64.efi;
}
结果两个文件可见,但.efi运行不了:
1.png

点评

启动 EFI 应用需要向其传递该应用的设备路径。(memdisk)是一个不存在的设备,传递空的设备路径很有可能出问题。  详情 回复 发表于 2020-5-29 08:05
grubfmx64.efi本身就是这样打包生成的,不建议二次打包。有需要的,可以直接改grubfm源码再打包生成efi.  详情 回复 发表于 2020-5-29 07:12
回复

使用道具 举报

 楼主| 发表于 2020-5-29 07:12:29 | 显示全部楼层
pseudo 发表于 2020-5-28 22:39
试了一下没成功,不知道是哪里弄错。

我用楼主模板,grub文件夹下只放grub.cfg和grubfmx64.efi(5月14 ...

grubfmx64.efi本身就是这样打包生成的,不建议二次打包。有需要的,可以直接改grubfm源码再打包生成efi.
回复

使用道具 举报

发表于 2020-5-29 08:05:50 | 显示全部楼层
pseudo 发表于 2020-5-28 22:39
试了一下没成功,不知道是哪里弄错。

我用楼主模板,grub文件夹下只放grub.cfg和grubfmx64.efi(5月14 ...

启动 EFI 应用需要向其传递该应用的设备路径。(memdisk)是一个不存在的设备,传递空的设备路径很有可能出问题。
而且你这样玩俄罗斯套娃是何苦呢。

点评

1、grubfm有通用的优点,所以菜单里必备;grubfm有通用的缺点,要启动指定文件每次还需要一番选择,不能直达(也许grubfm有命令行方式可以直达?) 2、完全取代grub2命令,所有功能都由grubfm出发,毕竟还不方便。  详情 回复 发表于 2020-5-29 11:54
回复

使用道具 举报

发表于 2020-5-29 11:54:46 | 显示全部楼层
wintoflash 发表于 2020-5-29 08:05
启动 EFI 应用需要向其传递该应用的设备路径。(memdisk)是一个不存在的设备,传递空的设备路径很有可能出 ...

1、grubfm有通用的优点,所以菜单里必备;grubfm有通用的缺点,要启动指定文件每次还需要一番选择,不能直达(也许grubfm有命令行方式可以直达?)
2、完全取代grub2命令,所有功能都由grubfm出发,毕竟还不方便。所以,不想把grubfmx64.efi直接作为bootx64.efi加载,只想把grubfm作为楼主菜单的一项,菜单还需要有其它菜单项。
3、把grubfmx64.efi放在U盘,菜单里调用它不成问题。现在追求清爽,要求把grubfm功能(不管是什么后缀,不管多少个文件)打包内置于bootx64.efi,问题来了。这个问题只有改源码才能解决么?
4、grub2启动grubfmx64.efi时,如何简单地传递一个设备路径?试过先search -f -s /efi/pe.wim把当前路径设为U盘,并无效果。

点评

可以不动源码,魔改一下 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=420722&extra=page%3D1 我刚才改的时候倒也遇到过这个root设备不正确启不来efi的的问题  详情 回复 发表于 2020-5-29 15:41
更新了一下,现在如果 EFI 文件位于不存在的磁盘上,会传递 root 设备的路径。 但是,我仍然不建议这种俄罗斯套娃的做法。 EFI 文件本来就应该放在固件能够认得到的硬盘上,否则在运行的过程中也可能会出问题。  详情 回复 发表于 2020-5-29 14:57
回复

使用道具 举报

发表于 2020-5-29 14:57:24 | 显示全部楼层
pseudo 发表于 2020-5-29 11:54
1、grubfm有通用的优点,所以菜单里必备;grubfm有通用的缺点,要启动指定文件每次还需要一番选择,不能 ...

更新了一下,现在如果 EFI 文件位于不存在的磁盘上,会传递 root 设备的路径。

但是,我仍然不建议这种俄罗斯套娃的做法。
EFI 文件本来就应该放在固件能够认得到的硬盘上,否则在运行的过程中也可能会出问题。
你可以创建一个 img,把 efi 文件放里面,用 map 命令启动。这种虚拟盘是固件认可的。

要启动指定文件每次还需要一番选择,不能直达(也许grubfm有命令行方式可以直达?)
完全取代grub2命令,所有功能都由grubfm出发,毕竟还不方便。所以,不想把grubfmx64.efi直接作为bootx64.efi加载,只想把grubfm作为楼主菜单的一项,菜单还需要有其它菜单项。


把所有东西都集成到一个文件里面,想修改也不方便。
不如直接修改 grub2-filemanager 本身。基本上都是 grub 菜单,没什么神秘的。

点评

谢谢!更新后可以了。 另外遇到一个问题:wimboot可以启动(hd1)/pe.wim,即ud里的wim。uefi启动时,pe是否藏入ud都随意。而ntboot则报错: this command is available only for disk devices. 感觉是ntboot作了  详情 回复 发表于 2020-5-31 09:23
回复

使用道具 举报

发表于 2020-5-29 15:41:10 | 显示全部楼层
pseudo 发表于 2020-5-29 11:54
1、grubfm有通用的优点,所以菜单里必备;grubfm有通用的缺点,要启动指定文件每次还需要一番选择,不能 ...

可以不动源码,魔改一下
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
我刚才改的时候倒也遇到过这个root设备不正确启不来efi的的问题

点评

效果看来不错。四教程还要慢慢理解。  详情 回复 发表于 2020-5-31 09:25
回复

使用道具 举报

发表于 2020-5-31 09:23:38 | 显示全部楼层
wintoflash 发表于 2020-5-29 14:57
更新了一下,现在如果 EFI 文件位于不存在的磁盘上,会传递 root 设备的路径。

但是,我仍然不建议这 ...

谢谢!更新后可以了。

另外遇到一个问题:wimboot可以启动(hd1)/pe.wim,即ud里的wim。uefi启动时,pe是否藏入ud都随意。而ntboot则报错:
this command is available only for disk devices.
感觉是ntboot作了限制,其实对此情形可以放宽。

点评

这不是程序做出的限制,而是 ntboot 本身的局限。 你没有用 grub4dos ntboot 启动过 ud 区里面的 wim 吧。  详情 回复 发表于 2020-5-31 09:50
回复

使用道具 举报

发表于 2020-5-31 09:25:50 | 显示全部楼层
江南一根葱 发表于 2020-5-29 15:41
可以不动源码,魔改一下
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=420722&extra=pa ...

效果看来不错。四教程还要慢慢理解。
回复

使用道具 举报

发表于 2020-5-31 09:50:01 | 显示全部楼层
本帖最后由 wintoflash 于 2020-5-31 09:55 编辑
pseudo 发表于 2020-5-31 09:23
谢谢!更新后可以了。

另外遇到一个问题:wimboot可以启动(hd1)/pe.wim,即ud里的wim。uefi启动时,pe ...

这不是程序做出的限制,而是 ntboot 本身的局限。
你没有用 grub4dos ntboot 启动过 ud 区里面的 wim 吧。
Screenshot_20200531_095454.png

点评

谢谢,明白了,看来要改ntboot才行,暂时先用wimboot吧。  详情 回复 发表于 2020-6-2 11:38
回复

使用道具 举报

发表于 2020-6-2 11:38:52 | 显示全部楼层
wintoflash 发表于 2020-5-31 09:50
这不是程序做出的限制,而是 ntboot 本身的局限。
你没有用 grub4dos ntboot 启动过 ud 区里面的 wim 吧 ...

谢谢,明白了,看来要改ntboot才行,暂时先用wimboot吧。
回复

使用道具 举报

发表于 2020-6-2 11:42:15 | 显示全部楼层
楼主的模板不错,谢谢分享。
试着简化一下:http://bbs.wuyou.net/forum.php?m ... &fromuid=195661
回复

使用道具 举报

发表于 2020-6-26 19:04:09 | 显示全部楼层
请教楼主,pre.cfg里,能用if语句吗?

点评

可以的。  详情 回复 发表于 2020-6-26 19:37
回复

使用道具 举报

 楼主| 发表于 2020-6-26 19:37:54 | 显示全部楼层
本帖最后由 hilsonma 于 2020-6-27 10:19 编辑
pseudo 发表于 2020-6-26 19:04
请教楼主,pre.cfg里,能用if语句吗?

可以的。

更正:抱歉。我没有试过,因为官方文档有这样的例子,所以我就说是可以的。经wintoflash指正,我进行了测试,没有进入normal 之前使用if是无效的,提示Unkown command

你还是在grub.cfg中做各种设置吧,里面也可以设置使用其他设置档的,包括其他位置上的grub.cfg

在这个封装方案中,主配置是 (loop)/boot/grub/grub.cfg,你可以在主配置中设置有 /EFI/grub/grub.cfg 就使用 /EFI/grub/grub.cfg 等等。
pre.cfg越简单越好。
回复

使用道具 举报

发表于 2020-6-26 21:27:38 | 显示全部楼层
可是,我把楼主pre.cfg中第一行
loopback loop (memdisk)/memdisk.cpio.gz
改成这样:
if [ 1 == 1 ]; then loopback loop (memdisk)/memdisk.cpio.gz; fi
就不灵了,是哪里出了问题?

点评

不是应该if [ "1"= "1" ]; 么,不过这个1=1是什么东东  详情 回复 发表于 2020-6-26 22:04
回复

使用道具 举报

发表于 2020-6-26 22:04:20 | 显示全部楼层
pseudo 发表于 2020-6-26 21:27
可是,我把楼主pre.cfg中第一行
loopback loop (memdisk)/memdisk.cpio.gz
改成这样:

不是应该if [ "1"= "1" ]; 么,不过这个1=1是什么东东

点评

也不行。 在grub提示符下试好的if语句放到pre.cfg里就不行,导致菜单出不来了。  详情 回复 发表于 2020-6-26 23:43
回复

使用道具 举报

发表于 2020-6-26 23:43:09 | 显示全部楼层
江南一根葱 发表于 2020-6-26 22:04
不是应该if [ "1"= "1" ]; 么,不过这个1=1是什么东东

也不行。
在grub提示符下试好的if语句放到pre.cfg里就不行,导致菜单出不来了。

点评

看样子你是想在嵌入grub的配置里面用if。 这不行。 只有进入normal环境后才能用if then function while return 等流程控制语句,在这之前是rescue环境,只支持简单语句。  详情 回复 发表于 2020-6-27 06:30
你的 grub提示符下 需要是你制作生成的efi文件的命令行,这样你就会知道是不是少了模块 你检查一下是不是你制作efi文件的模块列表中没有 test 模块 pre.cfg 主要是为了解决 root 和 prefix 这两个变量而存在,只  详情 回复 发表于 2020-6-27 00:56
回复

使用道具 举报

 楼主| 发表于 2020-6-27 00:56:34 | 显示全部楼层
pseudo 发表于 2020-6-26 23:43
也不行。
在grub提示符下试好的if语句放到pre.cfg里就不行,导致菜单出不来了。

你的 grub提示符下 需要是你制作生成的efi文件的命令行,这样你就会知道是不是少了模块
你检查一下是不是你制作efi文件的模块列表中没有 test 模块

pre.cfg 主要是为了解决 root 和 prefix 这两个变量而存在,只要能找到 $prefix/grub.cfg 或者你的主配置文件,其他配置应该放到主配置文件 ($prefix/grub.cfg) 中。grub在执行了 pre.cfg 后会加载 normal 模块并使用主配置文件 $prefix/grub.cfg

所以我把这个文件命名为pre.cfg,中文我把它叫预配置文件。在官方文档中叫嵌入式配置文件。
http://www.gnu.org/software/grub ... edded-configuration

尽量不要在这个文件做文章,这个文件是为了找到你的配置文件而存在。
回复

使用道具 举报

发表于 2020-6-27 06:30:18 | 显示全部楼层
pseudo 发表于 2020-6-26 23:43
也不行。
在grub提示符下试好的if语句放到pre.cfg里就不行,导致菜单出不来了。

看样子你是想在嵌入grub的配置里面用if。
这不行。
只有进入normal环境后才能用if then function while return 等流程控制语句,在这之前是rescue环境,只支持简单语句。

点评

你的解说更容易理解。 但是官方的说明是怎么回事呢?是不是官方说明错了? [attachimg]460327[/attachimg] 因为我没有需求,所以没有特意去试过。  详情 回复 发表于 2020-6-27 07:12
回复

使用道具 举报

 楼主| 发表于 2020-6-27 07:12:26 | 显示全部楼层
本帖最后由 hilsonma 于 2020-6-27 07:21 编辑
wintoflash 发表于 2020-6-27 06:30
看样子你是想在嵌入grub的配置里面用if。
这不行。
只有进入normal环境后才能用if then function while ...

你的解说是容易理解。
只是官方的说明好象不一样。
sshot-24.jpg

因为我没有需求,所以没有特意去试过if。
loopback 是需要loopback模块的,估计在rescue下不能用(我没有试过),但我们可以在嵌入配置中使用。

点评

你试试不就知道了吗。反正我和官方,总有一个错的。 你试试不就知道了吗。rescue 下什么命令都可以使用。 但是 if else while 这些不是命令。  详情 回复 发表于 2020-6-27 08:03
回复

使用道具 举报

发表于 2020-6-27 08:03:43 | 显示全部楼层
hilsonma 发表于 2020-6-27 07:12
你的解说是容易理解。
只是官方的说明好象不一样。
因为我没有需求,所以没有特意去试过if。

你试试不就知道了吗。反正我和官方,总有一个错的。
  1. loopback 是需要loopback模块的,估计在rescue下不能用(我没有试过)
复制代码

你试试不就知道了吗。rescue 下什么命令都可以使用。
但是 if else while 这些不是命令。

点评

试了,官方错的。 没进入normal之前使用if 会提示 Unknown command 'if'. 其他命令照执行。  详情 回复 发表于 2020-6-27 10:03
回复

使用道具 举报

 楼主| 发表于 2020-6-27 10:03:34 | 显示全部楼层
wintoflash 发表于 2020-6-27 08:03
你试试不就知道了吗。反正我和官方,总有一个错的。

你试试不就知道了吗。rescue 下什么命令都可以 ...

试了,官方错的。
没进入normal之前使用if 会提示 Unknown command 'if'.
其他命令照执行。
回复

使用道具 举报

发表于 2020-6-27 11:33:19 | 显示全部楼层
明白了,谢谢诸位。
既然不支持,那就用别的方式解决吧。

回复

使用道具 举报

发表于 2020-7-4 19:34:21 | 显示全部楼层
欢迎测试新版 wimboot 和 ntboot :http://bbs.wuyou.net/forum.php?m ... 545&pid=4097585

现在wimboot 和 ntboot 都可以自己生成 bcd 和 boot.sdi 了,不再需要自己准备这两个文件。另外还可以调整bcd的多种选项。

点评

已试,OK. http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=417545&pid=4097804&fromuid=586362  详情 回复 发表于 2020-7-5 06:04

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5 兄弟对grub2添加的好功能不少呀。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2020-7-5 06:04:42 | 显示全部楼层
wintoflash 发表于 2020-7-4 19:34
欢迎测试新版 wimboot 和 ntboot :http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=41754 ...

已试,OK.
http://bbs.wuyou.net/forum.php?m ... &fromuid=586362
回复

使用道具 举报

发表于 2020-7-30 23:01:54 | 显示全部楼层
需要学习的东西太多了
回复

使用道具 举报

发表于 2020-8-1 19:15:46 | 显示全部楼层
学习中
回复

使用道具 举报

发表于 2020-10-3 11:18:21 | 显示全部楼层
大神,我想问问启动后那个memdisk和loop的目录能隐藏吗?

点评

如果你是使用了类似grubfm这样的应用,想在其中隐藏这类设备,可以修改grubfm这个应用本身的代码。 例如本贴模板中我是在runseek自定义命令中实现自动菜单的,想要不显示这类设备,需要修改runseek这个自定义命令  详情 回复 发表于 2020-10-3 16:57
回复

使用道具 举报

 楼主| 发表于 2020-10-3 16:57:17 | 显示全部楼层
本帖最后由 hilsonma 于 2020-10-3 17:14 编辑
yuaie 发表于 2020-10-3 11:18
大神,我想问问启动后那个memdisk和loop的目录能隐藏吗?

本贴模板中我是在runseek自定义命令中实现自动菜单的,想要不显示这类设备,需要修改runseek这个自定义命令。

可以参考wintoflash的grubfm示例,其中有隐藏这类设备的例子。(代码第39行和第43行)
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2021-3-3 10:27

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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