红毛樱木 发表于 2015-12-22 00:25:13

GRUB4DOS部分机器启动加载不了默认菜单只能到命令行

如题,这个好像有不少人遇到这个问题

这样子要怎么去处理呢?

不点 发表于 2015-12-27 13:26:30

遇到问题,最需要的是动脑筋。grub4dos 发展了很多年,bug 应该越来越难以出现了。

不要一有问题,第一个先想到 bug。诚然,隐蔽的 bug 可能还会被发现,但那几率已经大大减小了。

我们每次发现一个新的 bug,就减少了后续能够发现 bug 的几率。尤其是现在 grub4dos 在功能上已经不怎么增加了,那么,bug 更会是越来越少,直到最后的某一天,应该能够完全排除掉所有的 bug。


所以,遇到问题,首先要想到是不是自己的失误造成的?是不是 bios 的 bug 造成的?

举例来说,假如你没把 grldr 和 menu.lst 等文件放在 U 盘靠近最开头的空间里,你本来就可能会遇到失败的,不足为奇,不要纳闷,不要感到难以理解,也不必来报告 bug。

而假如你没有任何错误,却还是遇到了失败,那可以说,你大概撞上了 bug。这机会很难得,是一件值得庆幸的事,很多人想撞上 bug,却求之不得。你撞上了,正是一个抓住它的好机会,别让它溜掉。有兴趣者可以翻阅以前的帖子,有一些这样的案例,报告者紧追不舍,在 bug 快要溜掉之前,把它活生生抓住,同时也为 grub4dos 的发展做出了重大贡献。

==================

有些人自己修改了 grub4dos,自认为修改得很合理。出现问题之后,他认为是 grub4dos 的错,而不是他自己的错。但他又不敢说是修改版,因为一旦说是修改版,grub4dos 的开发者就不给解决了。这是不诚实的表现。人应该真诚相待,这是尊重他人。你尊重了他人,他人也会尊重你。有什么可以隐瞒的呢?grub4dos 是开源软件,你修改了,按照授权协议,也应该开源才对。既然都是开源软件,有什么是需要隐瞒的呢?另外,你真的有必要修改吗?你真的确定,你所实现的新功能代码无法被 grub4dos 的管理者接受吗?

寒风飘过 发表于 2015-12-22 02:33:14

还真没遇到过,我的是syslinux加载,进去后再载别的引导G2 G4D 目前没遇见不可引导的机器

lbw2007 发表于 2015-12-22 08:21:09

我遇到这种情况一把都是菜单写错了,完全不加载任何命令的还真没有见过。
手动输入命令正常吗?或者创建一个批处理,在命令行中执行,作为应急手段。

指南针 发表于 2015-12-22 11:39:46

跟iso包的制作有很大关系

红毛樱木 发表于 2015-12-22 12:18:34

指南针 发表于 2015-12-22 11:39
跟iso包的制作有很大关系

UD也会碰到。。。

Allreal 发表于 2015-12-26 09:39:05

感觉像是没识别到菜单文件所在分区。。。
我一直把菜单内置在grldr,
心理作用会好一些。

不点 发表于 2015-12-27 05:40:54

能启动到 grub4dos 的界面,说明机器还不算太差。但进入 grub4dos 环境后,找不到菜单,这原因比较多,需要给出进一步的信息才可帮助判断。

通常应该给出 geometry,root,ls 等命令的输出结果。

接下来更彻底的测试,可以使用 cat --hex (fd0)N+1 或 cat --hex (hd0)N+1 来确定 BIOS 所支持的最大扇区号码 N。就是说,把 N 替换成一系列数值,执行 cat 命令,直到 cat 命令给出失败信息或产生死机为止。这就可以确定出最大的 N 值了。

得到 N 值之后,就可以确定 menu.lst 是否可以被 bios 访问了。只要确定它是否位于前 N 个扇区当中即可。

======================

