无忧启动论坛

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

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

  [复制链接]
跳转到指定楼层
1#
发表于 2020-1-18 17:17:05 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 hilsonma 于 2020-3-9 12:10 编辑

20200308更新:感谢 nivigo 的分享,让我实现了在Windows下的封装,不需要linux环境封装,参见 windows下的封装

详细讲解请参看以下20200308更新前的内容:

附件是一个封装模板,里面是一个linux脚本build.sh 和一个文件夹build
build文件夹里有2个文件和一个文件夹
这两个文件一个是启动模板使用到的模块清单mod.txt ,一个是预配置文件pre.cfg
文件夹boot下有子文件夹grub,grub文件夹内是我的启动模板的整套文件

efi单文件封装模板.7z (568.45 KB, 下载次数: 1211)
efi单文件封装模板.7z
|
|-- build.sh
|-+ build
|------ pre.cfg
|------ mod.txt
|-----+ boot
|---------+ grub
|-------------- grub.cfg
|-------------+ run
|------------------ run.cfg
|------------------ rundir.cfg
|------------------ runseek.cfg
|-----------------+ ms
|---------------------- boot.sdi
|---------------------- bootmgfw.efi

下载模板解压放到grub2文件夹
将 build/boot/grub 里的内容清空,换上你自己的启动模板的整套文件
按你的启动模板用到的模块来修改模块清单文件 build/mod.txt
    注意有6个模块是本封装模式要用到的:cpio gzio loopback lzopio memdisk newc
    这6个模块不能缺少
进入linux系统,在linux系统中执行build.sh 就会生成 bootx64.efi .


感谢wintoflash,是他的指导和分享的源码让我学会了这个封装方法。
同时感谢江南一根葱,在学习这个方法之前就已经得到他的指点,知道了方向。

--------------------------------------------------------------------------------------------------------------------
如果电脑没有安装linux系统,可以到这里下载porteus绿色免安装版
将porteus文件夹提取放到任一分区根目录,将其中的porteus.cfg放到自动菜单目录,就可以在自动菜单中选择启动

--------------------------------------------------------------------------------------------------------------------
脚本解读:

#!/usr/bin/env sh
#  指明脚本解释器

cd build
#  进入 build目录

find ./boot | cpio -o -H newc | gzip -9 > ./memdisk.cpio.gz
#  搜索boot目录 以newc格式归档 最大压缩 生成压缩文件memdisk.cpio.gz

find ./memdisk.cpio.gz | cpio -o -H newc > ./memdisk.cpio
#  搜索memdisk.cpio.gz文件 以newc格式归档 生成归档文件 memdisk.cpio

cd ..
#  返回上一层目录

modules=$(cat build/mod.txt)
#  将模块清单文件mod.txt 的内容设为变量modules

grub-mkimage -O x86_64-efi -d x86_64-efi -m build/memdisk.cpio -c build/pre.cfg -o bootx64.efi $modules
#  定制efi文件  64位efi格式  使用x86_64-efi中的模块  使用内存盘其中载入build/memdisk.cpio归档的内容
#              使用预配置文件build/pre.cfg  生成文件名为bootx64.efi  包含模块如变量modules的内容

--------------------------------------------------------------------------------------------------------------------
使用内存盘参数定制时会默认-p (memdisk)/boot/grub
由于使用了压缩,内存盘memdisk中是压缩文件,不是直接的配置文件,所以要使用预配置文件进行预配置

pre.cfg预配置文件解读:

loopback loop (memdisk)/memdisk.cpio.gz
# 将内存盘的压缩文件(memdisk)/memdisk.cpio.gz挂载为虚拟盘loop

set root=loop
# 将loop设为root

set prefix=($root)/boot/grub
# 将(loop)/boot/grub设为安装目录(配置目录)
# 这样grub2启动时就会使用(loop)/boot/grub/grub.cfg进行配置
# 所以启动模板的主程序需要命名为grub.cfg

--------------------------------------------------------------------------------------------------------------------
使用举例:
比如wintoflash的run源码,改用这个模板封装

