无忧启动论坛

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

[求助] grub4dos通过mbr引导扇区加载grub2失败原因?

[复制链接]
跳转到指定楼层
1#
发表于 2024-8-21 08:38:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
背景:BIOS+MBR模式,安装Deepin Linux,Deepin会将硬盘引导换成grub2,而我习惯使用grub4dos,当然,用grub4dos加载deepin非常简单。我想实现在必要的时候,可以通过grub4dos加载deepin自己安装的Grub2,重现刚安装好时deepin的启动菜单。

我知道可以通过 kernel core.img的方式加载grub2,也可以 copy boot.img+core.img=g2ldr,然后通过chainloader加载。

但是我想尝试一种新方式,我们知道grub2占领了硬盘的mbr引导扇区,如果我们将硬盘mbr(0磁道)的63个扇区保存成grub2.mbr,然后用chainloader grub2.mbr,是不是也可以启动grub2。但事实上就是这样操作失败了,我想知道失败的原因。按道理说,我将硬盘的mbr保存下来,再通过grub4dos加载这个保存的mbr,原理上跟系统直接从硬盘的mbr启动没有区别。

谁能给解释一下?
2#
发表于 2024-8-21 09:52:05 | 只看该作者
我只知道,bios模式的grub2生成的mbr其实就是boot.img,只是改写了前面部分数据和分区表部分,mbr太小,其中只记录了core.img的绝对扇区号码,好像是01,mbr应该是0扇区。然后core.img第一个山区又记录core.img剩余扇区数量,应该是连续存放的。
回复

使用道具 举报

3#
发表于 2024-8-21 09:54:50 | 只看该作者
汇编不懂

GRUB2及启动过程详解.pdf

725.28 KB, 下载次数: 17, 下载积分: 无忧币 -2

点评

参考这位兄弟上传的grub2启动过程详解这个pdf文件,可以知道,grub2将boot.img(这是真正的mbr)放到了LBA0扇区,而core.img则放到了LBA1-LBA67扇区,加载的过程也是LBA0加载LBA1,LBA1加载剩余的部分。 所以,我只  详情 回复 发表于 2024-8-21 10:49

评分

参与人数 2无忧币 +10 收起 理由
Climbing + 5 很给力!
likeyouli + 5 赞一个!

查看全部评分

回复

使用道具 举报

4#
发表于 2024-8-21 09:58:41 | 只看该作者
本帖最后由 my9823 于 2024-8-21 10:16 编辑

能不能kernel  /path/core.img;boot;
不知道行不行?
再或用dd命令把core.img前512字节之后的内容复制出来(好像core.img的前512字节是diskboot.img)加载一下试试?
回复

使用道具 举报

5#
发表于 2024-8-21 10:00:50 | 只看该作者
一句话答复:MBR 是要 “争抢” 的,而不是像 PBR 一样,可以 “共存” 的。

复杂的答复:

单扇区的 MBR 是可以被链式加载的。你把单扇区的 MBR 保存成一个文件,然后,用 chainloader 来加载,通常是没问题的。

为什么多扇区的 MBR 就不行了呢?这就是 MBR 的 “争抢” 在起作用了。MBR 的第一扇区,被 BIOS 加载,或者被 chainloader 加载。然后,这个扇区的代码,就负责加载其余的扇区。这第一扇区的代码,要去硬盘上寻找后续的扇区,并加载它们。

如果一个多扇区的代码设计得 “精良”,它会发现全部 63 扇区都已经在内存了,从而不需要重复从硬盘加载了。这种情况,这个多扇区的 MBR 在 chainloader 加载以后能够完美运行,不会有问题。

反之,如果一个多扇区的 MBR 设计得不够 “优秀”,它就坚持认为自己只有第一扇区被加载,从而强行从硬盘继续加载它的第二扇区以及后续的扇区。而此时硬盘的第二扇区以及后续的扇区(连同第一扇区在内),根本就不是这个 MBR 的代码,所以就会出错、失败。