导致这个错误的原因,还可能来自用户自己的某种失误。譬如说,用户修改了 grub4dos 的内置菜单。要知道,grub4dos 发布的默认内置菜单,那是不可以随便修改的,你修改之后,可能会发生你没考虑到的那些情况,导致问题的产生。

======================

还遇到过一台机器,它含有一个隐藏分区,里面藏有一个未知版本的 grldr,可能是个用来破解 Windows 的,也可能是用来恶意攻击 grub4dos 的。开机之后,这个位于磁盘最开头的隐藏分区里面的(旧版)grldr 首先获得控制,它可能有 bug,从而无法找到 menu.lst 文件。如果它是恶意的,那它可以故意进入命令行,让用户一筹莫展。具体什么性质,我来不及追究,因为是在给别人修理电脑。把隐藏分区干掉,重做系统之后,一切正常。

======================

当然还有别的复杂情况,只有你用心研究才可能知道。



dfswb 发表于 2015-12-27 11:26:29

不点 发表于 2015-12-27 05:40
能启动到 grub4dos 的界面,说明机器还不算太差。但进入 grub4dos 环境后,找不到菜单,这原因比较多,需要 ...

大师好,又学习到一招!

lsc1117 发表于 2016-5-8 20:24:57

也遇到了这种情况,同样的模版在大多数机器上正常加载菜单,却在一小部分机器上进入命令行,不知楼主解决了没?

shabake 发表于 2016-5-8 20:57:35

鼠标一抖,三分到手,手持钢枪,低头猛走

shabake 发表于 2016-5-8 20:57:46

鼠标一抖,三分到手,手持钢枪,低头猛走

adef 发表于 2016-5-26 18:13:15

本帖最后由 adef 于 2016-5-26 18:19 编辑

新版有时会遇到,看见菜单无法启动,老版0.45c 2013-11-30没问题。菜单是内置在grub.exe里的,kernel /grub.exe

红毛樱木 发表于 2016-5-26 18:51:19

adef 发表于 2016-5-26 18:13
新版有时会遇到,看见菜单无法启动,老版0.45c 2013-11-30没问题。菜单是内置在grub.exe里的,kernel /grub ...

这问题作者可能没在意,确实是个比较头疼的问题

2011yaya2007777 发表于 2016-5-26 19:58:41

自动设置一下根目录就可以了。 find. --set-root/xxxx

红毛樱木 发表于 2016-5-26 20:09:17

2011yaya2007777 发表于 2016-5-26 19:58
自动设置一下根目录就可以了。 find. --set-root/xxxx

内置的菜单要怎么处理?

2011yaya2007777 发表于 2016-5-26 21:07:58

你是高手,一定有办法找到根目录。菜单不在根目录?那就在根目录建立一个空文件。

adef 发表于 2016-5-26 23:09:49

我发现可能跟U盘的结构有点关系。0.46a 2016-05-18 ls 后提示 no such partition 的U盘(当然对于0.45c 2013-11-30是正常的),我用 partitionguru 调整分区大小,在磁盘空间的尾部划一小块未分配空间出来,然后再合并回去(干一件貌似无意义的事.......把mbr和pbr都破坏了?)。然后用syslinux.exe -sfmi 重写引导记录(我是syslinux转G4D),0.46a 2016-05-18 ls 后可以看到根目录的文件了。如果不干那件无意义的事,syslinux重写引导记录也不解决问题。

红毛樱木 发表于 2016-5-27 00:21:30