先将build/boot/grub 里的内容清空
再将run源码里run.tar\boot\grub\ 目录下的所有内容提取到 build/boot/grub
    将主程序init.sh改名为grub.cfg
    这个封装模板使用grub.cfg作为主程序名,要不然就要修改预配置文件
将run源码里run.tar\arch\x64\builtin.txt的内容覆盖到 build/mod.txt
    源码中模块清单文件里的模块是齐全的,如果是自己的模板要注意包含上面说的6个模块。
在linux环境下执行build.sh

这样就生成了bootx64.efi,可以直接使用,也可以改回原本的程序名run.efi 在其他efi中调用,按需要加上参数。

点评

大大是高手666666  发表于 2020-3-31 07:12

评分

参与人数 6无忧币 +26 收起 理由
wuxin9712 + 5
szmsys + 5 赞一个!
某些人 + 5 赞一个!
minmax + 1 很给力!
yaojy + 5 很给力!
879792799 + 5 很给力!

查看全部评分

185#
发表于 3 天前 | 只看该作者
顶顶就有豆子
回复

使用道具 举报

184#
发表于 2024-2-9 21:27:22 | 只看该作者
學習了,理解中,感謝分享!
回复

使用道具 举报

183#
 楼主| 发表于 2023-10-25 15:47:01 | 只看该作者
rbwrbw 发表于 2023-10-24 12:15
mod 是什么类型的文件???

是模块文件(MODule)
回复

使用道具 举报

182#
发表于 2023-10-24 12:15:47 | 只看该作者
mod 是什么类型的文件???

点评

是模块文件(MODule)  详情 回复 发表于 2023-10-25 15:47
回复

使用道具 举报

181#
发表于 2023-10-24 12:08:17 | 只看该作者
谢谢分享,可以从底层学习 封装经历!!!!
回复

使用道具 举报

180#
发表于 2023-10-24 11:51:02 | 只看该作者
回复

使用道具 举报

179#
发表于 2023-4-4 11:09:00 | 只看该作者
正好需要这方面的,谢谢分享!
回复

使用道具 举报

178#
 楼主| 发表于 2022-11-13 23:04:15 | 只看该作者
青青草 发表于 2022-11-13 17:34
我就是从1楼那个链接中下载的

对比看看你的路径有没有问题


回复

使用道具 举报

177#
发表于 2022-11-13 17:34:37 | 只看该作者
hilsonma 发表于 2022-11-13 12:53
我刚才重启试了一下,我的电脑上是可以的
你可以到1楼我那个链接中下载我使用的这个porteus来试一试。
...

我就是从1楼那个链接中下载的

点评

对比看看你的路径有没有问题 [attachimg]512282[/attachimg]  详情 回复 发表于 2022-11-13 23:04
回复

使用道具 举报

176#
 楼主| 发表于 2022-11-13 12:53:59 | 只看该作者
青青草 发表于 2022-11-13 12:32
用wintoflash的grub2文件管理器,找到porteus.cfg,作为grub2菜单打开。结果不行。

我刚才重启试了一下,我的电脑上是可以的
你可以到1楼我那个链接中下载我使用的这个porteus来试一试。
不同的版本有可能引导方法不一样。

点评

我就是从1楼那个链接中下载的  详情 回复 发表于 2022-11-13 17:34
回复

使用道具 举报

175#
发表于 2022-11-13 12:32:45 | 只看该作者
hilsonma 发表于 2022-11-13 11:59
要看你下载的porteus,我手上有个是这样启动的:
search -n -s -f /porteus/vmlinuz
linux /porteus/vm ...

用wintoflash的grub2文件管理器,找到porteus.cfg,作为grub2菜单打开。结果不行。

点评

我刚才重启试了一下,我的电脑上是可以的 你可以到1楼我那个链接中下载我使用的这个porteus来试一试。 不同的版本有可能引导方法不一样。  详情 回复 发表于 2022-11-13 12:53
回复

使用道具 举报

174#
 楼主| 发表于 2022-11-13 11:59:13 | 只看该作者
本帖最后由 hilsonma 于 2022-11-13 12:00 编辑
青青草 发表于 2022-11-11 10:06
将其中的porteus.cfg放到自动菜单目录,就可以在自动菜单中选择启动

——我对porteus,纯属外行。如何启 ...

