无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
1651#
发表于 2021-6-14 10:07:14 | 只看该作者
测试了一下Uefi版版,真的非常非常非常强大!!!
只是菜单还有点弱,如果能像原来的Grub可以用command BGAutoChange 更换背景就更好了……
回复

使用道具 举报

1652#
 楼主| 发表于 2021-6-14 15:04:18 | 只看该作者
只是菜单还有点弱,如果能像原来的Grub可以用command BGAutoChange 更换背景就更好了……

http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

1653#
发表于 2021-6-14 15:31:17 | 只看该作者
谁能告诉下,下载下来怎么用!
回复

使用道具 举报

1654#
发表于 2021-6-15 09:02:14 | 只看该作者
yaya大,不知道g4e是否支持启动参数?或者读取UEFI的环境变量?如果从外部UEFI shell 脚本启动g4e的话,没有数据传递渠道的话衔接不起来。

点评

你具体想怎么用这个参数?当作g4e的一句命令来执行,还是把它保存到某个变量中以便脚本调用? 请说一下具体的使用场景。  详情 回复 发表于 2021-6-15 14:08
回复

使用道具 举报

1655#
 楼主| 发表于 2021-6-15 10:40:52 | 只看该作者
现在不支持启动参数。我不清楚你从外部UEFI shell 脚本启动g4e,需要传到什么数据。举个例子说说。
网启的话,他可以传到菜单的。
回复

使用道具 举报

1656#
发表于 2021-6-15 14:08:47 | 只看该作者
本帖最后由 wintoflash 于 2021-6-15 14:12 编辑
fmwqsn 发表于 2021-6-15 09:02
yaya大,不知道g4e是否支持启动参数?或者读取UEFI的环境变量?如果从外部UEFI shell 脚本启动g4e的话,没 ...

你具体想怎么用这个参数?当作g4e的一句命令来执行,还是把它保存到某个g4e变量中以便脚本调用?
请说一下具体的使用场景。

如果是读取uefi环境变量的话,那这个变量的数据类型是什么?utf-16le字符串,还是二进制数据?
g4e内部的字符串都是utf-8编码的,如果你想传递字符串的话,那得转码。

点评

没想到也惊动了flash大。 其实就是想传递一个不确定是啥的镜像名字进去然后引导启动。  详情 回复 发表于 2021-6-15 18:26
回复

使用道具 举报

1657#
发表于 2021-6-15 14:53:20 | 只看该作者

fmwqsn 说传参数

估计是受   linux  grub.exe   --confilg  $menuentry   的影响

把g4e做前置,其它efi环境用

如:
uefishell:    g4e.efi   --confilg  %menuentry%  (未知,这个引用 会不会是整体)
grub204: chainloader   --confilg  $menuentry
bootice写入bios NV存储,做 主板启动时,的Fx 菜单:g4e.efi   --confilg  “menuentry”

现在内置菜单,能起到相同的效果,一对一即可( 用的人  把g4e学到这个程序,也不用 什么参数了)
——————————————————————————————————————

或者 传进个 默认菜单 值 defaut    起动文件,pathfile  (这样,菜单必须 用脚本 写的足够通用)

————————————————————————————————————————

还是 抄菜单 来的 好,,是个  想法 或 趣向   

点评

whp大想的没错,我确实就是这个想法。 不过因为我想搞得东西名字不一定,所以不能写固定菜单。  详情 回复 发表于 2021-6-15 18:27
回复

使用道具 举报

1658#
发表于 2021-6-15 18:20:36 | 只看该作者
2011yaya2007777 发表于 2021-6-15 10:40
现在不支持启动参数。我不清楚你从外部UEFI shell 脚本启动g4e,需要传到什么数据。举个例子说说。
网启的 ...

我的想法是这样的:因为整天要在机房弄系统很枯燥,就寻思着偷懒。目标是往机器里放镜像然后启动。我试着做了个可以P2P下载镜像的efi系统(还在调试),通过接受参数用P2P下载指定镜像。我想Linux和windows都能支持,所以用g4e做引导。因为g4e没有网络功能,从ipxe上sanhook出来的盘进了g4e之后也看不到,所以就没法确定要启动的镜像名称了。所以寻思着有什么方法可以把镜像名字带进去。因为要启动的镜像名字也不确定,没法写固定菜单。
网起随机黑屏的原因我也始终没找到,黑屏时间好像没啥规律,很懵。
回复

