无忧启动论坛

标题: 将grub2启动模板封装成efi单文件 [打印本页]

作者: hilsonma    时间: 2020-1-18 17:17
标题: 将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 (568.45 KB, 下载次数: 1248)
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
win10可以用wsl
作者: ksafei    时间: 2020-1-18 17:57
感谢分享,楼主的帖子是学习的好帮手
作者: hilsonma    时间: 2020-1-18 18:02
wintoflash 发表于 2020-1-18 17:33
win10可以用wsl

感谢指点。之前不知道,也没有听说过。刚才一搜wsl,看得到相关内容,稍后再学习,
作者: wintoflash    时间: 2020-1-18 19:16
说一个问题:

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


作者: hilsonma    时间: 2020-1-18 19:51
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
本帖最后由 hilsonma 于 2020-1-18 20:06 编辑
wintoflash 发表于 2020-1-18 19:16
说一个问题:

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

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


压缩率没有7z的好,是tar本身没有那么高的压缩率还是没有使用合适的参数,稍后再深入学习。
作者: 江南一根葱    时间: 2020-1-18 20:05
hilsonma 发表于 2020-1-18 19:51
我以前是用winrar的,近两三年才改用7z
tar没有用过,几乎不用linux,近来才接触,真正应用linux还是从 ...

除了真要编译源码好像不太要用linux,grub2那个也都可以改成批处理的
wls就是在win上运行完整的linux,通过win命令行窗口直接交互,以前编译ipxe很荒便,
porteus还是跑在虚拟机上比较方便吧,脱离win切换过去用会有孤独感
而且虚拟机还能建立些快照
作者: hilsonma    时间: 2020-1-18 20:15
江南一根葱 发表于 2020-1-18 20:05
除了真要编译源码好像不太要用linux,grub2那个也都可以改成批处理的
wls就是在win上运行完整的linux, ...

感谢指点,看来还是要装虚拟机啊。我的硬盘都被西都冷占满了
作者: zgj    时间: 2020-1-19 06:09
这个方法很好
作者: jxdeng2017    时间: 2020-1-19 09:11
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 的!
作者: jxdeng2017    时间: 2020-1-19 09:30
jxdeng2017 发表于 2020-1-19 09:11
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gz  ta ...

试了一下,grub-mkimage.exe 在Linux下确实不兼容!!
作者: liaonf    时间: 2020-1-19 09:32
感谢分享!
作者: zgj    时间: 2020-1-19 10:34
更方便了
作者: hilsonma    时间: 2020-1-19 14:23
本帖最后由 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
jxdeng2017 发表于 2020-1-19 09:11
hilsonma兄,这个单一文件efi启动文件不错!我在定制时出现了一个问题,我把W大的 grub2-latest.tar.gz  ta ...
发现 生成命令是 grub-mkimage.exe



你看错了。


作者: jxdeng2017    时间: 2020-1-19 15:46
标题: 再运行
本帖最后由 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
截图

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

grub2.jpg

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

winf.jpg

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

winf2.jpg

作者: 江南一根葱    时间: 2020-1-19 16:05
jxdeng2017 发表于 2020-1-19 15:52
截图

你得先要有Grub2啊,有update_grub2.sh
作者: wintoflash    时间: 2020-1-19 16:09
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
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
hilsonma 发表于 2020-1-19 16:55
有没有可能是wsl的问题呢?他用的是wsl,会不会是不带grub-mkimage的

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

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



作者: 江南一根葱    时间: 2020-1-19 17:23
wsl需要sudo apt-get install grub还是

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

WSL内的ubuntu 肯定不带grub-mkimage !所以,来了一波骚操作!
作者: jxdeng2017    时间: 2020-1-19 17:46
本帖最后由 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兄,葱大!!
作者: 江南一根葱    时间: 2020-1-19 18:47
玩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"


作者: zgj    时间: 2020-1-19 23:21
模板结构很好
作者: jxdeng2017    时间: 2020-1-20 11:40
重要提醒:在我测试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定制程序,一马平川!!!
作者: langyun    时间: 2020-2-21 08:42
太深奥,
看不懂