点评

谢谢不点兄,这大概就是我想要的答案。意思是:grub2的mbr并不只是有一个扇区。但我看了boot.img,貌似就是512字节,也就是一个扇区。有一个lnxboot.img,倒是1024字节,两个扇区。 那目前只能怀疑,grub2写入mbr  详情 回复 发表于 2024-8-21 10:18

评分

参与人数 1无忧币 +5 收起 理由
Climbing + 5 很给力!

查看全部评分

回复

使用道具 举报

6#
 楼主| 发表于 2024-8-21 10:18:56 | 只看该作者
不点 发表于 2024-8-21 10:00
一句话答复:MBR 是要 “争抢” 的,而不是像 PBR 一样,可以 “共存” 的。

复杂的答复:

谢谢不点兄,这大概就是我想要的答案。意思是:grub2的mbr并不只是有一个扇区。但我看了boot.img,貌似就是512字节,也就是一个扇区。有一个lnxboot.img,倒是1024字节,两个扇区。

那目前只能怀疑,grub2写入mbr的并不只是一个扇区。

点评

那你试试,用 grub2 本身的 chainloader 来加载它自己的多扇区 mbr 代码,看看能否成功。很有可能,grub2 不把这当成重点,它可能不去考虑此类问题,因而也不去做这样的工作。  详情 回复 发表于 2024-8-21 10:23
回复

使用道具 举报

7#
发表于 2024-8-21 10:23:31 | 只看该作者
Climbing 发表于 2024-8-21 10:18
谢谢不点兄,这大概就是我想要的答案。意思是:grub2的mbr并不只是有一个扇区。但我看了boot.img,貌似就 ...

那你试试,用 grub2 本身的 chainloader 来加载它自己的多扇区 mbr 代码,看看能否成功。很有可能,grub2 不把这当成重点,它可能不去考虑此类问题,因而也不去做这样的工作。
回复

使用道具 举报

8#
 楼主| 发表于 2024-8-21 10:49:41 | 只看该作者

参考这位兄弟上传的grub2启动过程详解这个pdf文件,可以知道,grub2将boot.img(这是真正的mbr)放到了LBA0扇区,而core.img则放到了LBA1-LBA67扇区,加载的过程也是LBA0加载LBA1,LBA1加载剩余的部分。
所以,我只保存前63个扇区肯定是没有意义的,这样的话,就算是保存,也要保存至少68个扇区,但就算这样,也没有意义,因为LBA0还是会去找LBA1,而LBA1很可能已经被grub4dos覆盖了。





回复

使用道具 举报

9#
 楼主| 发表于 2024-8-21 11:00:23 | 只看该作者
本帖最后由 Climbing 于 2024-8-21 11:23 编辑

但我又有了一个新疑问,grub2有一个启动方式是用 copy /b boot.img + core.img 生成g2ldr,然后grub4dos可以直接chainloader g2ldr来加载grub2,那么,这不就类似于我保存下来的grub2.mbr嘛(只不过我少保存了几个扇区)。

为什么g2ldr加载,就可以避免失败?

补充:我仔细梳理了一下整个过程,我提到的g2ldr都是咱们论坛里大牛们定制的grub2,例如 @wintoflash 提供的版本,而deepin集成的grub2中的boot.img + core.img未必是一个标准的g2ldr。总之,应该比较复杂。

点评

你自己做的g2ldr 是boot.img+你自己的core.img 安装deepin所写的mbr是boot.img+deepin的core.img 你保存的mbr必须跟deepin的core.img占用的扇区数相符,不一定是67个的,象bootice的grub2引导(boot.img+core.img)  详情 回复 发表于 2024-8-21 11:38
回复

使用道具 举报

