无忧启动论坛

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

[分享] 将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, 下载次数: 1210)
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 很给力!

查看全部评分

2#
发表于 2020-1-18 17:33:24 | 只看该作者
win10可以用wsl

点评

感谢指点。之前不知道,也没有听说过。刚才一搜wsl,看得到相关内容,稍后再学习,  详情 回复 发表于 2020-1-18 18:02
回复

使用道具 举报

3#
发表于 2020-1-18 17:57:00 | 只看该作者
感谢分享,楼主的帖子是学习的好帮手
回复

使用道具 举报

4#
 楼主| 发表于 2020-1-18 18:02:36 | 只看该作者

感谢指点。之前不知道,也没有听说过。刚才一搜wsl,看得到相关内容,稍后再学习,
回复

使用道具 举报

5#
发表于 2020-1-18 19:16:57 | 只看该作者
说一个问题:

用7z压缩文件,不会保存unix权限信息。
要用tar/cpio等格式压缩才可以。
tar -zcf xxx.tar.gz dir

点评

是不是要这样的  详情 回复 发表于 2020-1-18 20:02
我以前是用winrar的,近两三年才改用7z tar没有用过,几乎不用linux,近来才接触,真正应用linux还是从现在这个封装开始,因为你给我的方法就是cpio所以才必须用linux,前面你提到wsl 如果我觉得好用可能会采用,不  详情 回复 发表于 2020-1-18 19:51
回复

使用道具 举报

6#
 楼主| 发表于 2020-1-18 19:51:50 | 只看该作者
wintoflash 发表于 2020-1-18 19:16
说一个问题:

用7z压缩文件,不会保存unix权限信息。

我以前是用winrar的,近两三年才改用7z
tar没有用过,几乎不用linux,近来才接触,真正应用linux还是从现在这个封装开始,因为你给我的方法就是cpio所以才必须用linux,前面你提到wsl 如果我觉得好用可能会采用,不知道wsl 是不是可以使用 tar

我现在还没有找到比较趁手的免安装的linux,porteus 勉强可以用用。

也许要考虑加个硬盘装linux了。

没有装虚拟机,回了这贴重启到porteus 看看能不能象你说的tar ...

点评

后来找到Windows下有同样的打包程序cpio.exe,可以不用linux环境打包,参见31楼。  发表于 2020-3-11 00:08
除了真要编译源码好像不太要用linux,grub2那个也都可以改成批处理的 wls就是在win上运行完整的linux,通过win命令行窗口直接交互,以前编译ipxe很荒便, porteus还是跑在虚拟机上比较方便吧,脱离win切换过去用会  详情 回复 发表于 2020-1-18 20:05
回复

使用道具 举报

7#
 楼主| 发表于 2020-1-18 20:02:45 | 只看该作者
本帖最后由 hilsonma 于 2020-1-18 20:06 编辑
wintoflash 发表于 2020-1-18 19:16
说一个问题:

用7z压缩文件,不会保存unix权限信息。

是不是要这样的
单一efi文件封装模板.tar.gz (743.88 KB, 下载次数: 153)


压缩率没有7z的好,是tar本身没有那么高的压缩率还是没有使用合适的参数,稍后再深入学习。
回复

使用道具 举报

8#
发表于 2020-1-18 20:05:25 | 只看该作者
hilsonma 发表于 2020-1-18 19:51
我以前是用winrar的,近两三年才改用7z
tar没有用过,几乎不用linux,近来才接触,真正应用linux还是从 ...

除了真要编译源码好像不太要用linux,grub2那个也都可以改成批处理的
wls就是在win上运行完整的linux,通过win命令行窗口直接交互,以前编译ipxe很荒便,
porteus还是跑在虚拟机上比较方便吧,脱离win切换过去用会有孤独感
而且虚拟机还能建立些快照

点评

感谢指点,看来还是要装虚拟机啊。我的硬盘都被西都冷占满了  详情 回复 发表于 2020-1-18 20:15
回复

使用道具 举报

9#
 楼主| 发表于 2020-1-18 20:15:29 | 只看该作者
江南一根葱 发表于 2020-1-18 20:05
除了真要编译源码好像不太要用linux,grub2那个也都可以改成批处理的
wls就是在win上运行完整的linux, ...

感谢指点,看来还是要装虚拟机啊。我的硬盘都被西都冷占满了
回复

使用道具 举报

10#
发表于 2020-1-19 06:09:19 | 只看该作者
这个方法很好
回复

使用道具 举报

11#
发表于 2020-1-19 09:11:56 | 只看该作者
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gz  tar开到linux环境后,用你的脚本运行了一下,发现 生成命令是 grub-mkimage.exe,这明显是Windows平台下的,翻了一下W大的Gibhub, 好像也没有linux 平台下的 grub2 (不要源码!),请问,W大的版本是兼容Win/Lin两个平台吗? 能否提供一个Linux下的grub2 ,要W大的最新版,支持map ,ntboot 的!