作者: nivigo    时间: 2020-3-8 16: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



作者: hilsonma    时间: 2020-3-8 19:32
本帖最后由 hilsonma 于 2020-3-9 11:55 编辑
nivigo 发表于 2020-3-8 16:30
我修改了一下可以在win下定制,自测成功,欢迎大家测试。
用法:
1、把tools.7z解压出来,把tools文件夹 ...

感谢分享。

仿照你的方法,我更新了我的方案,添加grub2模块目录和定制程序,做成完整独立的单文件efi定制包。
grub2定制单文件efi.7z (2.43 MB, 下载次数: 900)

下载附件,解压放到任意文件夹
将 build/boot/grub 里的内容清空,换上自己的启动方案的整套文件
    启动方案的主程序需要命名为grub.cfg
按自己的启动方案用到的模块来修改模块清单文件 build/mod.txt
    注意有6个模块是本封装模式要用到的:cpio gzio loopback lzopio memdisk newc
    这6个模块不能缺少
点击执行脚本 制作单文件efi.cmd 就会生成 bootx64.efi .

如果自己没有现成的启动方案,也可以不清空 build/boot/grub 里的内容,直接对 build/boot/grub/grub.cfg 进行修改
根据修改的内容增删相应的文件,并在模块清单文件 build/mod.txt 中增删相应的模块,然后执行脚本。

作者: lover197    时间: 2020-3-21 15:54
这是制作EFI引导菜单吗,学习一下
作者: wangziqiang    时间: 2020-3-22 18:55
迟到了,谢谢更新了
作者: 2012kwy    时间: 2020-3-23 13:57
hilsonma 发表于 2020-3-8 19:32
感谢分享。

仿照你的方法,我更新了我的方案,添加grub2模块目录和定制程序,做成完整独立的单文件efi ...

hilsonma大,按照此法依样画葫芦,想把之前wintoflash的Run模块中的grub2更新到最新版,打包后测试发现已无法加载iso 、wim文件(仅浏览功能可用),不知问题出在哪?是否还需修改其它内容?
作者: hilsonma    时间: 2020-3-25 21:54
2012kwy 发表于 2020-3-23 13:57
hilsonma大,按照此法依样画葫芦,想把之前wintoflash的Run模块中的grub2更新到最新版,打包后测试发现已 ...

Wintoflash的Run,其最新版本是直接引用grub2的grubfm模块来处理文件浏览及打开的,我试了很久,也不知你反馈的问题是什么原因导致,要不你就直接使用他打好包的efi文件吧。

我现在尝试用我的打包方案去打包他的Run也是有问题,现在也找不到原因。
作者: 2012kwy    时间: 2020-3-26 13:53
hilsonma 发表于 2020-3-25 21:54
Wintoflash的Run,其最新版本是直接引用grub2的grubfm模块来处理文件浏览及打开的,我试了很久,也不知你 ...

我就是使用您的打包方案去打包他的Run然后失败,可能要请W大亲自操刀才能解决。另请问H大,Wintoflash大的最新Run能否提供下载?谢谢啦

作者: hilsonma    时间: 2020-3-26 14:59
2012kwy 发表于 2020-3-26 13:53
我就是使用您的打包方案去打包他的Run然后失败,可能要请W大亲自操刀才能解决。另请问H大,Wintoflash大 ...

这是我之前下载保存的,也不知是不是最新 run.7z (2.18 MB, 下载次数: 297)

作者: 2012kwy    时间: 2020-3-27 10:21
同我之前下载的一样。谢谢H大费心
作者: wintoflash    时间: 2020-3-27 14:04
2012kwy 发表于 2020-3-23 13:57
hilsonma大,按照此法依样画葫芦,想把之前wintoflash的Run模块中的grub2更新到最新版,打包后测试发现已 ...

你要下载源码,然后自己编译run用的grubfm模块。
作者: book0909    时间: 2020-3-27 14:49
这个有用,谢谢!
作者: 2012kwy    时间: 2020-3-28 15:00
wintoflash 发表于 2020-3-27 14:04
你要下载源码,然后自己编译run用的grubfm模块。