要看你下载的porteus,我手上有个是这样启动的:
search -n -s -f /porteus/vmlinuz
linux /porteus/vmlinuz norootcopy nomagic
initrd /porteus/initrd.xz

把这三行放到 porteus.cfg 中,就可以在自动菜单中选择 porteus.cfg 来启动了

点评

用wintoflash的grub2文件管理器,找到porteus.cfg,作为grub2菜单打开。结果不行。  详情 回复 发表于 2022-11-13 12:32
回复

使用道具 举报

173#
发表于 2022-11-11 10:06:46 | 只看该作者
将其中的porteus.cfg放到自动菜单目录,就可以在自动菜单中选择启动

——我对porteus,纯属外行。如何启动porteus,能否详细些?

点评

要看你下载的porteus,我手上有个是这样启动的: search -n -s -f /porteus/vmlinuz linux /porteus/vmlinuz norootcopy nomagic initrd /porteus/initrd.xz  详情 回复 发表于 2022-11-13 11:59
回复

使用道具 举报

172#
发表于 2022-10-14 16:57:46 | 只看该作者
看看这个帖子,学习如何将grub2封装成efi单文件啊
回复

使用道具 举报

171#
发表于 2022-10-6 13:45:14 | 只看该作者
感谢分享
回复

使用道具 举报

170#
发表于 2022-7-18 19:06:33 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

169#
发表于 2022-4-12 21:07:45 | 只看该作者
感谢楼主分享
回复

使用道具 举报

168#
发表于 2022-2-19 20:06:08 | 只看该作者
问题 像是 解决了:

手动(定置),不支持的压缩的   ,(想用压缩的:要用 修改版 grub205)

定置时,理清 两个变量的 形成方法 (下图为 示例:具体 实践出真知)

点评

好的  发表于 2023-10-24 12:06
回复

使用道具 举报

167#
发表于 2022-2-19 13:42:09 | 只看该作者
谢谢大师的回复!cpio gzio loopback lzopio memdisk newc 封装在内是必须的,否则未经 gz 压缩的.efi 单文件也不会成功启动。

目前求解的关键是 memdisk.cpio.gz 如何通过 gzio.mod lzopio.mod 解压转为 memdisk.cpio,然后
loopback loop (memdisk)/memdisk.cpio
set prefix=(loop)/boot/grub
回复

使用道具 举报

166#
发表于 2022-2-19 08:22:05 | 只看该作者
2011yfrui 发表于 2022-2-18 15:17
补充:在GRUB_v2.04 或 GRUB_v2.06,设置
--memdisk=memdisk.cpio(未经过 gz 压缩)

官方版 GRUB2 不支持压缩的 memdisk 和 loopback 盘。
回复

使用道具 举报

165#
 楼主| 发表于 2022-2-19 01:55:49 | 只看该作者
2011yfrui 发表于 2022-2-18 10:02
hilsonma 老师:你好!
你的文章很受益!我在 efi 系统上试了GRUB_v2.04和GRUB_v2.06俩个版本,按照文章中 ...

注意有6个模块是本封装模式要用到的:cpio gzio loopback lzopio memdisk newc
这6个模块不能缺少
回复

使用道具 举报

164#
发表于 2022-2-18 15:17:06 | 只看该作者
补充:在GRUB_v2.04 或 GRUB_v2.06,设置
--memdisk=memdisk.cpio(未经过 gz 压缩)

--config=build\pre.cfg
loopback memdisk /path/to/memdisk.cpio(未经过 gz 压缩)
set prex=(memdisk)/boot/grub
或干脆不设置--config

都会成功生成所需要的efi单文件。
一旦 gz 压缩 后设置
--memdisk=memdisk.cpio(经过 gz 压缩)
--config=build\pre.cfg
loopback loop (memdisk)/memdisk.cpio.gz
set root=loop
set prefix=($root)/boot/grub

生成的efi单文件启动后报错:未知的文件系统.
请大师出手相助求解!提前谢谢!

点评

官方版 GRUB2 不支持压缩的 memdisk 和 loopback 盘。  详情 回复 发表于 2022-2-19 08:22
回复

使用道具 举报