点评

你看错了。  详情 回复 发表于 2020-1-19 14:26
试了一下,grub-mkimage.exe 在Linux下确实不兼容!!  详情 回复 发表于 2020-1-19 09:30
回复

使用道具 举报

12#
发表于 2020-1-19 09:30:35 | 只看该作者
jxdeng2017 发表于 2020-1-19 09:11
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gz  ta ...

试了一下,grub-mkimage.exe 在Linux下确实不兼容!!

点评

我用没有问题呀。 用的就是wintoflash的grub2-latest.tar.gz ,win/lin通用的 [attachimg]409880[/attachimg]  详情 回复 发表于 2020-1-19 14:23
回复

使用道具 举报

13#
发表于 2020-1-19 09:32:25 | 只看该作者
感谢分享!
回复

使用道具 举报

14#
发表于 2020-1-19 10:34:00 | 只看该作者
更方便了
回复

使用道具 举报

15#
 楼主| 发表于 2020-1-19 14:23:58 | 只看该作者
本帖最后由 hilsonma 于 2020-1-19 14:52 编辑
jxdeng2017 发表于 2020-1-19 09:30
试了一下,grub-mkimage.exe 在Linux下确实不兼容!!

我用没有问题呀。
用的就是wintoflash的grub2-latest.tar.gz ,win/lin通用的

到这里下载试试。




回复

使用道具 举报

16#
发表于 2020-1-19 14:26:48 | 只看该作者
jxdeng2017 发表于 2020-1-19 09:11
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gz  ta ...
发现 生成命令是 grub-mkimage.exe



你看错了。

回复

使用道具 举报

17#
发表于 2020-1-19 15:46:12 | 只看该作者

再运行

本帖最后由 jxdeng2017 于 2020-1-19 15:49 编辑

W大,hilsonma兄: 再次测试了一下,情况如下,用W大的最新的 grub2-latest.tar.gz ,放到Win 10 的WSL2 的ubuntu 环境,先用W大的build_grub.sh  测试一把,同样报没有 grub-mkimage 文件的错。我改了两处:1、cp grub-mkimage.exe grub-mkimage 生成一个grub-mkimage , 并加 x权限; 2、把build_grub.sh 里的
grub-mkimage -d x86_64-efi -p "/boot/grub" -o grubx64.efi -O x86_64-efi $modules 改了一下:
./grub-mkimage -d x86_64-efi -p "/boot/grub" -o grubx64.efi -O x86_64-efi $modules  再运行 build_grub.sh  可以了。请问两位老大,你们也是这种情况吗? 还是的linux 环境有点问题?请指点!

点评

你这是什么操作,莫名其妙。 在Linux下,你应该用系统提供的grub-mkimage。 grub-mkimage.exe当然是给windows用的。 Linux发行版一般都自带grub,你用它自带的就好了。 不自带,也可以直接从软件仓库安装。  详情 回复 发表于 2020-1-19 16:09
回复

使用道具 举报

18#
发表于 2020-1-19 15:52:12 | 只看该作者
截图

grub2.jpg (246.25 KB, 下载次数: 164)

grub2.jpg

winf.jpg (109.44 KB, 下载次数: 145)

winf.jpg

winf2.jpg (75.82 KB, 下载次数: 143)

winf2.jpg

点评

你得先要有Grub2啊,有update_grub2.sh  详情 回复 发表于 2020-1-19 16:05
回复

使用道具 举报

19#
发表于 2020-1-19 16:05:27 | 只看该作者

你得先要有Grub2啊,有update_grub2.sh
回复

使用道具 举报

20#
发表于 2020-1-19 16:09:46 | 只看该作者
jxdeng2017 发表于 2020-1-19 15:46
W大,hilsonma兄: 再次测试了一下,情况如下,用W大的最新的 grub2-latest.tar.gz ,放到Win 10 的WSL2 的 ...

你这是什么操作,莫名其妙。
在Linux下,你应该用系统提供的grub-mkimage。
grub-mkimage.exe当然是给windows用的。
Linux发行版一般都自带grub,你用它自带的就好了。
不自带,也可以直接从软件仓库安装。


点评

知道了,应该补齐用update_grub2.sh 先下载grub2,因为太慢太慢,所以,我就用Windows 下的grub2-latest.tar.gz 包了。明白了!!谢谢,W大,hilsonma兄,葱大!!  详情 回复 发表于 2020-1-19 17:46
WSL内的ubuntu 肯定不带grub-mkimage !所以,来了一波骚操作!  详情 回复 发表于 2020-1-19 17:38
有没有可能是wsl的问题呢?他用的是wsl,会不会是不带grub-mkimage的 我用的是porteus,在不带-d参数的时候会有 usr/....没有x86_64-efi 这样的提示,加上-d 参数指向grub2定制包中的x86_64-efi就好了,没注意gru  详情 回复 发表于 2020-1-19 16:55
回复

使用道具 举报