这个有难度。好像单一模块的功能正逐步被新版Grub2取代,Grub2变得越来越强,都快成了微型操作系统了,谢谢W大的奉献
作者: wintoflash    时间: 2020-3-28 16:37
2012kwy 发表于 2020-3-28 15:00
这个有难度。好像单一模块的功能正逐步被新版Grub2取代,Grub2变得越来越强,都快成了微型操作系统了,谢 ...

不会的话那你就直接用grub2-filemanager吧
作者: svboya    时间: 2020-4-2 01:40
谢谢分享
作者: hjj888    时间: 2020-4-11 23:45
很好,已下载了
作者: 2000lg    时间: 2020-4-18 20:14
请问Windows怎么才能从efi引导呢?用BOOTice增加一个启动菜单,设置成从bootx64.efi启动,这个我测试成功了。请问有其他方法吗?比如用系统自带的命令去设置。
作者: hilsonma    时间: 2020-4-18 22:11
本帖最后由 hilsonma 于 2020-4-18 22:24 编辑
2000lg 发表于 2020-4-18 20:14
请问Windows怎么才能从efi引导呢?用BOOTice增加一个启动菜单,设置成从bootx64.efi启动,这个我测试成功了 ...

要实现efi引导,需要一个efi系统分区,英文缩写esp,esp里需要存放有效的efi启动文件。

esp一般是FAT分区,你用bootice设置从bootx64.efi启动成功就说明已有esp。esp也有了有效的启动文件bootx64.efi

其他方法也不外是在esp里放置efi文件,然后将这个efi文件添加到uefi启动序列,如要成为默认启动项就要将其移动到uefi启动序列的第一位。

通常uefi启动序列的第一位是esp里的 \efi\boot\bootx64.efi ,如果是这样的话,也可以将其他的efi启动文件改名为bootx64.efi替换到 \efi\boot\ 中,这样就不再需要手工调整uefi启动序列。

windows自带的设置命令是bcdboot. 首先要给esp分配盘符,比如将esp挂载为K盘,windows系统在C盘,那么只需要在cmd窗口输入 bcdboot c:\windows /s K: /f uefi 然后回车,会自动安装efi启动文件和bcd配置文件到esp.

我这个贴中的启动模板是使用grub2引导,也就是将grub2启动文件bootx64.efi替换到esp 的 \efi\boot 中。bootx64.efi内置菜单,菜单第一项引导 windows分区中的 \Windows\Boot\EFI\bootmgf.efi ,由此实现windows的引导。这种引导方式需要配置一个正确的bcd文件放在windows分区的 \Windows\Boot\EFI
作者: 2000lg    时间: 2020-4-18 22:26
hilsonma 发表于 2020-4-18 22:11
要实现efi引导,需要一个efi系统分区,英文缩写esp,esp里需要存放有效的efi启动文件。

esp一般是FAT ...

多谢。但是比如我在ESP分区中新建了一个文件夹,然后把自己做的bootx64.efi放到这个文件夹里。想设置从这个文件启动,用Bootice是可以设置的。但是想了解一下其中的原理,好像bcdboot不行。
作者: hilsonma    时间: 2020-4-18 22:37
本帖最后由 hilsonma 于 2020-4-18 23:02 编辑
2000lg 发表于 2020-4-18 22:26
多谢。但是比如我在ESP分区中新建了一个文件夹,然后把自己做的bootx64.efi放到这个文件夹里。想设置从这 ...

bcdboot负责将efi文件和bcd文件放到esp,如果你用了不能启动说明它不处理uefi启动序列。需要用其他工具处理启动序列。这类工具也多,你用的bootice就是其中一个,同一个作者做的另一个软件xorboot也有这个功能,还有diskgenius也有这个功能,其他你要找应该还有,我不一一列举,我自己常用bootice,因其轻便。