10#
发表于 2024-8-21 11:38:02 | 只看该作者
本帖最后由 hilsonma 于 2024-8-21 11:47 编辑
Climbing 发表于 2024-8-21 11:00
但我又有了一个新疑问,grub2有一个启动方式是用 copy /b boot.img + core.img 生成g2ldr,然后grub4dos可 ...

你自己做的g2ldr 是boot.img+你自己的core.img
安装deepin所写的mbr是boot.img+deepin的core.img
你保存的mbr必须跟deepin的core.img占用的扇区数相符,不一定是67个的,象bootice的grub2引导(boot.img+core.img)就是63个扇区

比如你自己做的g2ldr,如果去掉后面的几个扇区,还能引导成功吗?
所以你说少保存几个扇区,那就是问题所在,应该是完整保存,实际占用多少个扇区就保存多少个扇区。
如果你无法判断它占用多少个扇区,那就放弃这个引导方案(chainloader 保存的mbr这个方案),改用其他方案

点评

问题就是,我就算保存了全部的扇区,如果它的第一扇区引导代码固定的到硬盘上找第二个扇区,还是会启动失败。话说回来,我不知道它占用了多少个扇区,但我可以多保存几个扇区,比如保存100个,甚至保存2048个。  详情 回复 发表于 2024-8-21 18:09
回复

使用道具 举报

11#
发表于 2024-8-21 12:56:31 | 只看该作者
来学习下

点评

灌水  发表于 2024-8-21 18:21
回复

使用道具 举报

12#
发表于 2024-8-21 14:16:43 | 只看该作者
来学习下

点评

灌水  发表于 2024-8-21 18:22
回复

使用道具 举报

13#
发表于 2024-8-21 15:20:10 | 只看该作者
本帖最后由 my9823 于 2024-8-21 15:32 编辑

其实你完全可以参照deepin的grub.cfg 写grub4dos的菜单,无非一个是kernel,一个是linux,initrd应该是一样的写法。linux都是:
kernel  /path/内核   内核参数
initrd   /patn/initrd名字
补充一句:boot.img和core.img的第一个扇区diskboot.img应该就是grub2自带的吧?之后后边的kernel.img中式用grub-mkimage生成的,里边包含的模块不同。boot.img被写入硬盘mbr,应该有变化,除了分区表部分,前面有一部分也变了,机器码不知道有啥动作,不懂汇编,猜的。
回复

使用道具 举报

14#
发表于 2024-8-21 16:04:00 | 只看该作者
我记得很久以前看过这段代码,grub2将boot.img(这是真正的mbr)放到了LBA0扇区,而core.img则放到了LBA1-LBA67扇区,加载的过程也是LBA0加载LBA1,LBA1加载剩余的部分。

其中,LBA0扇区尾部有LBA1-LBA67扇区的相对位置扇区号,
所以,如果LBA1-LBA67扇区被清除,或者移动位置,则不能启动了。

点评

Ventoy就移动了core.img,看看它的制作脚本。 vtinfo "writing data to disk ..." //将boot.img的前446个字节写入磁盘MBR。 dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446 //  详情 回复 发表于 2024-8-21 17:15
回复

使用道具 举报

15#
发表于 2024-8-21 17:15:25 | 只看该作者
本帖最后由 my9823 于 2024-8-21 17:24 编辑
天涯海角1216 发表于 2024-8-21 16:04
我记得很久以前看过这段代码,grub2将boot.img(这是真正的mbr)放到了LBA0扇区,而core.img则放到了LBA1-L ...

Ventoy就移动了core.img,看看它的制作脚本。


vtinfo "writing data to disk ..."
//将boot.img的前446个字节写入磁盘MBR。
    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
//如果检测时GPT分区,把MBR扇区的93字节改为十六进制22(core.img的第一个扇区号?)貌似gpt磁盘的前33扇区是分区表,所以从34扇区开始。)
    if [ -n "$VTGPT" ]; then
        echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92
        xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34
//这个应该是core.img剩余扇区数量吧?
        echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none
    else
        xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
    fi



