无忧启动论坛

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

[求助] GRUB4DOS for uefi引导ghost的win10系统

[复制链接]
跳转到指定楼层
1#
发表于 6 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 b6XOgS 于 2024-12-17 21:01 编辑

各位大佬,原系统是256g的固态,uefi引导的win10,用磁盘管理软件,从这个256G里分一个80g空间出来,ghost一个win10进去,然后配置GRUB4DOS for uefi接管引导,开机时如果不按特定的键,不出来引导菜单,默认进第一个系统。

需要解决的问题:1.GRUB4DOS for uefi接管引导     (这个配置好了)
                          2. grub引导ghost的win10              (这个没配置成功)
                          3.默认进入原先的win10系统                      (这个配置好了)
                          4. 设置开机按特定的键,出来grub菜单,选择系统    (这个配置好了)
2#
 楼主| 发表于 6 天前 | 只看该作者
今天加的一个grub群,从群的共享文件里找到一个README_GRUB4DOS_CN.txt,里面有这一段表述:

2010-12-31 更新:
        1.pause命令增强,增加了显示按键扫描码的功能。需要debug 为-1.
        例子:显示一个按键扫描码
        debug -1 && pause && debug 1
        注:此功能已为被参数--test-key代替。

        2.hiddenmenu命令增强。增加一个--chkpass参数
                功能:        在隐藏菜单的时候按Esc键要输入正确的密码才可以显示菜单。
                注意:        1.该功能启用之后,如果按了其它按键则直接启动默认菜单。
                          默认的Esc按键可以自由设置。使用--chkpass=KEY
                        2.菜单初始化有password命令时才需要输入密码。
                        3.按键代码如果不清楚可以使用上面的功能来获取。
        例子:        hiddenmenu --chkpass=0x8500        按F11键才可以显示菜单。
                hiddenmenu --chkpass                 按Esc键才可以显示菜单。
                hiddenmenu --chkpass=0x2200        按Alt+G显示菜单。

按照这个配置,需求的第四项也可以了。
回复

使用道具 举报

3#
 楼主| 发表于 6 天前 | 只看该作者
主硬盘分区情况:
原来主分区只有efi分区和win10的分区,后来我把win10所在的分区,分一个90G空间出来,ghost了一个win10进去,现在就是efi分区+ghost的win10分区+原来的win10,按照教程配置了GRUB4DOS for uefi,关闭了bios里的安全引导,可以开机出来grub引导菜单,菜单里只能引导原先的win10,ghost的win10怎么配置都不行。




附上menu.lst

# 这是一个样品 menu.lst 文件。你应该对它做些改动。
# 它必须是 UTF-8 编码,以支持多种语言。
# 字体应该是 unifont.hex 格式。

hiddenmenu --chkpass=0x8500

#设置倒计时(秒)
timeout 0

#设置第一项为默认值
default 0

#设置字符颜色(高32位是背景色,低32位是前景色。在命令行执行:echo -rrggbb,可查看对应的颜色。)
#color normal=0xff9933 highlight=0xffff00 helptext=0xff00ff heading=0x66ff00

#设置图形模式(可使用 graphicsmode 探测系统支持的图形模式)
#graphicsmode -1 800(水平像素)

#加载背景图
#splashimage /efi/grub/splashimage.jpg || splashimage /boot/grub/splashimage.bmp
#加载unifont字体(如果不是 16*16 字体,需增加参数,如 --font-high=24)
#font /efi/grub/unifont.hex.gz

#获取水平像素,加载不同尺寸的字体及背景图
#calc *0x834c > nul ;; set a=%@retval%
#if %a%>=801 && font --font-high=40 /efi/grub/menu40.hex
#if %a%<=800 && font /efi/grub/unifont.hex.gz && splashimage /efi/grub/lt.jpg

#判断启动环境:if %@uefi%==64    0/32/64=bios/uefi_x86/uefi_x64

#设置菜单框
#setmenu --box x=4 w=60 y=6 h=9 l=2
#设置中文菜单按键帮助
#setmenu --lang=zh
#设置自动菜单编号
#setmenu --auto-num-on
#设置字符串信息
#setmenu --string=x=y=颜色="字符串"
#设置日期时间
#setmenu --string=x=y=颜色="date&time=yyyy-MM-dd  HH:mm:ss"
#设置倒计时
#setmenu --timeout=x=y=颜色
#更多菜单编辑功能、动画、图像菜单等等,可参考http://bbs.wuyou.net/forum.php?m ... &extra=page%3D3