我可以肯定的是bcdboot执行efi引导配置成功后,esp里一定会有 \efi\microsoft\boot\bootmgfw.efi ,你可以使用bootice 将这个efi文件手动添加到uefi启动序列并上移到第一位即可实现引导。或者将你的主引导链接到这个efi文件也可以实现引导。


要说原理,就是uefi在检测完成后会将识别到的启动设备添加到nvram的uefi启动序列中,并按顺序逐一尝试引导直至成功或者试完整个序列。
uefi自动识别的就是esp里的 \efi\boot\bootx64.efi ,如果启用了csm,也会识别各存储设备的主引导扇区。

uefi启动序列可以使用bootice之类的工具修改调整。
bcdboot没有这个功能,它只会将bootmgfw.efi和bcd放到esp,如果esp还没有 \efi\boot\bootx64.efi就将bootmgfw.efi复制一份命名为bootx64.efi放到 \efi\boot\


作者: 2000lg    时间: 2020-4-19 00:31
本帖最后由 2000lg 于 2020-4-19 13:14 编辑
hilsonma 发表于 2020-4-18 22:37
bcdboot负责将efi文件和bcd文件放到esp,如果你用了不能启动说明它不处理uefi启动序列。需要用其他工具处 ...


1、默认情况下,Windows开机后,会自动查找ESP分区下的efi\Microsoft\boot\bootmgfw.efi,然后再加载同目录下的BCD,最后加载Windows分区下的\windows\system32\winload.efi,从而引导进入系统。所以使用Bcdboot修复后,应该是恢复这种默认的启动方式。
2、默认情况下,貌似 \efi\boot\bootx64.efi 文件删除也不会影响Windows的启动。您直接把bootx64.efi替换到esp 的 \efi\boot ,说明您之前默认的第一启动是esp里的 \efi\boot\bootx64.efi ,这个应该是自己修改过的吧(应该不是用微软原版光盘安装的,感觉是用wim部署工具把wim镜像部署到某分区,然后efi分区启动文件自己手动添加)?
3、我是按照您这个帖子制作了bootx64.efi(将您提供的grub.cfg中的代码修改成了一下。改成默认的“run /EFI/Microsoft/boot/bootmgfw.efi”,)
我现在想从自己制作的bootx64.efi启动,把bootx64.efi随便放到ESP的自建文件夹,然后用了bootice设置bootx64.efi为第一启动序列,启动是成功了。 不过不清楚的是bootice是用什么命令设置的,很好奇。
作者: 2000lg    时间: 2020-4-19 13:29
我现在想实现的功能是,加载自制的bootx64.efi。这个efi会自动加载Slic 2.5用来激活win7,加载完自动进入windows。目前功能已经实现了。就差最后一步,设置bootx64.efi为第一启动序列。如果用bootice还得手工添加一下启动序列,所以我想实现自动。查了资料后发现,这个操作好复杂,微软的命令行工具应该实现不了。添加新的uefi启动序列,需要编程序,代码好像要很多。
现在有一个退而求其次的方法,还没测试。就是用bcdboot修复一下启动后,恢复成windows的默认引导方式,然后把Esp分区下的efi/microsoft/boot/bootmgfw.efi用自制的bootx64.efi替换。这样应该就能实现我的目的了。但是总感觉怪怪的。
作者: wintoflash    时间: 2020-4-19 15:21
2000lg 发表于 2020-4-19 13:29
我现在想实现的功能是,加载自制的bootx64.efi。这个efi会自动加载Slic 2.5用来激活win7,加载完自动进入wi ...

http://bbs.wuyou.net/forum.php?m ... &fromuid=487838
作者: hilsonma    时间: 2020-4-19 15:36
2000lg 发表于 2020-4-19 13:29
我现在想实现的功能是,加载自制的bootx64.efi。这个efi会自动加载Slic 2.5用来激活win7,加载完自动进入wi ...

我以前是用chew-wga在部署时激活,不需要每次启动时激活。
作者: 2000lg    时间: 2020-4-19 15:52
wintoflash 发表于 2020-4-19 15:21
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=418717&pid=4026764&fromuid=487838