由此推断出boot.img前446字节是mbr,且记录了core.img的第一扇区地址,而core.img必须是连续的扇区存放,core.img第一扇区保存了剩余扇区的数量。

评分

参与人数 1无忧币 +5 收起 理由
Climbing + 5 很给力!

查看全部评分

回复

使用道具 举报

16#
 楼主| 发表于 2024-8-21 18:09:59 | 只看该作者
hilsonma 发表于 2024-8-21 11:38
你自己做的g2ldr 是boot.img+你自己的core.img
安装deepin所写的mbr是boot.img+deepin的core.img
你保 ...

问题就是,我就算保存了全部的扇区,如果它的第一扇区引导代码固定的到硬盘上找第二个扇区,还是会启动失败。话说回来,我不知道它占用了多少个扇区,但我可以多保存几个扇区,比如保存100个,甚至保存2048个。

点评

我刚刚试了使用bootice安装的grub2 mbr,保存63个扇区,然后使用g4d 去chainloader 我保存的文件,是可以成功引导到grub2的 我没有安装deepin,所以不知道deepin安装程序写mbr的细节,如果deepin安装程序写的boot  详情 回复 发表于 2024-8-21 19:06
回复

使用道具 举报

17#
发表于 2024-8-21 18:21:41 | 只看该作者
boot.img
是 找 当时 bios 启动设备表的 hd0 的第二扇区
    微软的 是找 hd0上的活动分区区的 pbr
boot.img + core.img 只能用bootice写MBR用


想当文件用: 加linux.img,  (可以当 作bootmgr用)

点评

我觉得你说的很重要,但我看不太懂你在说什么。 尤其是最后一句,你说的这个linux.img是指lnxboot.img吗?如何用? copy /b lnxboot.img + core.img = grub2 然后用grub4dos来chainloader grub2就可以正常启  详情 回复 发表于 2024-8-21 18:39
回复

使用道具 举报

18#
 楼主| 发表于 2024-8-21 18:39:23 | 只看该作者
2011whp 发表于 2024-8-21 18:21
boot.img
是 找 当时 bios 启动设备表的 hd0 的第二扇区
    微软的 是找 hd0上的活动分区区的 pbr

我觉得你说的很重要,但我看不太懂你在说什么。

尤其是最后一句,你说的这个linux.img是指lnxboot.img吗?如何用?

copy /b lnxboot.img + core.img = grub2
然后用grub4dos来chainloader grub2就可以正常启动?

点评

core.img是multiboot格式的内核,可以由kernel命令加载启动。 前面加上lnxboot.img之后,就变成了linux格式的内核,也可以由kernel命令加载启动。  详情 回复 发表于 2024-8-21 19:43
回复

使用道具 举报

19#
发表于 2024-8-21 19:06:53 | 只看该作者
Climbing 发表于 2024-8-21 18:09
问题就是,我就算保存了全部的扇区,如果它的第一扇区引导代码固定的到硬盘上找第二个扇区,还是会启动失 ...

我刚刚试了使用bootice安装的grub2 mbr,保存63个扇区,然后使用g4d 去chainloader 我保存的文件,是可以成功引导到grub2的

我没有安装deepin,所以不知道deepin安装程序写mbr的细节,如果deepin安装程序写的boot.img跟bootice的不一样的话,你可以尝试只保存后面的扇区,不保存第一个扇区(不保存lba0),这样就是保存了deepin的core.img,你再将grub2通用的boot.img跟保存的这个core.img合并成grub2.mbr就可以了

点评

谢谢你的试验,我只需要再试一下将deepin安装的mbr保存1000个扇区,然后用chainloader加载一下就可以了。其实有很方便的kernel core.img的方式从grub4dos加载grub2。我只是尝试这种直接chainloader mbr的方式能否成  详情 回复 发表于 2024-8-21 20:04

评分

参与人数 1无忧币 +5 收起 理由
Climbing + 5 很给力!