adef 发表于 2016-5-26 23:09
我发现可能跟U盘的结构有点关系。0.46a 2016-05-18 ls 后提示 no such partition 的U盘(当然对于0.45c 201 ...

这个怎么解释啊。。。

红毛樱木 发表于 2016-5-27 00:22:22

2011yaya2007777 发表于 2016-5-26 21:07
你是高手,一定有办法找到根目录。菜单不在根目录?那就在根目录建立一个空文件。

yaya太抬举我了,grub4dos里内部东西我一窍不通的。。。

不点 发表于 2016-5-27 06:26:21

分区表不符合微软的事实工业标准,被 grub4dos 探测到了,并报错。

微软的分区表,从来不会有某个分区项是起始于 0 扇区(即 mbr 所在的扇区)的。

如果你有这样的分区表,grub4dos 就要报错。

你的 (hd0,0)就是起始于 mbr 的。所以会报错。

原因找到了,处理办法很简单:删除你这个不符合规范的 (hd0,0)即可。就是说,把它的分区表项用 00 填满即可。

不点 发表于 2016-5-27 06:40:45

本帖最后由 不点 于 2016-5-27 06:49 编辑

再提供一条消息。

当 grub.exe 是被 dos 启动或者是被当作 linux 的内核格式来启动时,默认的 root 可能是 (hd0,0),但假如此时 (hd0,0)不是一个有效的分区,则会发生图片上出现的错误。

当 grub4dos 被错误地使用时,也可能发生此类莫名其妙的错误。譬如,你随便截取 grub4dos 的一部分内容来加载,而不是完整加载 grub4dos 的整个二进制文件,自认为一切都合理,那就可能出问题。

yaya 已经告诉你了,这不是 grub4dos 的 bug,而是你使用过程中考虑问题不周到引起的。

你没能传递正确的 root (即当前默认分区)给 grub4dos。或者 grub4dos 无法猜到当前 root 是哪个,或者它猜错了,这都会出错。

但这不是 bug。你只要传递正确的启动分区,就不会有这种错误。当你实在不知道如何传递正确的启动分区时,你可以修改内置菜单,让它固定一个分区,或者用 find 命令找到一个确实存在的分区,作为当前默认分区,这就正常了。

adef 发表于 2016-5-27 10:48:20

没事又找了块闲置U盘试了下。
1、量产后MBR是NT5.x的。

2、bootice只写入0.46a的pbr,拷入0.46a的grldr、menu.lst。

3、bootice接着再写入0.46a的mbr。

4、partitionguru稍微无损缩小U盘容量,再扩大回原容量,bootice重新写入0.46a的mbr、pbr,一切ok。


如果量产时不勾选creat mbr,bootice写入0.46a的pbr后,启动时有出错提示,但之后 ls 正常。各种折腾就不上图了。
个人觉得0.46a在个别地方不如0.45c打得粗。

不点 发表于 2016-5-27 11:59:31

你成功了我不想再多说什么。等你以后遇到失败时,我再分析。

以下是想和 yaya 说的话。

我猜上述 Try (hd0): 一连串失败信息,属于 0.4.6a MBR 代码的 bug。Try 之后只有硬盘号,缺少分区号。硬盘全部查找失败,应该转入查找软盘 fd0,却没有,直接报错。我猜此时 U 盘有可能是 fd0。既然不去找 fd0,那么,就找不到 grldr。

后面经过 partition guru 折腾以后,有可能这个 U 盘 被 bios 识别为硬盘 hd0 了,那么也就成功找到 grldr 了。



另外,前面用微软的 MBR 时,找到了 grldr,但没能传递正确的分区号(CPU 的 DH 寄存器)给 grldr,所以,grldr 就不知道启动分区的分区号是多少。那么 ls 命令也就可能尝试列出一个不存在的分区,当然会报错。

你只有使用 grldr.mbr,才可能传递正确的分区号给 grldr。换句话说,微软的 mbr 不能完整支持 grldr 的启动,它只是支持加载 grldr 而已,不支持传递启动分区(grldr 所在分区)的分区号。

因此,使用微软的 mbr 来加载 grldr,本身属于用法错误。

2011yaya2007777 发表于 2016-5-27 15:06:30

bootice 好久没有更新了,使用它写的 MBR、PBR 不是最新的。有能力的话,使用 WinHex 等工具自己写。

adef :截图至少使用 geometry,root,报告一下启动驱动器。使用 cat --hex ,报告一下MBR、PBR 。

adef 发表于 2016-5-27 16:54:25

本帖最后由 adef 于 2016-5-27 17:11 编辑

1、量产设置:


2、量产后bootice写入0.46a的mbr和pbr,grldr0.46a


3、bootice写入0.45c的mbr和pbr。grldr0.45c


4、partitionguru调整后,写入0.46a的mbr和pbr,grldr0.46a


cat --hex不会用。

不点 发表于 2016-5-27 17:27:46

本帖最后由 不点 于 2016-5-27 17:38 编辑

adef 发表于 2016-5-27 16:54
1、量产设置:




yaya 的话,你没看明白。我来再解释一下。

BOOTICE 所安装的 GRUB4DOS 的 MBR 和 PBR 代码,都不是最新的。

这下子你该明白了吧?

BOOTICE 安装的 MBR、PBR 代码不是最新的,就可能有 bug。假如最新的 grub4dos 解决了 bug,也是无用的,因为你用的是 BOOTICE 默认的、旧的启动代码。你得想办法使用新代码才行。你也可以等待 BOOTICE 更新之后再做这件事。

【补充】

这跟你启动 GRLDR 之后看到的版本信息,完全没有关系。你不可能看到 MBR 和 PBR 的版本信息。

因为 MBR 和 PBR 的代码空间紧张,不可能加入显示版本的信息。

你用 BOOTICE 安装的 MBR 和 PBR,都是旧版本的。这些 MBR 和 PBR 是用来查找 GRLDR 的。

正是这些 MBR 和 PBR 有问题,才导致了 GRLDR 找不到。

如果你能想办法试试新的 MBR 和 PBR,那就可以确定是不是 grub4dos 自身仍然有着未解决的 bug。

如果现在你没时间去折腾,那就算了。等待以后有兴趣、有机会的时候再做也不迟。

adef 发表于 2016-5-27 17:52:10

本帖最后由 adef 于 2016-5-27 17:56 编辑

明白了。如果bootice不能用的话,我就会不写引导了。有兴趣的话可以远程整我的U盘,没兴趣的话就算了。其实这个现象很早以前就发现了(bcd转g4d之后跳进命令行),反正旧版能用,也无所谓。现在用partitiongur搞一下之后就能决解问题(用minitool partition wizard也行),个人就更没有非要解决问题(如果算是问题的话)的急迫性了。
谢谢不点和yaya。

不点 发表于 2016-5-27 18:06:39

本帖最后由 不点 于 2016-5-27 18:17 编辑

adef 发表于 2016-5-27 17:52
明白了。如果bootice不能用的话,我就会不写引导了。有兴趣的话可以远程整我的U盘,没兴趣的话就算了。其实 ...

远程我从未用过,也没时间学。不过,如果碰巧你有兴趣的话,你可以试试我写的 multimbr 软件,专门用于制作 U 盘启动的:

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=320244


补充,这个软件不影响你的量产。你可以在量产之后的任何时候,选择使用 multimbr 来格式化你的 U 盘。

adef 发表于 2016-5-27 20:27:15

不点 发表于 2016-5-27 18:06
远程我从未用过,也没时间学。不过,如果碰巧你有兴趣的话,你可以试试我写的 multimbr 软件,专门用于 ...

量产后,按multimbr的步骤操作,在用bootice导入mbr_16G.img的时候提示拒绝访问(大意),用bootice恢复0.46a的grldr.mbr后,再导入img就没问题了。之后一切正常,启动后 ls 后可看到根目录的文件。
这个U盘以前因为本来32GB量产后只有16GB就闲置了(卖家说有一面没读到),昨天翻出来又能量产成32GB了(到今天下午都可以),刚才测试multimbr量产,结果又只能量产16GB了,不知道是否是因为变成了问题U盘才无法直接导入mbr_16G.img。
页: [1] 2
查看完整版本: GRUB4DOS部分机器启动加载不了默认菜单只能到命令行