多谢w大和楼主,就是看了两位的帖子,已经实现加载slic,并成功制作efi单文件。 您发的这个帖子也看过了,有点复杂,代码还要再研究一下,希望能实现添加uefi引导序列的功能。
作者: wintoflash    时间: 2020-4-19 16:11
2000lg 发表于 2020-4-19 15:52
多谢w大和楼主,就是看了两位的帖子,已经实现加载slic,并成功制作efi单文件。 您发的这个帖子也看过了 ...

我发的帖子里面27#有个支持命令行操作UEFI启动项的Bootice。
作者: 2000lg    时间: 2020-4-20 13:08
wintoflash 发表于 2020-4-19 16:11
我发的帖子里面27#有个支持命令行操作UEFI启动项的Bootice。

多谢啦。用bcdedit命令编辑{bootmgr},然后把bootmgr设置成fwbootmgr的第一启动项也可以成功引导自定义目录下的efi文件,这样就可以只用微软的命令,不用bootice了。在楼主和w大的帖子帮助下,使用GRUB2添加slic并做成efi单文件,已经弄好了,昨天成功激活了server2016。
另外还有个问题请教大神,怎么把slic2.2添加到grldr文件中呢?没搜到教程,看w大写过一个grub4dos的外部命令/slic ,但是不太会用,能发个学习的链接吗,谢谢
作者: wintoflash    时间: 2020-4-20 13:36
2000lg 发表于 2020-4-20 13:08
多谢啦。用bcdedit命令编辑{bootmgr},然后把bootmgr设置成fwbootmgr的第一启动项也可以成功引导自定义 ...

不清楚。
grub4dos的slic不是我写的。
作者: youlin211    时间: 2020-4-21 20:25
2000lg 发表于 2020-4-20 13:08
多谢啦。用bcdedit命令编辑{bootmgr},然后把bootmgr设置成fwbootmgr的第一启动项也可以成功引导自定义 ...

怎么弄的,集成slic.bin?
作者: 2000lg    时间: 2020-4-21 20:36
youlin211 发表于 2020-4-21 20:25
怎么弄的,集成slic.bin?

对。acpi --slic $prefix/dell.bin
作者: youlin211    时间: 2020-4-21 21:13
2000lg 发表于 2020-4-20 13:08
多谢啦。用bcdedit命令编辑{bootmgr},然后把bootmgr设置成fwbootmgr的第一启动项也可以成功引导自定义 ...

若把grubx64.EFI 放在\EFI\Boot下,你说的是不是执行这两个命令就可以了?
bcdedit /set {fwbootmgr} default {bootmgr}
bcdedit /set {bootmgr} path \EFI\Boot\grubx64.EFI
作者: 2000lg    时间: 2020-4-21 23:36
youlin211 发表于 2020-4-21 21:13
若把grubx64.EFI 放在\EFI\Boot下,你说的是不是执行这两个命令就可以了?
bcdedit /set {fwbootmgr} defa ...

是的。
bcdedit /set {fwbootmgr} displayorder {bootmgr} /addfirst
bcdedit /set {bootmgr} path "\EFI\Boot\grubx64.EFI"
作者: 2000lg    时间: 2020-4-26 23:48
请问楼主、怎么更新为最新的guub2?
作者: 2000lg    时间: 2020-4-26 23:49
请问楼主,怎么更新为最新的grub2? 是把“grub2定制单文件efi”里面的模块替换吗?
作者: 2000lg    时间: 2020-4-27 00:00
hilsonma 发表于 2020-4-19 15:36
我以前是用chew-wga在部署时激活,不需要每次启动时激活。

请问楼主,封装efi的文件中,GRUB2怎么更新的最新版? 是把那些模块替换一下就OK了吗?
作者: hilsonma    时间: 2020-4-27 09:03
2000lg 发表于 2020-4-26 23:48
请问楼主、怎么更新为最新的guub2?