title 启动 windows
chainloader /efi/microsoft/boot/bootmgfw.efi

title Windows 10
root (hd1,1)
makeactive
chainloader +1


title Windows 10
root (hd1,2)
makeactive
chainloader +1


title 退出grub4dos
exit_g4d

title 重启
reboot

title 关机
halt



点评

这个确实就是efi模式能用的么?测试成功了吗?  详情 回复 发表于 6 天前
本人对 UEFI 的知识,缺乏了解。抱歉,帮不上忙。 不过,我能看到您在 UEFI 的 menu.lst 里面,却使用了 BIOS 的 menu.lst 命令: root (hd1,1) makeactive chainloader +1 恕我直言,您是不是像我一样,  详情 回复 发表于 6 天前
回复

使用道具 举报

4#
发表于 6 天前 | 只看该作者
感谢分享
回复

使用道具 举报

5#
发表于 6 天前 | 只看该作者
感谢分享
回复

使用道具 举报

6#
发表于 6 天前 | 只看该作者
两个方案:
第一方案是直接使用bcd菜单做主菜单,各分区的windows都建立引导项到这个bcd菜单
菜单等待时间是1秒至3秒,视实际情况选择,不按键则启动默认项,按上下键则可选择所需引导项

第二方案是使用grub4dos for uefi 等做主菜单,各分区的windows分别建立启动文件到各自分区,主菜单链接引导各分区的启动文件
主菜单等待时间是1秒至3秒,视实际情况选择,不按键则启动默认项,按上下键则可选择所需引导项

------------------------------------
使用bcdboot建立各分区windows的引导项

第一方案是将所有引导项都建立到efi分区的bcd (同一个bcd)
第二方案是将各分区windows的引导项分别建立到各分区的bcd (每个windows分区都有各自的bcd)

第二方案的主菜单类似下面这样:
title Windows 10 (1)
chainloader (hd1,1)/efi/microsoft/boot/bootmgfw.efi

title Windows 10 (2)
chainloader (hd1,2)/efi/microsoft/boot/bootmgfw.efi

如果对grub分区符号把握不准,也可以
将第一分区的 /efi/microsoft/boot/bootmgfw.efi改名为/efi/microsoft/boot/boot1.efi
将第二分区的 /efi/microsoft/boot/bootmgfw.efi改名为/efi/microsoft/boot/boot2.efi
然后
title Windows 10 (1)
find --set-root /efi/microsoft/boot/boot1.efi
chainloader /efi/microsoft/boot/boot1.efi

title Windows 10 (2)
find --set-root /efi/microsoft/boot/boot2.efi
chainloader /efi/microsoft/boot/boot2.efi

点评

谢谢,我消化消化。  详情 回复 发表于 6 天前
回复

使用道具 举报

7#
 楼主| 发表于 6 天前 | 只看该作者
hilsonma 发表于 2024-12-17 21:06
两个方案:
第一方案是直接使用bcd菜单做主菜单,各分区的windows都建立引导项到这个bcd菜单
菜单等待时 ...

谢谢,我消化消化。

点评

第二方案不能使用windows更新,否则报错  详情 回复 发表于 6 天前
回复

使用道具 举报

8#
发表于 6 天前 | 只看该作者
b6XOgS 发表于 2024-12-17 21:10
谢谢,我消化消化。

第二方案不能使用windows更新,否则报错

点评

请教大佬:只要不使用windows系统官方的引导(bootmgr+bcd),系统更新后就会出现回退,提示无法完成更新,然后过段时间又提示更新,更新完再回退,如此循环不胜其烦..... 对不对? 有什么解决办法吗 ? 我  详情 回复 发表于 6 天前
回复

使用道具 举报

9#
发表于 6 天前 | 只看该作者
b6XOgS 发表于 2024-12-17 20:17
主硬盘分区情况:
原来主分区只有efi分区和win10的分区,后来我把win10所在的分区,分一个90G空间出来,gh ...

本人对 UEFI 的知识,缺乏了解。抱歉,帮不上忙。

不过,我能看到您在 UEFI 的 menu.lst 里面,却使用了 BIOS 的 menu.lst 命令:

root (hd1,1)
makeactive
chainloader +1

恕我直言,您是不是像我一样,也是个 UEFI 的门外汉啊?

UEFI 与以前的 BIOS 完全不同。您应该满脑子的 .efi 文件才对。