163#
发表于 2022-2-18 10:02:12 | 只看该作者
hilsonma 老师:你好!
你的文章很受益!我在 efi 系统上试了GRUB_v2.04和GRUB_v2.06俩个版本,按照文章中的方法都没有成功。
loopback loop (memdisk)/memdisk.cpio.gz
显示未知的文件系统。
我也注意到GRUB_v2.04和GRUB_v2.06这俩个版本,没有 map.mod fb.mod 等模块。
针对 memdisk.cpio.gz 装入.efi 文件,欢迎各位高手提出解决方法!

点评

注意有6个模块是本封装模式要用到的:cpio gzio loopback lzopio memdisk newc 这6个模块不能缺少  详情 回复 发表于 2022-2-19 01:55
回复

使用道具 举报

162#
发表于 2022-1-13 13:20:01 | 只看该作者
感谢大佬分享,正好是我需要的
回复

使用道具 举报

161#
发表于 2022-1-12 21:36:29 来自手机 | 只看该作者
大大越来越厉害了!期待新成果
回复

使用道具 举报

160#
发表于 2022-1-9 17:26:18 | 只看该作者

感谢分享!
回复

使用道具 举报

159#
 楼主| 发表于 2021-2-17 15:27:16 | 只看该作者
AndyChen 发表于 2021-2-17 11:45
source $prefix/run/run.cfg

function AndyChen {run /WIN10_A_CHILD.VHDX;}

function AndyChen {run /WIN10_A_CHILD.VHDX;}
建议命令名改为小写并缩短,如
function andy {run /WIN10_A_CHILD.VHDX;}

function PE {run /W10PE64.WIM;}
同样建议命令名改为小写

default=0
这一句本身是默认的,不需要,只有默认不是0时才需要
所以我们只要将默认项放到第一位就可以了,不需要这一句

ntboot /VHD/WIN10_B_CHILD1.VHDX
不能将xntboot改成ntboot,因为xntboot是自定义命令,是添加了参数的ntboot,如果改成ntboot就需要添加相应的参数

elif search -n -s -f /VHD/CHILD.2; then
在判断使用哪一个副本时,存在CHILD.2就使用副本2,不存在CHILD.2就不需找CHILD.1了,直接找副本1并启动,所以并不是两个标志文件都要找的,找其中一个就可以了。我们始终是使用同一个标志文件,只是通过将标志文件改名来达到启动不同副本的目的。

评分

参与人数 1无忧币 +5 收起 理由
AndyChen + 5 很给力!

查看全部评分

回复

使用道具 举报

158#
 楼主| 发表于 2021-2-17 15:04:30 | 只看该作者
AndyChen 发表于 2021-2-17 11:49
是 xntboot,还是 ntboot ?

是xntboot,我自定义的,引用ntboot并添加了参数,如果你将xntboot直接改成ntboot 是会缺少参数的。
你可以打开 build\boot\grub\run\run.cfg 来看,里面就定义了 xntboot 命令以及其他命令,主命令是run。

评分

参与人数 1无忧币 +5 收起 理由
AndyChen + 5 很给力!

查看全部评分

回复

使用道具 举报

157#
 楼主| 发表于 2021-2-17 14:49:30 | 只看该作者
本帖最后由 hilsonma 于 2021-2-17 14:54 编辑
AndyChen 发表于 2021-2-17 11:57
启动不了,看下图

can't find command 'run' 说明没有run命令
这是我自定义的命令,在run文件夹中。
你要使用我的整个模板,然后修改其中的 grub.cfg 就可以了
成功之后再尝试换字体及其他修改。

附件是根据你的菜单修改过的模板,以及生成的单文件,我试过应该是没有问题的。

efi_one.7z (3.32 MB, 下载次数: 149)

bootx64.7z (2.14 MB, 下载次数: 122)

你原菜单中自定义命令是有大写的,我暂时照搬。
但我建议全部换成小写,并且尽量将命令名缩短,以方便输入。
例如 Andychen 改为 ac 或 andy
PE 改为 pe

注意grub2中是大小写不同的,有区分的。

评分

参与人数 1无忧币 +5 收起 理由
AndyChen + 5 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-4 15:48

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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