将文件夹 x86_64-efi 和文件 grub-mkimage.exe 用新版grub2中的替换。
作者: 2000lg    时间: 2020-4-27 12:52
hilsonma 发表于 2020-4-27 09:03
将文件夹 x86_64-efi 和文件 grub-mkimage.exe 用新版grub2中的替换。

谢谢。
作者: szmsys    时间: 2020-5-8 12:51
楼主好!请教一下,

把 SLIC.BIN 文件放在了 ESP 分区的根目录,想让它加载SLIC.BIN之后,启动 /EFI/Microsoft/boot/bootmgfw.efi

grub.cfg 内容如下:
$prefix/run/run.cfgset{acpi --slic /SLIC.bin;run /EFI/Microsoft/boot/bootmgfw.efi;}

mod.txt 添加了 acpi
chain configfile cpio echo acpi exfat fat fb gzio halt help linux loopback lzopio map memdisk newc normal ntboot ntfs part_gpt part_msdos reboot regexp search test

为什么无法加载 SLIC.bin ?

哪里写的不对?

谢谢

作者: hilsonma    时间: 2020-5-8 13:07
szmsys 发表于 2020-5-8 12:51
楼主好!请教一下,

把 SLIC.BIN 文件放在了 ESP 分区的根目录,想让它加载SLIC.BIN之后,启动 /EFI/Mic ...

source $prefix/run/run.cfg
search -n -s -f /slic.bin
acpi --slic /slic.bin
run /EFI/Microsoft/Boot/bootmgfw.efi
作者: szmsys    时间: 2020-5-8 14:40
hilsonma 发表于 2020-5-8 13:07
source $prefix/run/run.cfg
search -n -s -f /slic.bin
acpi --slic /slic.bin

谢谢老大!测试失败,咋回事?

IMG_20200508_143428[1].jpg (1.91 MB, 下载次数: 265)

IMG_20200508_143428[1].jpg

作者: szmsys    时间: 2020-5-8 14:53
hilsonma 发表于 2020-5-8 13:07
source $prefix/run/run.cfg
search -n -s -f /slic.bin
acpi --slic /slic.bin

手动输入run命令,提示不存在

IMG_20200508_144505.jpg (1.22 MB, 下载次数: 387)

IMG_20200508_144505.jpg

作者: szmsys    时间: 2020-5-8 15:04
hilsonma 发表于 2020-5-8 13:07
source $prefix/run/run.cfg
search -n -s -f /slic.bin
acpi --slic /slic.bin

重新制作了一次,手动输入命令,又显示这个

IMG_20200508_145835.jpg (200.76 KB, 下载次数: 372)

IMG_20200508_145835.jpg

作者: hilsonma    时间: 2020-5-8 15:06
本帖最后由 hilsonma 于 2020-5-8 15:21 编辑
szmsys 发表于 2020-5-8 14:53
手动输入run命令,提示不存在

$prefix 目录下面需要有run文件夹和相关的3个cfg文件以及ms文件夹等,这样才能使用run命令。

要么就是不使用run命令,如果grub.cfg在esp,那么grub.cfg如下:
acpi --slic /slic.bin
chainloader /EFI/Microsoft/Boot/bootmgfw.efi

如果grub.cfg不在esp,slic.bin和bootmgfw.efi都在esp,那么grub.cfg如下:
search -n -s -f /slic.bin
acpi --slic /slic.bin
chainloader /EFI/Microsoft/Boot/bootmgfw.efi

总之只要分区不同或不确定就使用search来确定分区。
作者: szmsys    时间: 2020-5-8 15:40
search -n -s -f /slic.bin
acpi --slic /slic.bin
chainloader /EFI/Microsoft/Boot/bootmgfw.efi

用这个,slic 加载成功,bootmgfw.efi不成功,依然提示我发的截屏
fiel path 。。。。。。。。。。。。。。。。。。。。。。  endentire
作者: hilsonma    时间: 2020-5-8 15:44
szmsys 发表于 2020-5-8 15:40
search -n -s -f /slic.bin
acpi --slic /slic.bin
chainloader /EFI/Microsoft/Boot/bootmgfw.efi