查看全部评分

回复

使用道具 举报

20#
发表于 2024-8-21 19:43:52 | 只看该作者
Climbing 发表于 2024-8-21 18:39
我觉得你说的很重要,但我看不太懂你在说什么。

尤其是最后一句,你说的这个linux.img是指lnxboot.img ...

core.img是multiboot格式的内核,可以由kernel命令加载启动。
前面加上lnxboot.img之后,就变成了linux格式的内核,也可以由kernel命令加载启动。

评分

参与人数 1无忧币 +5 收起 理由
Climbing + 5 很给力!

查看全部评分

回复

使用道具 举报

21#
 楼主| 发表于 2024-8-21 20:04:12 | 只看该作者
hilsonma 发表于 2024-8-21 19:06
我刚刚试了使用bootice安装的grub2 mbr,保存63个扇区,然后使用g4d 去chainloader 我保存的文件,是可以 ...

谢谢你的试验,我只需要再试一下将deepin安装的mbr保存1000个扇区,然后用chainloader加载一下就可以了。其实有很方便的kernel core.img的方式从grub4dos加载grub2。我只是尝试这种直接chainloader mbr的方式能否成功。

点评

我刚才又试了一下,保存更多扇区是可以的,保存少了就不行 比如bootice写的core.img 是62个扇区,保存60个扇区会引导失败,保存100个扇区则引导成功 还有,如果你没有改变这些扇区的话,可以不保存,直接引导这  详情 回复 发表于 2024-8-21 22:59
回复

使用道具 举报

22#
发表于 2024-8-21 22:59:26 | 只看该作者
Climbing 发表于 2024-8-21 20:04
谢谢你的试验,我只需要再试一下将deepin安装的mbr保存1000个扇区,然后用chainloader加载一下就可以了。 ...

我刚才又试了一下,保存更多扇区是可以的,保存少了就不行
比如bootice写的core.img 是62个扇区,保存60个扇区会引导失败,保存100个扇区则引导成功

还有,如果你没有改变这些扇区的话,可以不保存,直接引导这些扇区就可以了的
比如 bootice 写在(hd0)的core.img,可以直接 kernel (hd0)1+62 这样引导,表示引导(hd0)上 LBA1 开始的62个扇区.

点评

我因为要安装grub4dos到mbr,所以肯定要事先保存下来这些扇区,否则就被grub4dos覆盖了。  详情 回复 发表于 2024-8-21 23:41
回复

使用道具 举报

23#
 楼主| 发表于 2024-8-21 23:41:56 | 只看该作者
hilsonma 发表于 2024-8-21 22:59
我刚才又试了一下,保存更多扇区是可以的,保存少了就不行
比如bootice写的core.img 是62个扇区,保存60 ...

我因为要安装grub4dos到mbr,所以肯定要事先保存下来这些扇区,否则就被grub4dos覆盖了。

点评

g4d不一定要安装到mbr,如果这个磁盘预计要安装win系统的话,还是保留nt6引导为好,这样能保证最大兼容。 我试过g4d引导、wee引导,曾经因wee的强大一度热衷于wee引导,后来在某一台机子上装wee引导结果开不了机  详情 回复 发表于 2024-8-22 06:39
回复

使用道具 举报

24#
发表于 2024-8-22 06:39:11 | 只看该作者
Climbing 发表于 2024-8-21 23:41
我因为要安装grub4dos到mbr,所以肯定要事先保存下来这些扇区,否则就被grub4dos覆盖了。

g4d不一定要安装到mbr,如果这个磁盘预计要安装win系统的话,还是保留nt6引导为好,这样能保证最大兼容。

我试过g4d引导、wee引导,曾经因wee的强大一度热衷于wee引导,后来在某一台机子上装wee引导结果开不了机,才更加明白,兼容是第一位的,无论你多喜欢,无论它多强大,只要设备不兼容,你就必须屈服,毕竟你的努力就是让这台设备更好地工作