使用道具 举报

1659#
发表于 2021-6-15 18:26:25 | 只看该作者
wintoflash 发表于 2021-6-15 14:08
你具体想怎么用这个参数?当作g4e的一句命令来执行,还是把它保存到某个g4e变量中以便脚本调用?
请说一 ...

没想到也惊动了flash大。
其实就是想传递一个不确定是啥的镜像名字进去然后引导启动。
回复

使用道具 举报

1660#
发表于 2021-6-15 18:27:54 | 只看该作者
2011whp 发表于 2021-6-15 14:53
fmwqsn 说传参数

估计是受   linux  grub.exe   --confilg  $menuentry   的影响

whp大想的没错,我确实就是这个想法。
不过因为我想搞得东西名字不一定,所以不能写固定菜单。
回复

使用道具 举报

1661#
发表于 2021-6-15 19:27:18 来自手机 | 只看该作者
报告一个情况,实机测试,华硕主板:
esp分区格式化为fat32时,内置菜单可以timeout=1结束后自动转入efi/grub/menu.lst。
esp分区格式化为ntfs时,timeout无效,必须手动回车才能转至menu.lst。

使用三个金士顿优盘,8G,16G,32G,多次格式化测试,均为以上表现。
不知道其他坛友有无类似情形。
回复

使用道具 举报

1662#
发表于 2021-6-15 21:32:49 | 只看该作者

我是用 grub2 加载 g4e 的。
  1. menuentry "grub4dos" {
  2.   chainloader /boot/bootx64.efi "microsoft, fuck you!"
  3. }
复制代码

测试用外部命令:
cmdline.zip (2.46 KB, 下载次数: 6)
理论上支持中文,但是 grub2 chainloader 不支持传送中文,所以没测试。
另外 @2011yaya2007777 请问我怎么样才能把字符串保存到一个 g4e 变量里面以便调用,比如 echo %?%

点评

[attachimg]481797[/attachimg]  详情 回复 发表于 2021-6-16 19:16
回复

使用道具 举报

1663#
 楼主| 发表于 2021-6-16 08:46:37 | 只看该作者
我的想法是这样的:因为整天要在机房弄系统很枯燥,就寻思着偷懒

我觉得可以使用菜单来实现你的想法。
在菜单使用条件判断,什么情况下使用哪个pe。
也可以在菜单调用批处理。使用强大的批处理实现。

点评

唔,我一开始也是这么想的,也是这么做的。不过实际用的时候要批量起机器的时候还是得挨个机器操作一遍。一个两个机器还好说,十几二十个机器也还行,几十上百个机器就较劲了。机房里两千台多个服务器如果碰见大维护  详情 回复 发表于 2021-6-16 10:17
回复

使用道具 举报

1664#
 楼主| 发表于 2021-6-16 09:07:29 | 只看该作者
另外 @2011yaya2007777 请问我怎么样才能把字符串保存到一个 g4e 变量里面以便调用,比如 echo %?%

set 变量名=字符串
echo %变量名%

点评

我说的是在外部命令里面,怎么样才能返回一个字符串,存到%?%里面。不是g4d脚本。  详情 回复 发表于 2021-6-16 09:53
回复

使用道具 举报

1665#
 楼主| 发表于 2021-6-16 09:09:07 | 只看该作者
esp分区格式化为ntfs时,timeout无效,必须手动回车才能转至menu.lst。

手动回车后,是进入命令行?还是你的菜单界面?

点评

他说的应该是这种情况(见下图)。20210426及以前版本的g4e可以自动连接EFI\gurb\menu.lst引导文件,新版本的g4e不能自动引导菜单,必须要手动才行,请修正 [attachimg]481989[/attachimg]  详情 回复 发表于 2021-6-19 15:11
回复

使用道具 举报

1666#
发表于 2021-6-16 09:53:06 | 只看该作者
本帖最后由 wintoflash 于 2021-6-16 10:47 编辑
2011yaya2007777 发表于 2021-6-16 09:07
set 变量名=字符串
echo %变量名%