chainloader +1 是加载一个引导扇区。这是典型的 BIOS 思维方式,肯定不行啊。

点评

哈哈,我是半个月前有这个需求,然后先搜到这个才认识了grub https://www.cfan.com.cn/2015/1103/123115.shtml  详情 回复 发表于 6 天前
回复

使用道具 举报

10#
 楼主| 发表于 6 天前 | 只看该作者
本帖最后由 b6XOgS 于 2024-12-17 21:42 编辑
不点 发表于 2024-12-17 21:34
本人对 UEFI 的知识,缺乏了解。抱歉,帮不上忙。

不过,我能看到您在 UEFI 的 menu.lst 里面,却使用 ...

哈哈,我是半个月前有这个需求,然后先搜到这个才认识了grub

https://www.cfan.com.cn/2015/1103/123115.shtml




点评

现在都有 AI 了,您却搜到 10 年前的网页。是哪个搜索引擎把您带到 10 年前?  详情 回复 发表于 6 天前
回复

使用道具 举报

11#
发表于 6 天前 | 只看该作者
hilsonma 发表于 2024-12-17 21:22
第二方案不能使用windows更新,否则报错

请教大佬:只要不使用windows系统官方的引导(bootmgr+bcd),系统更新后就会出现回退,提示无法完成更新,然后过段时间又提示更新,更新完再回退,如此循环不胜其烦.....
       对不对? 有什么解决办法吗 ? 我电脑上好几个系统,一般有1-2个msdn.itellyou.cn下载的原版系统,且保持正常更新,当然也会有一两个用着顺手的精简系统,没啥问题时精简系统当作主力,有问题或想尝最新版时就会切换到原版系统,,我这种情况该怎么办才好?

点评

微软官方跟你闹脾气呢,臭毛病,没办法。  详情 回复 发表于 4 天前
要正常更新就要使用原生引导,除此之外我也没有解决方法。  详情 回复 发表于 5 天前
回复

使用道具 举报

12#
发表于 6 天前 | 只看该作者
感谢分享
回复

使用道具 举报

13#
发表于 6 天前 | 只看该作者
很好奇你是从哪里下载的grub4dos for uefi。
从官方地址下的压缩包里面是有示例菜单的。

而你非得到一些奇怪的地方找一些老掉牙的资料。

点评

我刚接触grub,以为就是一个程序,资料越收越多,才了解grub有两个分支,还分mbr和uefi下不同操作,像我这种刚接触,分不清代码是对应那个grub,看见大概意思相近,就抄过来调,调不通再找原因,  详情 回复 发表于 6 天前
回复

使用道具 举报

14#
发表于 6 天前 | 只看该作者
b6XOgS 发表于 2024-12-17 20:17
主硬盘分区情况:
原来主分区只有efi分区和win10的分区,后来我把win10所在的分区,分一个90G空间出来,gh ...

这个确实就是efi模式能用的么?测试成功了吗?
回复

使用道具 举报

15#
 楼主| 发表于 6 天前 | 只看该作者
wintoflash 发表于 2024-12-17 22:05
很好奇你是从哪里下载的grub4dos for uefi。
从官方地址下的压缩包里面是有示例菜单的。

我刚接触grub,以为就是一个程序,资料越收越多,才了解grub有两个分支,还分mbr和uefi下不同操作,像我这种刚接触,分不清代码是对应那个grub,看见大概意思相近,就抄过来调,调不通再找原因,
回复

使用道具 举报

16#
发表于 6 天前 | 只看该作者
b6XOgS 发表于 2024-12-17 21:40
哈哈,我是半个月前有这个需求,然后先搜到这个才认识了grub

https://www.cfan.com.cn/2015/1103/1231 ...

现在都有 AI 了,您却搜到 10 年前的网页。是哪个搜索引擎把您带到 10 年前?
回复

使用道具 举报

17#
发表于 6 天前 | 只看该作者
感谢分享
回复

使用道具 举报

18#
发表于 5 天前 | 只看该作者
likeyouli 发表于 2024-12-17 21:52
请教大佬:只要不使用windows系统官方的引导(bootmgr+bcd),系统更新后就会出现回退,提示无法完成更新 ...

要正常更新就要使用原生引导,除此之外我也没有解决方法。
回复

使用道具 举报

19#
发表于 5 天前 | 只看该作者
既然是uefi为啥要makeactive

点评

他是用 legacy BIOS 的思维方式,来做 UEFI 的启动。他没有意识到这根本性的差异。原谅他。  发表于 5 天前
回复