关secureboot,或者添加过secureboot方案。
作者: wintoflash    时间: 2020-5-8 15:57
szmsys 发表于 2020-5-8 15:04
重新制作了一次,手动输入命令,又显示这个

你再输入boot就启动了
作者: szmsys    时间: 2020-5-8 17:39
wintoflash 发表于 2020-5-8 15:57
你再输入boot就启动了


chainloader /EFI/Microsoft/Boot/bootmgfw.efi
命令行 启动失败,

但是,用下面的就启动成功,咋回事


menuentry '正常启动(Windows)' --unrestricted {
    if [ 'pc' == $grub_platform ] ; then
        if search --file --set /bootmgr ; then
            chainloader +1
        elif search --file --set /ntldr ; then
            chainloader +1
        fi
    elif [ 'efi' == $grub_platform ] ; then
        if search --file --set /EFI/Microsoft/Boot/bootmgfw.efi ; then
            chainloader /EFI/Microsoft/Boot/bootmgfw.efi
        fi
    fi
}
作者: szmsys    时间: 2020-5-8 17:40
wintoflash 发表于 2020-5-8 15:57
你再输入boot就启动了

谢谢老大,我试试
作者: hilsonma    时间: 2020-5-8 17:50
szmsys 发表于 2020-5-8 17:39

chainloader /EFI/Microsoft/Boot/bootmgfw.efi
命令行 启动失败,

那你是在bios平台启动,不是在uefi平台启动,当然不能通过bootmgfw.efi引导了,只能通过bootmgr引导。

grub2是支持uefi/bios双平台的。你需要了解电脑是在以哪个模式启动。
作者: szmsys    时间: 2020-5-8 18:03
hilsonma 发表于 2020-5-8 17:50
那你是在bios平台启动,不是在uefi平台启动,当然不能通过bootmgfw.efi引导了,只能通过bootmgr引导。

...

好的,谢谢
作者: hilsonma    时间: 2020-5-8 18:36
szmsys 发表于 2020-5-8 18:03
好的,谢谢

不过一般bios引导也不会引导到esp的呀,所以你这情况有点奇怪。
还有一个可能就是你有多个esp,bootmgfw.efi跟grub.cfg或slic.bin不在同一个分区。
你可以试一下先确定bootmgfw.efi所在分区再引导
search -n -s -f /EFI/Microsoft/Boot/bootmgfw.efi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi

要知是bios还是uefi平台,可以在grub2命令行下输入set然后看grub_platform变量的值是pc还是efi.
作者: szmsys    时间: 2020-5-8 18:43
hilsonma 发表于 2020-5-8 18:36
不过一般bios引导也不会引导到esp的呀,所以你这情况有点奇怪。
还有一个可能就是你有多个esp,bootmgfw ...

好的谢谢
作者: szmsys    时间: 2020-5-8 19:00
wintoflash 发表于 2020-5-8 15:57
你再输入boot就启动了

谢谢!加了一行boot,终于成功了。可是这满屏的字符太难看了,怎么去掉?

IMG_20200508_185448.jpg (1.5 MB, 下载次数: 266)

IMG_20200508_185448.jpg

作者: szmsys    时间: 2020-5-8 19:01
hilsonma 发表于 2020-5-8 18:36
不过一般bios引导也不会引导到esp的呀,所以你这情况有点奇怪。
还有一个可能就是你有多个esp,bootmgfw ...

search -n -s -f /EFI/Microsoft/Boot/bootmgfw.efi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
boot

谢谢,终于折腾成功了

可是,满屏的字符太难看了,怎么去掉啊?
作者: hilsonma    时间: 2020-5-8 22:46
szmsys 发表于 2020-5-8 19:01
search -n -s -f /EFI/Microsoft/Boot/bootmgfw.efi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
bo ...

命令行需要输入boot来执行引导,菜单里是不需要的。