我说的是在外部命令里面,怎么样才能返回一个字符串,存到%?%里面。不是g4d脚本。
找到了

点评

意思是你这个外部命令,能找到 启动g4e.efi的参数 ,起码能找到grub2 chainloader 时的参数 办法是找个内存区,弄成g4e的扩展变量 ,参见 2015版 grub4dos.chm帮助的 6.14节 后面部分,(这个功能我试过  详情 回复 发表于 2021-6-16 14:07
回复

使用道具 举报

1667#
发表于 2021-6-16 10:17:45 | 只看该作者
2011yaya2007777 发表于 2021-6-16 08:46
我觉得可以使用菜单来实现你的想法。
在菜单使用条件判断,什么情况下使用哪个pe。
也可以在菜单调用批 ...

唔,我一开始也是这么想的,也是这么做的。不过实际用的时候要批量起机器的时候还是得挨个机器操作一遍。一个两个机器还好说,十几二十个机器也还行,几十上百个机器就较劲了。机房里两千台多个服务器如果碰见大维护或者大规模割接,就哈利路亚了,备不住还得改批处理,比直接手动起还慢。另外,机房里受到网络状况、机器故障、实时需求等各种因素影响,哪个机器什么时候要起哪个镜像压根没法预测,批处理我实在是写不出来(我是废物OTZ)……所以想通过网络搞全自动。在一个地方把要启动目标统一放好,然后只要挨个把机器点亮就行了。(不过这么搞完我估计要失业的感觉。。。)

点评

试试这个外部命令获取efi命令行 [attachimg]481768[/attachimg] 用法: cmdline [变量名] 把命令行字符串保存到某个变量里面,比如 cmdline abcd,之后就可以用 %abcd% 来获取这个命令行了。  详情 回复 发表于 2021-6-16 10:51
回复

使用道具 举报

1668#
 楼主| 发表于 2021-6-16 10:42:31 | 只看该作者
唔,我一开始也是这么想的,也是这么做的

那就是说,每启动一个机器,就得输入一个参数。
菜单就设置一项妥了。每次输入一个参数,和每次修改一项菜单,劳动量好像是一样的。

点评

挨个机器弄参数肯定不现实,所以我现在的策略是先从UEFI shell 连接网络,获取到自己要启动的镜像,下载之后用g4e来引导。只要能把镜像名字传进去的话,理论上应该有可以完全自动的可能。(但愿别出意外)  详情 回复 发表于 2021-6-16 11:01
回复

使用道具 举报

1669#
发表于 2021-6-16 10:51:27 | 只看该作者
fmwqsn 发表于 2021-6-16 10:17
唔,我一开始也是这么想的,也是这么做的。不过实际用的时候要批量起机器的时候还是得挨个机器操作一遍。 ...

试试这个外部命令获取efi命令行
cmdline.zip (981 Bytes, 下载次数: 6)

用法:
cmdline [变量名]
把命令行字符串保存到某个变量里面,比如
cmdline abcd,之后就可以用 %abcd% 来获取这个命令行了。

点评

flash大威武。 我做了个实验性的脚本试了下,可以生效。 我看看继续折腾折腾。  详情 回复 发表于 2021-6-16 18:51
经 试验 这个 和 我说的 那个 (md)法, 都 躲不 过 set * 不过write (md) 法 1. 是容量大,( 和map内存区 并存,方便 驱动自定义 数据的回找) 2. set * 消失 后可以重建 (数据还在那里  详情 回复 发表于 2021-6-16 18:51
回复

使用道具 举报

1670#
发表于 2021-6-16 11:01:20 | 只看该作者
2011yaya2007777 发表于 2021-6-16 10:42
那就是说,每启动一个机器,就得输入一个参数。
菜单就设置一项妥了。每次输入一个参数,和每次修改一项 ...

挨个机器弄参数肯定不现实,所以我现在的策略是先从UEFI shell 连接网络,获取到自己要启动的镜像,下载之后用g4e来引导。只要能把镜像名字传进去的话,理论上应该有可以完全自动的可能。(但愿别出意外)
回复

使用道具 举报

1671#
 楼主| 发表于 2021-6-16 11:11:31 | 只看该作者
我说的是在外部命令里面,怎么样才能返回一个字符串,存到%?%里面。不是g4d脚本。

我没有测试过,我觉得在外部命令里面与在内部命令里面,使用变量是一样的。

内置变量十,
内置变量 %?% ,用来保存命令返回的字符串信息,目前可用的信息有两个:
1,cat --locate= 或 cat --locatei= 返回最后一个找到的位置
注:如果未找到指定的字符串,变量 @retval 将返回 0 ,如果找到,变量 @retval 将返回找到的<数量>。
    grub> cat --locate=file0 --number=3 /$MFT
    0 400 800
    grub> echo %?%
    0x800
2,%?%=Start_Sector
    grub> map --status=0
    grub> echo %?%
    0x1FE100
在外部/内部命令里一样可以运行。

如果要从外部命令里返回一个值,或者字符串,可以把外部命令的返回值设置为指针,由指针传回数据。
回复

使用道具 举报

1672#
发表于 2021-6-16 11:36:00 | 只看该作者
2011yaya2007777 发表于 2021-6-16 09:09
手动回车后,是进入命令行?还是你的菜单界面?

手动回车后才能进入菜单界面。

今天在qemu中测试,也是如此,需手动回车才能进入外置自定义菜单menu.lst。
论坛权限受限,不能上图。

另:1652#反映的情形,应该跟我遇到的情形一样.
********************************************
magicphoenix 发表于 2021-6-5 23:42:51 | 1652#
終於支援UEFI了,真是太棒了
讚讚讚讚讚
BOOTX64.EFI 好像不會直接執行 Menu.lst
必須按Enter才會開始執行 Menu.lst
********************************************
回复

使用道具 举报

1673#
发表于 2021-6-16 14:07:27 | 只看该作者
本帖最后由 2011whp 于 2021-6-16 20:11 编辑
wintoflash 发表于 2021-6-16 09:53
我说的是在外部命令里面,怎么样才能返回一个字符串,存到%?%里面。不是g4d脚本。
找到了

意思是你这个外部命令,能找到 启动g4e.efi的参数    ,起码能找到grub2  chainloader 时的参数


办法是找个内存区,弄成g4e的扩展变量 ,参见   2015版 grub4dos.chm帮助的  6.14节 后面部分,(这个功能我试过能用的)
set @extend 0x40000 10   意思是  从 0x40000处(注意扇区对齐)建 10个变量的 内存区


实际占用 11个扇区,
     第1个扇区,每8个字符对应一个 变量名
     第2个扇区是第一个变量的值
     ………………
     第11个扇区是第10个变量的值


你用外部命令:直写内存 ,g4e 用 set @extend 0x40000 10   声明一下 就有了

和普通 变量是一样的用法。

回复

使用道具 举报

1674#
发表于 2021-6-16 17:25:54 | 只看该作者
本帖最后由 2011whp 于 2021-6-16 18:37 编辑

记得以前 提过 为驱动 开发玩家 准备个 交换区,正好借这个 参数传 实现下,

这个内存区  哪一段安全呢,这段 0x40000   内存 run 批处理用了没有?

或者 顺便 也来个 GUID式的 efi变量 交互(不太懂,就是ventoy式的那种)

经试验:


申明 扩展变里时,把 变量名 清空了,重写一下 变量名,即可,
申明 扩展变里 不会清空变量值
这样的话,申明后
自个写变量名: write (md)0x200+1  outval01outval02outval03outval04outval05outval06outval07outval08outval09outval10
10个扇区:5KB容量,能交互好多信息了
这个外部命令现在 能找到 grub2的  参数,下一步,找 uefishell  和  bios 的


2015版 帮助  10节
在grub4dos环境中,以下两块内存可以放心使用:

1、0x60000-0x60400(即内存384KB开始的长度为1KB的区域,扇区序列表示法为(md)0x300+2),经常用于菜单或批处理临时使用。

2、0x40000-0x44FFF(即内存256KB至275KB之间,长度为20KB,扇区序列表示法为(md)0x200+40)也是可以使用的(这一段是最常使用的,且空间较大)。

建议写到  (md)0x21c处    因为帮助 这么说的,也许有人会用 刚开始的部分,但一般用不到那么多(或者说一般人不用扩展变量)
回复

使用道具 举报

1675#
发表于 2021-6-16 18:51:39 | 只看该作者
wintoflash 发表于 2021-6-16 10:51
试试这个外部命令获取efi命令行

经 试验   这个 和 我说的 那个 (md)法,  都 躲不 过   set  *


不过write (md)  法
  1.  是容量大,( 和map内存区 并存,方便 驱动自定义 数据的回找)
  2.  set *  消失 后可以重建  (数据还在那里,只是变量名 没有了,重建即可)
回复

使用道具 举报

1676#
发表于 2021-6-16 18:51:49 | 只看该作者
wintoflash 发表于 2021-6-16 10:51
试试这个外部命令获取efi命令行

flash大威武。
我做了个实验性的脚本试了下,可以生效。
我看看继续折腾折腾。

点评

折腾了个 什么 uefi系统呢, 基于什么,IPx 还是 UEFIshell ipx 论坛的网络启动区,能启pe ,你的目标 是 安装系统 ?  详情 回复 发表于 2021-6-16 18:55
回复

使用道具 举报

1677#
发表于 2021-6-16 18:55:43 | 只看该作者
本帖最后由 2011whp 于 2021-7-16 20:40 编辑
fmwqsn 发表于 2021-6-16 18:51
flash大威武。
我做了个实验性的脚本试了下,可以生效。
我看看继续折腾折腾。

折腾了个 什么 uefi系统呢,

基于什么,IPxe  还是  UEFIshell

ipxe    论坛的网络启动区,能启pe ,你的目标 是 安装系统 ?
意思 是  wintoflash 这个外部命令,不管是什么环境启动g4e, 都 能找到,(或者说,实质是找到了 标准的bios环境句柄了)

点评

我没搞那么高深的东西啦…… 单纯就是为了自己能偷懒,想弄个机房里能自动下载镜像自动启动机器的玩意来着。 目标是基于uefi shell,获取自己的目标镜像名,然后起一个P2P给下载下来,最后用g4e给启动起来。 我到  详情 回复 发表于 2021-6-16 19:15
回复

使用道具 举报

1678#
发表于 2021-6-16 19:15:04 | 只看该作者
2011whp 发表于 2021-6-16 18:55
折腾了个 什么 uefi系统呢,

基于什么,IPx  还是  UEFIshell

我没搞那么高深的东西啦……
单纯就是为了自己能偷懒,想弄个机房里能自动下载镜像自动启动机器的玩意来着。
目标是基于uefi shell,获取自己的目标镜像名,然后起一个P2P给下载下来,最后用g4e给启动起来。
我到现在G4E的编译环境都没搭建成功。几位大佬给的解答和教程我都有试,死也不知道为啥。麻了。等回头换个电脑试试。

点评

可以 把 win10.iso 搞成 带 svbus 驱动的,这样g4e 就可以map 安装win10  详情 回复 发表于 2021-6-16 20:24
回复

使用道具 举报

1679#
发表于 2021-6-16 19:16:41 | 只看该作者
本帖最后由 2011whp 于 2021-6-16 20:40 编辑
wintoflash 发表于 2021-6-15 21:32
我是用 grub2 加载 g4e 的。

测试用外部命令:


2011yaya2007777  有什么办法看这个变量的 二进制呢


不过,功能性的,就不用汉字了,没什么影响  

点评

不是,我前面说过了,是 grub2 的 chainloader 自己的问题。它的转码代码只适用于 ASCII 码。 uefi cmdline 是 UTF-16 LE 编码的,且只支持 UCS-2 部分。(U+0000 ~ U+FFFF, 两个字节) grub2/grub4dos 内部字符串  详情 回复 发表于 2021-6-16 20:24
回复

使用道具 举报

1680#
发表于 2021-6-16 20:24:09 | 只看该作者
fmwqsn 发表于 2021-6-16 19:15
我没搞那么高深的东西啦……
单纯就是为了自己能偷懒,想弄个机房里能自动下载镜像自动启动机器的玩意来 ...

可以 把  win10.iso 搞成 带 svbus 驱动的,这样g4e 就可以map 安装win10

这个道 是 试过
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-4 14:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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