使用道具 举报

20#
发表于 5 天前 | 只看该作者
本帖最后由 mygamexxx 于 2024-12-18 08:24 编辑

先用BOOTICE,进入UEFI页,启动项管理-修改启动序列,配置UEFI启动顺序,确保首先启动G4E。
然后在/efi/grub/menu.lst中修改菜单,如果有多个WINDOWS系统,菜单必须分清是启动的哪个windows.
如果要启动的WINDOWS在(hd1,1),建议使用root (hd1,1) && chainloader /efi/microsoft/boot/bootmgr.efi

chainloder (hd0)+1表示加载硬盘第一扇区,即MBR......
chainloder (fd0)+1表示加载软盘第一扇区,即PBR(VBR、DBR) ......
chainloder (hd0,0)+1表示加载硬盘第一个分区第一扇区,也是PBR(VBR、DBR)......
chainloder (cd0)表示加载光驱的第17扇区,即光盘引导扇区
这是G4D的命令,可能不适用于G4E。并且你的root (hd1,1) && chainloader +1与root (hd1,2) &&  chainloader +1肯定是启动同一个系统,因为都是启动(hd1)硬盘的MBR。G4D启动时可以改为root (hd1,1) && chainloader (hd1,1)+1与root (hd1,2) &&  chainloader (hd1,2)+1试试。

另外,你的菜单

hiddenmenu --chkpass=0x8500

#设置倒计时(秒)
timeout 0

#设置第一项为默认值
default 0

这三项表示,隐藏菜单(按F11键才可以显示菜单),延时为0,默认菜单为第一条菜单,chainloader /efi/microsoft/boot/bootmgr.efi,所以只启动@boot启动盘下的/efi/microsoft/boot/bootmgr.efi。

点评

如果是 BIOS 启动,他的 chainloader +1 也没啥错误。当然了,他已经说是 UEFI 启动,所以就不适用了。 chainloader +1 是省略了当前 root 设备的写法。这是正确的。 先执行 root (hd1,1) 再执行 chainloader  详情 回复 发表于 5 天前
回复

使用道具 举报

21#
发表于 5 天前 | 只看该作者
本帖最后由 不点 于 2024-12-18 13:48 编辑
mygamexxx 发表于 2024-12-18 08:04
先用BOOTICE,进入UEFI页,启动项管理-修改启动序列,配置UEFI启动顺序,确保首先启动G4E。
然后在/efi/gr ...

如果是 BIOS 启动,他的 chainloader +1 也没啥错误。当然了,他已经说是 UEFI 启动,所以就不适用了。

chainloader +1 是省略了当前 root 设备的写法。这是正确的。

先执行 root (hd1,1) 再执行 chainloader +1,也就会执行 chainloader (hd1,1)+1,这就是启动 PBR。

同理,先执行 root (hd1,2) 再执行 chainloader +1,也就会执行 chainloader (hd1,2)+1,这是启动另一个 PBR。







可能 legacy BIOS 还没完全消失,所以,顺便提醒一下:

在 grub4dos for legacy BIOS 中,无论如何,root 命令(通常)是不可省略的。如果没有 root 命令,那也得有 rootnoverify 命令。如果都没有,那也得有 find --set-root 之类的命令。为什么呢?因为在 boot 命令执行的时候,它会把 CPU 的 DL 寄存器的值设定为 “当前设备的 BIOS 盘号”。而 root 命令、rootnoverify 命令以及 find --set-root 命令,就是用来设定 “当前设备的 BIOS 盘号” 的。

在 NTLDR 以及更早的系统下(DOS、Win98、Me、2000、XP),当前设备必须是 (fd0) 或 (hd0,,x),然后才可以 boot,否则,引导扇区中的代码会产生失败,无法启动操作系统。

从 BOOTMGR 开始,当前设备可以是 (hd1,x),(hd2,x) 等等了。

但假如您的启动方案里面包括了 NTLDR 或更早的系统,您还是应该尽量保证 boot 命令执行的那一刻,当前设备一定是 (hd0,x)。

注意,菜单命令末尾处可以省略 boot 命令。这条省略的 boot 命令,仍然是要自动执行的。也就是说,不管你是否忘了写最后这条 boot 命令,它都会执行。既然它执行,那就需要保证此时当前 root 设备一定是 (hd0,x)。