所以现在的磁盘,传统引导方面,如果考虑安装win系统的话,我都是保留nt6引导,需要使用g4d的话,我会将bootmgr放到boot目录,把g4d的grldr改名为bootmgr替换到激活分区根目录。

点评

受教了,你这个办法很好。下次我也学习一下。  详情 回复 发表于 2024-8-22 09:07

评分

参与人数 1无忧币 +5 收起 理由
Climbing + 5 赞一个!

查看全部评分

回复

使用道具 举报

25#
 楼主| 发表于 2024-8-22 09:07:59 | 只看该作者
hilsonma 发表于 2024-8-22 06:39
g4d不一定要安装到mbr,如果这个磁盘预计要安装win系统的话,还是保留nt6引导为好,这样能保证最大兼容。 ...

受教了,你这个办法很好。下次我也学习一下。
回复

使用道具 举报

26#
发表于 2024-8-22 15:10:48 | 只看该作者
都是高手啊!

点评

灌水!我的帖子不欢迎任何灌水行为。  发表于 2024-8-22 15:43
回复

使用道具 举报

27#
发表于 2024-8-22 21:57:18 | 只看该作者
本帖最后由 fanet 于 2024-8-22 22:00 编辑

把mbr考贝出来是一个方法,需要知道core.img嵌入的位置和长度。更通常的做法是自定义一个core.img,最好内嵌搜索菜单,然后boot.img+core.img生成一个grub2的启动文件grldr,就可以用多种启动器加载了。

点评

顶楼就已经说过你这个方法了啊?  详情 回复 发表于 2024-8-23 08:29
回复

使用道具 举报

28#
 楼主| 发表于 2024-8-23 08:29:53 | 只看该作者
fanet 发表于 2024-8-22 21:57
把mbr考贝出来是一个方法,需要知道core.img嵌入的位置和长度。更通常的做法是自定义一个core.img,最好内嵌 ...

顶楼就已经说过你这个方法了啊?
回复

使用道具 举报

29#
发表于 2024-8-28 16:52:53 | 只看该作者
本帖最后由 chen463 于 2024-8-28 17:17 编辑

1.现在论坛多年前所制作的boot.img+core.img=g2ldr其实路径是efi\grub\ grub.cfg
2.Grub2-BIOS启动模式现今几乎很少使用,Vontoy-BIOS启动模式,路径是grub\ grub.cfg,如果还有使用Grub2-BIOS旧操作习惯,将会被覆盖有重迭现象。
3.基于以上两种启动模式,推断是否两种模式混乱使用而造成失败。
4.如果确认使用启动模式正确,路径是否正确。
5. Deepin虽然未接触,猜测引导Grub2方式,应该是EFI启动,显然是无法通过而失败。
6.建议可以使用BOOTICE来制作Grub2主引导后再备份[63扇区]更名为*MBR来引导它,如果您建立了主引导可以成功引导Deepin,那么备份MBR来引导使用应该是没问题的。
7.我现在就有在Grub4DOS菜单去引导g2ldr是成功的。如果把它改成BIOS指令可试一试-kernel /g2ldr可引导成功。

2024-08-28_3.png (9.73 KB, 下载次数: 127)

2024-08-28_3.png

2024-08-28_2.png (8.25 KB, 下载次数: 126)

2024-08-28_2.png

2024-08-28_1.png (16.96 KB, 下载次数: 44)

2024-08-28_1.png
回复

使用道具 举报

30#
发表于 2024-9-25 11:17:52 | 只看该作者
补充:

使用WGRUB2提取boot.img+core.img=g2ldr.mbr

经测试 扇区数是 86

kernel /g2ldr.mbr 成功
chainloader /g2ldr.mbr  失败

2024-09-25_1.png (9.79 KB, 下载次数: 19)

2024-09-25_1.png
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-25 17:15

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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