21#
 楼主| 发表于 2020-1-19 16:55:36 | 只看该作者
wintoflash 发表于 2020-1-19 16:09
你这是什么操作,莫名其妙。
在Linux下,你应该用系统提供的grub-mkimage。
grub-mkimage.exe当然是给w ...

有没有可能是wsl的问题呢?他用的是wsl,会不会是不带grub-mkimage的

我用的是porteus,在不带-d参数的时候会有 usr/....没有x86_64-efi 这样的提示,加上-d 参数指向grub2定制包中的x86_64-efi就好了,没注意grub-mkimage用的是不是定制包的,按你们这样一说,应该是porteus自带的grub-mkimage

点评

几乎所有的Linux发行版都带grub,不带的,也能通过官方仓库安装grub。 无论是何种情况,非开发者都应当使用系统自带的或者官方仓库的。  详情 回复 发表于 2020-1-19 17:12
回复

使用道具 举报

22#
发表于 2020-1-19 17:12:19 | 只看该作者
hilsonma 发表于 2020-1-19 16:55
有没有可能是wsl的问题呢?他用的是wsl,会不会是不带grub-mkimage的

我用的是porteus,在不带-d参数 ...

几乎所有的Linux发行版都带grub,不带的,也能通过官方仓库安装grub。
无论是何种情况,非开发者都应当使用系统自带的或者官方仓库的。


回复

使用道具 举报

23#
发表于 2020-1-19 17:23:54 | 只看该作者
wsl需要sudo apt-get install grub还是

grub-common忘了
回复

使用道具 举报

24#
发表于 2020-1-19 17:38:52 | 只看该作者
wintoflash 发表于 2020-1-19 16:09
你这是什么操作,莫名其妙。
在Linux下,你应该用系统提供的grub-mkimage。
grub-mkimage.exe当然是给w ...

WSL内的ubuntu 肯定不带grub-mkimage !所以,来了一波骚操作!
回复

使用道具 举报

25#
发表于 2020-1-19 17:46:24 | 只看该作者
本帖最后由 jxdeng2017 于 2020-1-19 17:51 编辑
wintoflash 发表于 2020-1-19 16:09
你这是什么操作,莫名其妙。
在Linux下,你应该用系统提供的grub-mkimage。
grub-mkimage.exe当然是给w ...

知道了,WSL 里的ubuntu 确实缺少grub,应该先安装 grub : sudo apt get grub ;再用update_grub2.sh 先下载grub2,因为太慢太慢,所以,我就用Windows 下的grub2-latest.tar.gz 包了。明白了!!谢谢,W大,hilsonma兄,葱大!!
回复

使用道具 举报

26#
发表于 2020-1-19 18:47:21 | 只看该作者
玩wsl的导这个注册表,很方便
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\bash here]
"icon"="C:\\Users\\Administrator\\AppData\\Local\\lxss\\bash.ico"
@="在此打开WSL"

[HKEY_CLASSES_ROOT\Directory\Background\shell\bash here\command]
@="C:\\Windows\\System32\\bash.exe"

回复

使用道具 举报

27#
发表于 2020-1-19 23:21:07 | 只看该作者
模板结构很好
回复

使用道具 举报

28#
发表于 2020-1-20 11:40:35 | 只看该作者
重要提醒:在我测试H大,W大的GRUB定制程序时,由于使用了Win 10 1903里的 WSL2 ,在WSL2 的ubuntu 18.04 环境里,根本就没有grub环境,所以在运行脚本时误认为W大的grub2 定制包没有提供grub-mkimage命令,经大师们的指点,终于找到了处理办法, grub-mkimage命令包含在grub2-common包中,执行:
sudo apt-get update
sudo apt install grub-common
解决问题。

再执行H大,W大的GRUB定制程序,一马平川!!!
回复

使用道具 举报

29#
发表于 2020-2-21 08:42:05 | 只看该作者
太深奥,
看不懂


回复

使用道具 举报

30#
发表于 2020-3-8 16:30:30 | 只看该作者

RE: 将grub2启动模板封装成efi单文件

本帖最后由 nivigo 于 2020-3-8 16:35 编辑

我修改了一下可以在win下定制,自测成功,欢迎大家测试。
用法:
1、把tools.7z解压出来,把tools文件夹放到grub2的文件夹下。
2、进入tools文件夹点击“定制grub2_efi单文件版.bat”
3、在grub2文件夹下找bootx64.efi就是生成的efi文件。
4、把bootx64.efi文件放efi/boot/文件夹下就行了。
https://pan.baidu.com/s/1UBZKZoDKT8JUsWT9H7zEkg  验证码:qxhr


点评

感谢分享。 仿照你的方法,我更新了我的方案。 下载附件,解压放到grub2文件夹 将 build/boot/grub 里的内容清空,换上自己的启动模板的整套文件 启动模板的主程序需要命名为grub.cfg 按自己的启动模  详情 回复 发表于 2020-3-8 19:32
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-20 02:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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