【补充】严格来说,影响 boot 时 BIOS 盘号 (CPU 的 DL 寄存器值)设定的,还有 chainloader /ntldr 之类的命令。chainloader 有个参数 --edx 可以用来设定 cpu 的 EDX 寄存器的值。某些引导扇区的正确执行,依赖于特定的 CPU 寄存器设定。chainloader 的这些不常用的参数,就是这样的用途。

点评

感谢不点大大的解释,还有一个不明白的地方: 比如: 第一块硬盘有三个主分区: root (hd0,1) 然后执行: chainloader +1与chainloader ()+1及chainloader (hd0)+1 三者的区别是什么?  详情 回复 发表于 5 天前
回复

使用道具 举报

22#
发表于 5 天前 | 只看该作者
不点 发表于 2024-12-18 09:56
如果是 BIOS 启动,他的 chainloader +1 也没啥错误。当然了,他已经说是 UEFI 启动,所以就不适用了。
...

感谢不点大大的解释,还有一个不明白的地方:
比如:
第一块硬盘有三个主分区:
root (hd0,1)
然后执行:
chainloader +1与chainloader ()+1及chainloader (hd0)+1
三者的区别是什么?

点评

hilsonma 解释得非常到位。 我顺便补充一个细节。 map 命令中的特殊处理。 map 命令的用法是 map 【源扇区序列文件或设备】 【目标设备或虚拟盘号】 记住,对于目标设备,只有其“盘号”是有用  详情 回复 发表于 5 天前
+1 与 ()+1 是一样的,都表示当前设备的第一个扇区 root (hd0,1) 之后 +1 和()+1 都表示(hd0,1)0+1 ,即第一个硬盘的第二个分区的第一个扇区,即该分区的分区引导记录(PBR) 注意这个扇区不是硬盘的第一个扇区(  详情 回复 发表于 5 天前
回复

使用道具 举报

23#
发表于 5 天前 | 只看该作者
来学习一下了
回复

使用道具 举报

24#
发表于 5 天前 | 只看该作者
mygamexxx 发表于 2024-12-18 11:57
感谢不点大大的解释,还有一个不明白的地方:
比如:
第一块硬盘有三个主分区:

+1 与 ()+1 是一样的,都表示当前设备的第一个扇区

root (hd0,1) 之后
+1 和()+1 都表示(hd0,1)0+1 ,即第一个硬盘的第二个分区的第一个扇区,即该分区的分区引导记录(PBR)
注意这个扇区不是硬盘的第一个扇区(不是MBR)

(hd0)+1 表示(hd0)0+1 ,即第一个硬盘的第一个扇区,即该硬盘的主引导记录(MBR)

点评

完全赞同。  发表于 5 天前
回复

使用道具 举报

25#
发表于 5 天前 | 只看该作者
mygamexxx 发表于 2024-12-18 11:57
感谢不点大大的解释,还有一个不明白的地方:
比如:
第一块硬盘有三个主分区:

hilsonma 解释得非常到位。

我顺便补充一个细节。

map 命令中的特殊处理。

map 命令的用法是

map    【源扇区序列文件或设备】    【目标设备或虚拟盘号】

记住,对于目标设备,只有其“盘号”是有用的,其分区号是忽略的。

比如,

map  /myimg   (hd0,3)
map  /myimg   (hd0)
map  /myimg   (0x80)

这三条命令是等价的。

另外,在 map 命令行里面,源扇区序列文件 (hd0,0)+1 被解释成分区 (hd0,0) 的全部扇区,而不是仅仅第一扇区。这一点可能大家都知道。

点评

谢谢两位大大的解释!!!  详情 回复 发表于 4 天前
回复

使用道具 举报

26#
发表于 4 天前 | 只看该作者
不点 发表于 2024-12-18 14:11
hilsonma 解释得非常到位。

我顺便补充一个细节。

谢谢两位大大的解释!!!
回复

使用道具 举报

27#
 楼主| 发表于 4 天前 | 只看该作者
楼上几位都太给力了,果然真言就一段话,都是老经验的总结。
回复

使用道具 举报

28#
发表于 4 天前 | 只看该作者
likeyouli 发表于 2024-12-17 21:52
请教大佬:只要不使用windows系统官方的引导(bootmgr+bcd),系统更新后就会出现回退,提示无法完成更新 ...

微软官方跟你闹脾气呢,臭毛病,没办法。
回复

使用道具 举报

29#
发表于 4 天前 | 只看该作者
谢谢分享
回复

使用道具 举报

30#
发表于 3 天前 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-23 01:24

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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