无忧启动论坛

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

[求助] 如何动态设置grub4dosuefi的工作目录

[复制链接]
跳转到指定楼层
1#
发表于 2025-5-16 09:09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,grub4dosuefi(以下简称g4e)的默认工作目录是/efi/grub,如果是用其他efi程序调用g4e,如果不是放在工作目录,会调用失败,有时候会进入一个grub的命令行界面。
我目前采用的方法是,内置menu.lst,定制一个g4e。
mkimage -p /8888 -o BOOTX64.EFI -O x86_64-efi -c menu.lst
通过这样,就能把g4e放在8888目录。
然后现在有了新的需求,要求8888目录可以动态改名,然后通过g4e引导目录内的menu.lst。这时候就遇到问题了,上面的p参数是写死的,没法通用。
使用deepseek,要求设置工作目录,以及动态加载目录内menu.lst,代码如下。

timeout 0
default 0
# 设置根设备为当前设备
root (bd)
# 获取当前路径
set /a current_path=%@root%
set /a current_path=%current_path:~1%
# 设置当前路径为工作路径
prefix %current_path%
# 检查当前目录下是否存在menu.lst文件
if exist %current_path%/menu.lst goto boot_menu
if exist menu.lst goto boot_menu
# 如果当前目录没有menu.lst,尝试在上级目录查找
set /a current_path=%current_path%/
set /a parent_path=%current_path:~0,-1%
if exist %parent_path%/menu.lst goto boot_parent

# 如果都找不到,显示错误信息
echo Error: menu.lst not found in current or parent directory!
pause
fallback 1
:boot_menu
configfile %current_path%/menu.lst
goto end
:boot_parent
configfile %parent_path%/menu.lst
goto end
:end

但是这些代码失败了,请问各位大神,大概需要怎么写代码,或者说,是不是无法实现这个功能。

2#
发表于 2025-5-16 10:26:11 来自手机 | 只看该作者
建一个 /efi/grub/ 目录费事吗?特别费事的话,就直接把菜单内置到g4e里 ,直接执行好了。

点评

是环境特殊,引导g4e那个程序就是这样实现的,可以从任意子目录启动一个系统镜像,但是他在引导linux系统时有点问题,我就想用g4e帮助解决。 目前在任意目录启动的问题解决了。使用下面这样的命令定制g4e。 mkimag  详情 回复 发表于 2025-5-16 10:50
回复

使用道具 举报

3#
 楼主| 发表于 2025-5-16 10:50:23 | 只看该作者
2011yaya2007777 发表于 2025-5-16 10:26
建一个 /efi/grub/ 目录费事吗?特别费事的话,就直接把菜单内置到g4e里 ,直接执行好了。

是环境特殊,引导g4e那个程序就是这样实现的,可以从任意子目录启动一个系统镜像,但是他在引导linux系统时有点问题,我就想用g4e帮助解决。
目前在任意目录启动的问题解决了。使用下面这样的命令定制g4e。
mkimage -p . -o BOOTX64.EFI -O x86_64-efi -c menu.lst
就是动态加载目录内menu.lst这个还没解决。
回复

使用道具 举报

4#
 楼主| 发表于 2025-5-16 10:58:29 | 只看该作者
目前的问题是,怎么获取当前BOOTX64.EFI所在的目录名。
回复

使用道具 举报

5#
发表于 2025-5-16 11:43:02 | 只看该作者
用批处理:  g4e接收 参数,  分析参数.


参考: http://bbs.wuyou.net/forum.php?m ... &fromuid=413782

点评

有空研究一下你这个,感觉有戏。  详情 回复 发表于 2025-5-23 15:37
回复

使用道具 举报

6#
发表于 2025-5-16 11:50:35 来自手机 | 只看该作者
你就一个menu.lst吧,直接把这个菜单内置就可以了,不用查找。
回复

使用道具 举报

7#
发表于 2025-5-16 12:04:19 | 只看该作者
来学习一下
回复

使用道具 举报

8#
发表于 2025-5-16 12:13:53 | 只看该作者
来学习一下..........
回复

使用道具 举报

9#
 楼主| 发表于 2025-5-16 12:36:16 | 只看该作者
这个帖子完结吧,查了半天参数,只有%@root%这是当前根目录信息,没有工作目录这个概念。最后是这样实现的。
回复

使用道具 举报

10#
 楼主| 发表于 2025-5-16 12:38:36 | 只看该作者
把g4e放进img里面,用那个程序加载引导img。如果要修改引导文件,用DG加载img后,修改img里面的/efi/grub/menu.lst文件。最终还是靠那个引导程序本身实现功能。

点评

用什么引导的g4e?  详情 回复 发表于 2025-5-16 13:08
回复

使用道具 举报

11#
发表于 2025-5-16 13:08:19 | 只看该作者
tuice0liu 发表于 2025-5-16 12:38
把g4e放进img里面,用那个程序加载引导img。如果要修改引导文件,用DG加载img后,修改img里面的/efi/grub/m ...

用什么引导的g4e?

点评

用的云固件引导的g4e,这个引导程序在设置上就是一个目录一个引导镜像,设置好vd.config和目录里面的menu.config,就能启动这个引导镜像了,非常方便,但是引导方面有限制,才有我发帖问的这个问题。  详情 回复 发表于 2025-5-23 15:29
回复

使用道具 举报

12#
 楼主| 发表于 2025-5-23 15:29:05 | 只看该作者