嫌文字信息难看可以切换成图形模式,这些文字信息是显示在console的,gfxterm没有这些信息。
即菜单中使用
terminal_output gfxterm
当然定制efi文件时要包含相应的模块。(gfxterm efi_gop efi_uga)
作者: szmsys    时间: 2020-5-9 01:18
hilsonma 发表于 2020-5-8 22:46
命令行需要输入boot来执行引导,菜单里是不需要的。

嫌文字信息难看可以切换成图形模式,这些文字信息 ...

辛苦老大,我试试
作者: szmsys    时间: 2020-5-9 07:36
报告一个严重的问题,使用生成的 Efi 作为第一启动项,开机,关机都么有问题。

但是,计算机进入休眠模式后,无法成功唤醒,提示错误,这个问题有点严重啊!
作者: szmsys    时间: 2020-5-9 07:36
wintoflash 发表于 2020-5-8 15:57
你再输入boot就启动了

报告一个严重的问题,使用生成的 Efi 作为第一启动项,开机,关机都么有问题。

但是,计算机进入休眠模式后,无法成功唤醒,提示错误,这个问题有点严重啊!

作者: wintoflash    时间: 2020-5-9 08:09
本帖最后由 wintoflash 于 2020-5-9 08:11 编辑
szmsys 发表于 2020-5-9 07:36
报告一个严重的问题,使用生成的 Efi 作为第一启动项,开机,关机都么有问题。

但是,计算机进入休眠 ...

Windows 自己的问题,别赖我。你自己加载slic搞盗版Windows,微软不十分钟给你黑屏一次就已经不错了。




作者: szmsys    时间: 2020-5-9 08:25
本帖最后由 szmsys 于 2020-5-9 08:28 编辑
wintoflash 发表于 2020-5-9 08:09
Windows 自己的问题,别赖我。你自己加载slic搞盗版Windows,微软不十分钟给你黑屏一次就已经不错了。

...

老大,不是这样的。我用 mydigitallife 上的 WindSLIC 就没有这个休眠无法唤醒的问题。

另外,我对您只有感谢,不会赖你的, 感谢都来不及,咋会赖你
作者: yzw92    时间: 2020-5-15 05:38
感谢分享
作者: minmax    时间: 2020-5-22 23:23
請問這個方式 可以封裝加密嗎
作者: pseudo    时间: 2020-5-28 21:26
谢谢分享。
可以把grubfm.efi打包进去,在geub.cfg中作为一个菜单项运行吗?
作者: wintoflash    时间: 2020-5-28 21:30
pseudo 发表于 2020-5-28 21:26
谢谢分享。
可以把grubfm.efi打包进去,在geub.cfg中作为一个菜单项运行吗?

可以,但是似乎没必要。grubfm本身可以加载外部菜单,想要全内置,可以直接改grubfm源码生成efi。
作者: pseudo    时间: 2020-5-28 22:39
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运行不了:



作者: hilsonma    时间: 2020-5-29 07:12
pseudo 发表于 2020-5-28 22:39
试了一下没成功,不知道是哪里弄错。

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

grubfmx64.efi本身就是这样打包生成的,不建议二次打包。有需要的,可以直接改grubfm源码再打包生成efi.
作者: wintoflash    时间: 2020-5-29 08:05
pseudo 发表于 2020-5-28 22:39
试了一下没成功,不知道是哪里弄错。

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

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

作者: pseudo    时间: 2020-5-29 11:54
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盘,并无效果。
作者: wintoflash    时间: 2020-5-29 14:57
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 菜单,没什么神秘的。

作者: 江南一根葱    时间: 2020-5-29 15:41
pseudo 发表于 2020-5-29 11:54
1、grubfm有通用的优点,所以菜单里必备;grubfm有通用的缺点,要启动指定文件每次还需要一番选择,不能 ...

可以不动源码,魔改一下
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
我刚才改的时候倒也遇到过这个root设备不正确启不来efi的的问题
作者: pseudo    时间: 2020-5-31 09:23
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作了限制,其实对此情形可以放宽。
作者: pseudo    时间: 2020-5-31 09:25
江南一根葱 发表于 2020-5-29 15:41
可以不动源码,魔改一下
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=420722&extra=pa ...

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




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3