hilsonma 发表于 2020-1-18 17:17:05

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

本帖最后由 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
|
|-- 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中调用,按需要加上参数。

wintoflash 发表于 2020-1-18 17:33:24

win10可以用wsl

ksafei 发表于 2020-1-18 17:57:00

感谢分享,楼主的帖子是学习的好帮手

hilsonma 发表于 2020-1-18 18:02:36

wintoflash 发表于 2020-1-18 17:33
win10可以用wsl

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

wintoflash 发表于 2020-1-18 19:16:57

说一个问题:

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

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

hilsonma 发表于 2020-1-18 20:02:45

本帖最后由 hilsonma 于 2020-1-18 20:06 编辑

wintoflash 发表于 2020-1-18 19:16
说一个问题:

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

是不是要这样的



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

江南一根葱 发表于 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切换过去用会有孤独感{:1_186:}
而且虚拟机还能建立些快照

hilsonma 发表于 2020-1-18 20:15:29

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

感谢指点,看来还是要装虚拟机啊。我的硬盘都被西都冷占满了{:1_186:}

zgj 发表于 2020-1-19 06:09:19

这个方法很好

jxdeng2017 发表于 2020-1-19 09:11:56

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

jxdeng2017 发表于 2020-1-19 09:30:35

jxdeng2017 发表于 2020-1-19 09:11
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gzta ...

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

liaonf 发表于 2020-1-19 09:32:25

感谢分享!

zgj 发表于 2020-1-19 10:34:00

更方便了

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

你到这里下载试试。




wintoflash 发表于 2020-1-19 14:26:48

jxdeng2017 发表于 2020-1-19 09:11
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gzta ...

发现 生成命令是 grub-mkimage.exe


你看错了。

jxdeng2017 发表于 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 环境有点问题?请指点!

jxdeng2017 发表于 2020-1-19 15:52:12

截图

江南一根葱 发表于 2020-1-19 16:05:27

jxdeng2017 发表于 2020-1-19 15:52
截图

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

wintoflash 发表于 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,你用它自带的就好了。
不自带,也可以直接从软件仓库安装。


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

wintoflash 发表于 2020-1-19 17:12:19

hilsonma 发表于 2020-1-19 16:55
有没有可能是wsl的问题呢?他用的是wsl,会不会是不带grub-mkimage的

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

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


江南一根葱 发表于 2020-1-19 17:23:54

wsl需要sudo apt-get install grub还是

grub-common忘了

jxdeng2017 发表于 2020-1-19 17:38:52

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

WSL内的ubuntu 肯定不带grub-mkimage !所以,来了一波骚操作!{:1_186:}

jxdeng2017 发表于 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兄,葱大!!{:1_195:}

江南一根葱 发表于 2020-1-19 18:47:21

玩wsl的导这个注册表,很方便
Windows Registry Editor Version 5.00


"icon"="C:\\Users\\Administrator\\AppData\\Local\\lxss\\bash.ico"
@="在此打开WSL"


@="C:\\Windows\\System32\\bash.exe"

zgj 发表于 2020-1-19 23:21:07

模板结构很好

jxdeng2017 发表于 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定制程序,一马平川!!!{:1_186:}

langyun 发表于 2020-2-21 08:42:05

太深奥,
看不懂


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


页: [1] 2 3 4 5 6 7 8
查看完整版本: 将grub2启动模板封装成efi单文件