wintoflash 发表于 2025-5-16 13:08
用什么引导的g4e?

用的云固件引导的g4e,这个引导程序在设置上就是一个目录一个引导镜像,设置好vd.config和目录里面的menu.config,就能启动这个引导镜像了,非常方便,但是引导方面有限制,才有我发帖问的这个问题。

点评

具体的限制是什么? 不是很明白你为什么非得绕一大圈启动g4e。  详情 回复 发表于 2025-5-23 16:33
回复

使用道具 举报

13#
 楼主| 发表于 2025-5-23 15:31:58 | 只看该作者
我最近在带娃,所以没这么看论坛了,抱歉回复晚了。有个事情问一下,g4e有没有grub2类似的source的功能,就是
source /boot/grub/config.cfg
这样包含其它引导配置的功能?
回复

使用道具 举报

14#
 楼主| 发表于 2025-5-23 15:37:18 | 只看该作者
2011whp 发表于 2025-5-16 11:43
用批处理:  g4e接收 参数,  分析参数.

有空研究一下你这个,感觉有戏。
回复

使用道具 举报

15#
发表于 2025-5-23 16:33:15 | 只看该作者
tuice0liu 发表于 2025-5-23 15:29
用的云固件引导的g4e,这个引导程序在设置上就是一个目录一个引导镜像,设置好vd.config和目录里面的menu ...

具体的限制是什么?
不是很明白你为什么非得绕一大圈启动g4e。

点评

我大概说一下他启动的方式。 分区根目录vd.config的内容: include \8888\menu.config 8888目录内menu.config的内容: menuentry "8888" { icon "8888.png" loader "BOOTX64.EFI" desc "grub4dos88  详情 回复 发表于 2025-5-23 20:43
回复

使用道具 举报

16#
 楼主| 发表于 2025-5-23 20:43:40 | 只看该作者
wintoflash 发表于 2025-5-23 16:33
具体的限制是什么?
不是很明白你为什么非得绕一大圈启动g4e。

我大概说一下他启动的方式。

分区根目录vd.config的内容:
include \8888\menu.config

8888目录内menu.config的内容:
menuentry "8888" {
  icon "8888.png"
  loader "BOOTX64.EFI"
  desc "grub4dos8888引导菜单"
}

BOOTX64.EFI是自定义的g4e文件,内置了引导菜单。
通过这样,就能在启动程序里面多一个g4e的启动项。

但是他还有一个要求,就是8888目录可以任意改名,改了之后修改vd.config还能继续使用。

他这边linux系统的引导不支持,没法直接使用
kernel /8888/vmlinuz pfix=fsck psubdir=/8888
initrd /8888/initrd.gz
这样的引导代码启动linux系统,我想veket镜像加上去,就只能直接loader "BOOTX64.EFI"来启动veket,通过内置引导代码的方式成功了。但是一旦把8888目录修改,就没法启动veket了。

后来想到一个方法,把g4e的引导菜单menu.lst放在8888目录,一旦把8888目录改名,修改menu.lst就行了。这样就变成我目前需要解决的事情,怎么用g4e引导当前目录的menu.lst菜单。

这个问题不解决也没事,反正目前也能用,无非是每次新增一个linux系统,自定义一次g4e而已。

点评

一眼就是refind的菜单系统 menuentry "Linux" { loader /8888/vmlinuz initrd /8888/initrd.gz options "pfix=fsck psubdir=/8888" }  详情 回复 发表于 2025-5-23 21:47
回复

使用道具 举报

17#
发表于 2025-5-23 21:47:27 | 只看该作者
tuice0liu 发表于 2025-5-23 20:43
我大概说一下他启动的方式。

分区根目录vd.config的内容:

一眼就是refind的菜单系统
menuentry "Linux" {
    loader   /8888/vmlinuz
    initrd   /8888/initrd.gz
    options  "pfix=fsck psubdir=/8888"
}

点评

他这个就是基于refind,但是进行了改进,目前options这块功能还在实现中,如果实现了,上面说的这个问题就不存在了。  详情 回复 发表于 2025-5-23 22:22
回复

使用道具 举报

18#
 楼主| 发表于 2025-5-23 22:22:58 | 只看该作者
wintoflash 发表于 2025-5-23 21:47
一眼就是refind的菜单系统
menuentry "Linux" {
    loader   /8888/vmlinuz

他这个就是基于refind,但是进行了改进,目前options这块功能还在实现中,如果实现了,上面说的这个问题就不存在了。
回复

使用道具 举报

19#
发表于 2025-5-28 19:52:39 来自手机 | 只看该作者
本帖最后由 blank007 于 2025-5-30 13:46 编辑

        Windows 的 bootmgrfw.efi 有一个特性:         优先加载同目录下的BCD文件。如果当前目录下没有,则去 找  \efi\microsoft\boot 下的 BCD文件。
         楼主应该是希望 grub4uefi 也有类似的特点

点评

差不多就是你这个意思,还要再加上一个条件,目录名要可以修改的。  详情 回复 发表于 6 天前
回复

使用道具 举报

20#
 楼主| 发表于 6 天前 | 只看该作者
blank007 发表于 2025-5-28 19:52
Windows 的 bootmgrfw.efi 有一个特性:          优先加载同目录下的BCD文件。如果当前目录下没有 ...

差不多就是你这个意思,还要再加上一个条件,目录名要可以修改的。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-6-5 10:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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