Board logo

标题: 在U盘中使用grub,如何解决这两个问题? [打印本页]

作者: neiljoy     时间: 2006-7-23 08:33    标题: 在U盘中使用grub,如何解决这两个问题?

我的U盘为ZIP模式,我是在U盘启动到DOS后,运行
grub --config-file=(fd1)/menu.lst
这时软驱不停地转动,嘎嘎声作响,屏幕显示:
default 0
timeout 1
fallback 1

估计响了足足1分钟,非常令人讨厌,然后才进入到菜单显示。
我的问题是:
1. 怎样才能跳过对软驱(fd0)的访问,以避免这种情况的出现,从而顺利地进入到U盘中的菜单显示?
2. 当我进入到菜单后,我想使用U盘中的镜象文件diskedit.img,用以下命令
map --menu (fd1)/diskedit.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)

结果显示为  Error 27:Disk read error      press any key to continue...
我的命令应当如何修改?谢谢!!
作者: 不点     时间: 2006-7-23 09:40
你用的版本太古老了,应该用最新版的,在 http://grub4dos.jot.com/

那个 --menu 是你的笔误吧?应该是 --mem

另外,你能肯定 (fd1) 这个设备是存在的吗?U 盘一般是 (fd0) 而不是 (fd1),除非你的系统比较特别。我想你大概应该用 (fd0) 而不是 (fd1),除非你确实知道有 (fd1) 这个设备。所以我觉得好像应该这样:

grub --config-file=(fd0)/menu.lst
------------------------------------------------------------
map --mem (fd0)/diskedit.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
boot
------------------------------------------------------------

自己多看看资料,再多试试,就可解决问题的。
作者: neiljoy     时间: 2006-7-23 09:50
谢谢不点大师的帮助!
1.menu确实为mem之笔误,是我在发帖时写错了;
2.我先用硬盘上的grub检查过了,FD0是我的软驱,FD1应当是我的U盘。而且我最初用的是fd0,但运行grub后即死机,后来换成fd1可以启动grub,但就是出现上述现象,我想如果拔除软盘的数据线,它就会是fd0了;
3.我是一个星期前从您给出网站上下载的稳定版,应该不算旧吧?
作者: fastslz     时间: 2006-7-23 11:17
估计响了足足1分钟?是不是软驱坏了?
拔除软驱数据线也没多大意义,BOIS还是分配中断给软驱的,最好在BOIS里屏蔽掉软驱。
作者: neiljoy     时间: 2006-7-23 11:42


  Quote:
Originally posted by fastslz at 2006-7-23 11:17:
估计响了足足1分钟?是不是软驱坏了?
拔除软驱数据线也没多大意义,BOIS还是分配中断给软驱的,最好在BOIS里屏蔽掉软驱。

软驱响,并不是它坏了,就是现在我还在用软驱。我估计是因为我没有放软盘,但是grub却硬要搜索软盘中的文件,这样致使它来回动作。
实际上,我是从U盘启动的,不是从软盘启动的。如果从BIOS中屏蔽软驱,只有使用“解除”项,这样岂不是连我的U盘也无法启动了。
而且,我认为,只有拔除数据线,就相当于没有软驱,它就不会作读盘动作了。
作者: neiljoy     时间: 2006-7-23 12:04
可以在BIOS中将软驱设为“无”的,我试一下看。不过,就解决问题而言,即使这样可以使用,但毕竟是一个问题。
作者: 不点     时间: 2006-7-23 12:11
你试试今天上载的最新测试版本。这个测试版应该很稳定了。现在 grub 中的预置菜单应该不会自动搜索软盘了。
------------------
我来分析一下:

grub --config-file=(fd1)/menu.lst

这条命令指定了菜单文件 (fd1)/menu.lst,如果 GRUB 确实能够找到并打开这个文件,就直接把这个文件当作配置文件,并执行其中的命令。否则,当文件不存在或者打开文件失败时,GRUB 就把内置的 preset_menu 作为主控菜单来执行。老的 preset_menu 是要搜索软盘的,所以,就出现了你所看到的情况。最新版 GRUB4DOS 中的 preset_menu 不再搜索软盘,所以应当不再有问题了。

不过,从刚才的分析似乎发现,(fd1)/menu.lst 可能不存在。

另外,U盘启动到DOS以后,应该A:就是U盘了,要么C:是U盘,不应当出现 B:或者 D:是U盘的情况。这是因为 DOS 不能从 A: 和 C: 以外的盘成功启动。

所以,你的 (fd1) 可能是不存在,你自己好像也没证明它是存在的。

如果 (fd0) 是你的真实软驱,它咔嚓作响,那我估计你的 U 盘应该是C:了。你这样试试:

grub

不要加 --config-file, 这样的话,默认寻找 (hd0,0)/menu.lst 作为配置菜单。
作者: neiljoy     时间: 2006-7-23 12:48
不点大师的贴子我才看见,还没有来得及试验。我先说说刚才试验的情况,实在是太奇怪了!
1.我的电脑是华硕845D芯片组的主板,只有USB_ZIP项,没有USB_HDD项;
2.当我在BIOS中将软驱设为“无”时,我从硬盘上启动GRUB(当然,U盘已在),确认只存在三个盘:FD0、HD0、HD1(我有两个硬盘);
3.于是我从U盘启动在DOS下后,运行grub --config-file=(fd0)/menu.lst,照样死机;
4.重新启动电脑,仍将软驱设为无,运行grub --config-file=(fd1)/menu.lst,却可以正常启动GRUB,也不再读软驱了,当然也没有嘎嘎声。
为此,我十分奇怪,于是我进入GRUB命令行,运行:
cat (,     显示(fd0),(hd0),(hd1)
用cat (fd0,   显示它确实为U盘。
用cat (fd1,   显示为:Error23:Selected disk does not exist
作者: neiljoy     时间: 2006-7-23 14:35
按要求使用最新的7.23日版(实际上为7.22),现报告如下:
1.试用情况与原grub for dos V4.1相同,在U盘中必须使用
grub --config-file=(fd1) /menu.lst才能启动,如果在BIOS中未断开软驱,仍有读盘动作,软驱嗄嗄响;如果在BIOS中将软驱设为无,无读盘,不响,也能启动。
2.使用grub --config-file=(fd0) /menu.lst不能启动,在
CD-ROM setup is OK. 后死机。但U盘在死机之前仍有较长时间的读取动作(因为U盘的灯一直在闪烁)
3.我通过硬盘启动GRUB后,确实有以下显示:
possible disk are:fd0 fd1 hd0 hd1 rd
如果使用 cat (fd0,   则无任何显示(上个版本有显示),rd也一样无显示;
使用  cat (fd1,     则有"Plssible partitions are:"等内容的显示。

我已查清,如果我把C盘中的menu.lst删除,则无论使用--config-file=(fd1)或者--config-file=(fd0)均死机,说明U盘运行GRUB时读取的菜单实际上是C盘根目录下的,它无法读取U盘根目录下的菜单(虽然有较长时间的读取动作,但最终还是死机)。
结论:如果C盘下无menu.lst,我无法在U盘的DOS启动环境下运行GRUB,否则死机。
但我无法理解的是:是否死机竟然受C盘有无menu.lst的制约,难道没有办法解决吗?
作者: fastslz     时间: 2006-7-23 15:37
那看看BIOS设置里有没有每次开机检测软驱(BOOT UP FLOPPY SEEK)
和、交换软驱盘符(SWAP FLOPPY DRIVE)选项
另外如果menu.lst在根目录,可以直接grub回车调用内置菜单启动呀!
作者: neiljoy     时间: 2006-7-23 16:13
直接运行GRUB,可以不死机,软驱也不响。但却没有菜单(已将C盘根目录下的menu.lst删除,否则可以显示),屏幕的最后显示为GRUB命令行。两个疑问:
1.  这种情况下如何能够显示menu.lst菜单?
2.  看来,就是因为读取U盘的菜单问题才导致死机,如何解决?
作者: fastslz     时间: 2006-7-23 16:53
我这个机子不支持USB启动,没办法用你的方法测试。不知道属于个别现象还是GRUB的一个BUG,等不点大师解答吧。哦...同一个包里的grldr在你的U盘上正常吗?
作者: 不点     时间: 2006-7-23 16:55
--1.我的电脑是华硕845D芯片组的主板,只有USB_ZIP项,没有USB_HDD项;
--2.当我在BIOS中将软驱设为“无”时,我从硬盘上启动GRUB(当然,U盘已在),确认只存在三个盘:----FD0、HD0、HD1(我有两个硬盘);

说明从硬盘启动时,BIOS把U盘识别为A:。所以,你的U盘总是被识别为A:,不管是从硬盘启动,还是从U盘启动都是这样的。

--3.于是我从U盘启动在DOS下后,运行grub --config-file=(fd0)/menu.lst,照样死机;

访问U盘就死机?这应该是那个古老的U盘BIOS的BUG吧。很久以前就有人这么报告了。结合你前面的报告,这个BUG总会出现,不管BIOS中是否禁止软盘。

--4.重新启动电脑,仍将软驱设为无,运行grub --config-file=(fd1)/menu.lst,却可以正常启动GRUB,
--也不再读软驱了,当然也没有嘎嘎声。

你用一个不存在的文件做菜单,当然 GRUB 找不到这个菜单了。于是 GRUB 调用内置的菜单。内置的菜单首先搜索到硬盘上的 menu.lst ,就把控制权交给硬盘上的这个菜单了。

--为此,我十分奇怪,于是我进入GRUB命令行,运行:
--cat (,     显示(fd0),(hd0),(hd1)
--用cat (fd0,   显示它确实为U盘。
--用cat (fd1,   显示为:Error23:Selected disk does not exist

证实了 (fd1) 不存在。

--按要求使用最新的7.23日版(实际上为7.22),现报告如下:
--1.试用情况与原grub for dos V4.1相同,在U盘中必须使用grub --config-file=(fd1) /menu.lst
--才能启动,如果在BIOS中未断开软驱,仍有读盘动作,软驱嗄嗄响;如果在BIOS中将软驱设为无,
--无读盘,不响,也能启动。

和上面的分析一样。补充一点,如果 BIOS 设置中有软驱,那么导致读取软驱的可能是(fd1)/menu.lst。某些 BIOS 会在你试图访问 (fd1) 时,实际访问的是 (fd0)。

--2.使用grub --config-file=(fd0)/menu.lst不能启动,在CD-ROM setup is OK. 后死机。
--但U盘在死机之前仍有较长时间的读取动作(因为U盘的灯一直在闪烁)。

访问U盘就死机?这应该是那个古老的U盘BIOS的BUG吧。很久以前就有人这么报告了。结合你前面的报告,这个BUG总会出现,不管BIOS中是否禁止软盘。从出错信息已经到达 CD-ROM setup is OK 可见,A20 已经成功打开,所以排除 A20 的控制导致死机的可能。应该是在读取U盘上的菜单文件时死机了。你设法进入 GRUB,然后用 geometry (fd0) 命令,看看这条命令能否成功执行。如果成功,贴出它的输出结果。更进一步,你还可以用 cat --hex (fd0)+1 来显示 U 盘的第一扇区,看看它是否正常。

--3.我通过硬盘启动GRUB后,确实有以下显示:
--possible disk are:fd0 fd1 hd0 hd1 rd
--如果使用 cat (fd0,   则无任何显示(上个版本有显示),rd也一样无显示;
--使用  cat (fd1,     则有"Plssible partitions are:"等内容的显示。

显示的两个软盘,(fd0)可能是你的真实软驱,所以它没有内容显示。而(fd1)可能是U盘,所以有内容显示。但是你没把内容显示完,所以,你最好用 cat --hex (fd1)+1 把 U 盘的第一扇区显示出来,看看它究竟是含有分区表的 MBR 呢,还是通常的 DOS 引导扇区?

--我已查清,如果我把C盘中的menu.lst删除,则无论使用--config-file=(fd1)或者--config-file=(fd0)
--均死机,说明U盘运行GRUB时读取的菜单实际上是C盘根目录下的,它无法读取U盘根目录下的菜单
--(虽然有较长时间的读取动作,但最终还是死机)。
--结论:如果C盘下无menu.lst,我无法在U盘的DOS启动环境下运行GRUB,否则死机。

所以,我觉得应该查明 U 盘的结构,就像上面说的那样。同时也再次显现,这是 BIOS 读取过程导致的死机,本质上是 BIOS 的错。

--但我无法理解的是:是否死机竟然受C盘有无menu.lst的制约,

当 C 盘有 menu.lst 时,GRUB 不找 U 盘,所以就不会死机。这是很容易理解的。一旦要从 U 盘读取文件,这时就可能导致死机。当 C 盘没有 menu.lst 时,老版本的 GRUB 会查找软盘(也就是U盘),这样就有可能死机。新版本不应该查找软盘,因此应该不会死机了,你再确认一下。

--难道没有办法解决吗?

试试这样如何?grub --config-file="commandline" 这条命令不使用别的菜单,而直接使用命令行指定的GRUB命令(此处是commandline命令),这样,启动 GRUB 后将直接进入命令行,不再找菜单了。

=========

总的看来,导致这一现象,有两种可能的原因。一个是 BIOS 的 BUG,另一个就是 U 盘格式化的方式错误所导致的。不过根本的原因,应该还是第一个,即 BIOS 的 BUG 导致的。找 BIOS 厂家或者主板生产厂家解决。
作者: 不点     时间: 2006-7-23 17:06
--另外如果menu.lst在根目录,可以直接grub回车调用内置菜单启动呀!

GRUB 默认启动的菜单是 (hd0,0)/menu.lst,输入 grub 回车和输入 grub --config-file=(hd0,0)/menu.lst 是同样的效果。所以,这种办法并不能启动 A: 盘上的 menu.lst。

--哦...同一个包里的grldr在你的U盘上正常吗?

对,你可以尝试把 GRLDR 安装在 U 盘上,直接用 GRLDR 启动,看看 GRLDR 可否成功读取 U 盘根目录里的 menu.lst。不过我估计照样失败,因为 GRLDR 和 GRUB 本质上是一样的,差别只在于启动过程不同。当进入 GRUB 环境之后,就没什么差别了。


一个最无奈的办法是,把菜单整个嵌入到 GRUB 的命令行中,这样就不需要进入 GRUB 之后再从 U 盘装入菜单了。如果菜单很小,可以嵌入 grub.exe 的命令行(DOS提示符下或者AUTOEXEC.BAT中),如果菜单很大,则必须用 config.sys 了。GRUB4DOS 的发布里面就有一个做例子用的 config.sys,你研究一下这个例子就管用了。

不过,你仍然要记住,进入 GRUB 的环境之后,不能有访问 U 盘的动作(菜单命令也不要有访问U盘的动作),否则仍然免不了死机。

[ Last edited by 不点 on 2006-7-23 at 17:22 ]
作者: neiljoy     时间: 2006-7-23 17:40
BF1B065057B9E501F3A4CBBDBE07B104
386E007C09751383C510E2F4CD188BF5
83C610497419382C74F6A0B507B4078B
F0AC3C0074FCBB0700B40ECD10EBF288
4E10E84600732AFE4610807E040B740B
807E040C7405A0B60775D28046020683
46080683560A00E821007305A0B607EB
BC813EFE7D55AA740B807E100074C8A0
B707EBA98BFC1E578BF5CBBF05008A56
00B408CD1372238AC1243F988ADE8AFC
43F7E38BD186D6B106D2EE42F7E23956
0A77237205394608731CEB1A90BB007C
8B4E028B5600CD1373514F744E32E48A
5600CD13EBE48A560060BBAA55B441CD
13723681FB55AA7530F6C101742B6160
6A006A00FF760AFF76086A0068007C6A
016A10B4428BF4CD136161730E4F740B
32E48A5600CD13EBD661F9C3496E7661
6C696420706172746974696F6E207461
626C65004572726F72206C6F6164696E
67206F7065726174696E672073797374
656D004D697373696E67206F70657261
74696E672073797374656D0000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000000000000000D80C050000008001
01000EFE3F063F000000C1F301000000
00000000000000000000000000000000
00000000000000000000000000000000
000000000000000000000000000055AA

如果直接运行GRUB,不死机,软驱也不响。可以进入命令行,但回车后仍然是命令行,无菜单显示,可以用quit返回DOS。当然,也可以用type显示U盘根目录下的menu.lst,不过这样没有意义,因无法执行菜单中的命令。
我的想法是,1.启动到DOS下完全正常;2.也可以直接运行GRUB;3.仅仅是读菜单时才导致问题的出现。
因此,把这样的故障完全说是BIOS造成的,我还理解不了。
作者: neiljoy     时间: 2006-7-23 17:43
抱歉,少发了第一行,现补上。
33C08ED0BC007CFB5007501FFCBE1B7C
作者: neiljoy     时间: 2006-7-23 18:18
请教大师:我如何在DOS命令行下嵌入菜单命令(或者AUTOEXEC.BAT中),您能具体说明吗?
至于config.sys,因为您给出了样板,我就知道了。
我要求的菜单很简单:
1. 能够启动U盘上的IMG的文件;
2. 能够启动硬盘上某一分区上的ISO文件(非WIN或WIN PE之类的ISO文件)。
作者: 不点     时间: 2006-7-23 18:29
我要的是 GRUB 下 cat --hex (fd0)+1 或者 cat --hex (fd1)+1 的输出结果。你能保证你上面给出的这个结果和cat 的输出结果是基本一致的吗?如果是的,继续看下面的;如果不是的,不要继续看了,你把 cat 的结果贴出来再说。

根据你贴出的结果来看,U 盘是一个含有分区表的硬盘格式,所以,GRUB 处理这样不合乎常规的软盘格式时,出现了问题。这确实可能是 GRUB 的问题,因为 GRUB 从来没有处理过这样的情况。你等待一两天,待我去研究研究,再给你一个答复。不过,我认为 GRUB 因此而干脆就死机的可能性,应该也是不大的。

你最好能把整个 U 盘用某个16进制工具全部克隆下来,上载到某处,让我研究研究。

你再做如下测试:把整个 U 盘仿真为一个硬盘,看看能否访问其中的文件。步骤如下:

map (fd0) (hd2)
map --hook

然后,

geometry (hd2)

看看 hd2 中有多少个分区。进一步再看看其中是否有 U 盘中的文件,这你自己操作吧,不用我详细说了。

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

在DOS命令行嵌入菜单很简单,就是刚才举例说明的那样:

grub.exe --config-file="此处填写menu.lst的内容"

双引号要带上,中间填写menu.lst 的内容。menu.lst 有许多行,行与行之间本来是回车换行,现在在 DOS 的命令行中,不可能嵌入回车换行,所以,把所有的回车换行,改成分号(;) 就可以了。

你看看例子文件 config.sys 就明白了。在 device= 的情况下,双引号之内可以嵌入多达 4000 字节的命令。而在 DOS 的命令行下,命令行的总长度都不能超过 127 个字符,所以,嵌入的菜单应该是很小的。

[ Last edited by 不点 on 2006-7-23 at 18:45 ]
作者: neiljoy     时间: 2006-7-23 19:39
非常抱歉,我是用WINHEX取的U盘第一扇区,经过您的指点,运行cat --hex (fd0)+1后显示的实际上是DOS引导区。经我在WINHEX与绝对第63扇(总扇区128000扇)相比较,完全一致:
EB3C904D5357494E342E310002020600
0200020000F8F9003F00FF003F000000
C1F30100800029772550AC4E4F204E41
4D45202020204641543136202020FA33
C98ED1BCFC7B1607BD7800C576001E56
1655BF2205897E00894E02B10BFCF3A4
061FBD007CC645FE0F8B46188845F938
4E247D228BC199E87701721A83EB3A66
A11C7C663B078A57FC750680CA028856
0280C31073ED33C98A461098F7661603
461C13561E03460E13D18B7611608946
FC8956FEB82000F7E68B5E0B03C348F7
F30146FC114EFE61BF0007E823017239
382D741760B10BBED87DF3A66174394E
740983C7203BFB72E7EBDDBE7F7DAC98
03F0AC84C074173CFF7409B40EBB0700
CD10EBEEBE827DEBE5BE807DEBE098CD
165E1F668F04CD19BE817D8B7D1A8D45
FE8A4E0DF7E10346FC1356FEB104E8C1
0072D6EA00027000B442EB2D60666A00
525006536A016A108BF474EC919233D2
F7761891F776184287CAF7761A8AF28A
E8C0CC020ACCB801028A5624CD138D64
1061720A40750142035E0B497577C303
1801270D0A496E76616C696420737973
74656D206469736BFF0D0A4469736B20
492F4F206572726F72FF0D0A5265706C
61636520746865206469736B2C20616E
64207468656E20707265737320616E79
206B65790D0A0000494F202020202020
5359534D53444F532020205359537F01
0041BB0007807E020EE940FF000055AA
作者: neiljoy     时间: 2006-7-23 19:46
顺便说一下,我用的是台电64M的U盘。我是用惠普HPUSBFW.zip作成的USB_ZIP.您再看一下,如有必要,我作一个ghost给您。不过文件很大,需要分多次用邮件传送给您。其它我再慢慢试。
您也要休息一下了。别着急,身体要紧。保重保重!!
作者: neiljoy     时间: 2006-7-23 22:26
我用geometry (hd2)查看了有4个分区,但无U盘中的文件显示。其显示如下:
drive 0x82:c/h/s=80/2/18,The mumber of sectors=2880,CHS Bytes per Sector=512
partition mun:0,Filesystem type unknown,partition type 0x74
partition mun:1,Filesystem type unknown,partition type 0x65
partition mun:2,Filesystem type unknown,partition type 0x53
partition mun:3,Filesystem type unknown,partition type 0xbb
其中后4行与我下午用cat (fd0,  后显示的一致。此外它还多了一行:
partition mun:0,Filesystem type unknown,using whole disk

我发现它显示的C/H/S数与WINHEX显示的7/255/63不同。

另外,我在U盘的DOS下使用以下命令:
grub.exe --config-file="map --mem (hd0,5)/diskedit.img;map --hook;chainloader (fd0)+1;rootneverity (fd0);"
然后回车,U盘灯闪烁一会儿,屏幕出现
grub -
但没有死机,却也没有启动img文件。我的书写格式是否正确?为什么没有执行?
作者: neiljoy     时间: 2006-7-23 22:30
又有笔误!应是rootnoverity!
作者: fastslz     时间: 2006-7-23 22:35
grub.exe --config-file="map --mem (hd0,5)/diskedit.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
作者: neiljoy     时间: 2006-7-23 22:58


  Quote:
Originally posted by fastslz at 2006-7-23 22:35:
grub.exe --config-file="map --mem (hd0,5)/diskedit.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"

是我发帖时书写错了。
为可靠起见,我又重新试了一次,以确保书写正确,结果仍是:
grub> -

不过,话说回来,这种方式,出错后不知道有无提示。如果正常情况下,出错了也无提示,那就不太好用了。
作者: fastslz     时间: 2006-7-24 01:13
我也试了4种装载方法现在报告如下结果:
方法1
grub.exe --config-file="find --set-root /boot/zzcl/slzbootj.img;map --mem /boot/zzcl/slzbootj.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
::能够启动

方法2
grub.exe --config-file="map --mem /boot/zzcl/slzbootj.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
::能够启动

方法3
grub.exe --config-file="map --mem (hd0,7)/boot/zzcl/slzbootj.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
::不能够启动(光标停留grub>- 提示符)

以上3个方法img位置均(hd0,7)/boot/zzcl/slzbootj.img

方法4
grub.exe --config-file="map --mem (hd0,5)/grub/288.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
::能够启动

grub版本grub_for_dos-2006-07-23包,(hd0,5)和(hd0,7)磁盘类型都是FAT32

描述:确实有点奇怪,按理说方法3算标准装载方法却不能启动,方法2之前也说过是自己实践中摸索出来的非标准装载方法(虚拟路径)反而能够启动,更奇怪的是方法3和方法2其实是一样的装载方法却能启动。
明天继续测试......
作者: neiljoy     时间: 2006-7-24 06:14
我今天又进行了试验,首先我将
grub.exe --config-file="map --mem (hd0,5)/diskedit.img (fd0);map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
作了一个批处理,这样即使有错误,也便于查找。在U盘中使用这个批处理,果然成功了!于是我再次在U盘的DOS命令行中键入同样的命令,这次也成功了--那么我昨晚的试验还是有差错?可是我反复检查了多次呀!真是怪!

接着,我又用以下命令来读取U盘中的IMG文件:
grub.exe --config-file="map --mem (fd0)/diskedit.img (fd0);map (fd0) (fd1);map --floppies=2;map --hook;chainloader (fd0)+1;rootnoverity (fd0);"
无论是作成批处理还是直接在DOS下键入后执行,运行到
map --mem (fd0)/diskedit.img (fd0)
处即死机!后来我去掉map (fd0) (fd1);map --floppies=2也同样不成功。
我估计这可能是不点说“进入 GRUB 的环境之后,不能有访问 U 盘的动作(菜单命令也不要有访问U盘的动作),否则仍然免不了死机”的缘故吧。
作者: 不点     时间: 2006-7-24 09:26
还是笔误,你在顶楼写的正确,现在却错了:rootnoveri(t)y 应该是 rootnoveri(f)y 才对。

现在比较明朗了:访问U盘上的文件会导致死机。此时我们不能说访问U盘上的任何文件都一定导致死机,但可以肯定,访问某些文件,会死机。你记录一下有哪些文件会导致死机,然后,用 quit 命令退回 DOS 下,在 DOS 下用某个工具(比如 EDIT)打开同样的文件,记住要读取到文件的结尾,看看是否同样会导致死机。如果 DOS 下也死机,那就可以肯定是 BIOS 的 BUG 了,这就没有任何疑问了。如果 DOS 下打开这些文件通畅无阻,出来的结果也都对,那就说明是 GRUB 和 U盘的 BIOS 之间存在某种未知的问题,我们还有希望继续追踪其真实的原因。

不过我现在似乎已经发现了某些问题。叙述如下:

1。从 geometry (fd0) 的输出结果为 C/H/S=80/2/18, 总扇区数为 2880 可见,这个(fd0)的容量是1.44M的标准软盘的容量。然而你的一个 diskedit.img 文件竟然也在这个软盘中,我猜想这个 IMG 文件也有 1.44M 那么大。这就有矛盾了!1.44M的软盘中居然还装下1.44M的IMG文件(还有别的大量文件),这应该是不可能的。

2。从你 cat 出来的第一扇区中发现,H=255,S=63,总扇区数=127937, C=127937/255/63=7.9637(向上舍入,等于8)。所以它是 C/H/S=8/255/63 的几何参数,总容量接近 64M。因此,这个盘当然可以装下 1.44M  的 IMG 了。但问题在于,BIOS 的 INT13 磁盘接口却以 C/H/S=80/2/18 来访问这个磁盘,最大只能访问 2880 个扇区,也就是开头的 1.44M 的内容。如果文件的一部分处于 1.44M 以后的位置,那就可能导致死机(死机的本身是属于 BIOS 的BUG,因为你可以读错,或者返回一个出错号码,但不应该死机)。

由以上分析可以设想,假如你 U 盘上的这个分区只有 1.44M 的大小(精确地说,是 2880 个扇区),那么你将不再碰到任何问题了。你可以重新分区你的U盘来证实这个猜想。总而言之,归根结底,还是 BIOS 的缺陷所导致的。假如 BIOS 允许读取超过 1.44M 的软盘,就不会有这样的问题出现了。你可以向主板厂商反映这一要求,要求他们不要限制 U 盘的启动容量,不要让 U 盘死机,真正贴心地为用户着想。

虽然还没有得到你的证实,但情况应该就是这样了。
作者: neiljoy     时间: 2006-7-24 11:35
按照你的要求,完成了以下试验,现报告如下:
1.我特意用WinImage制作了一个标准720KB的diskgen.img镜象文件,且经试用可以正常启动运行;
2.作一批处理,内容为:
grub.exe --config-file="map --mem (fd0)/diskgen.img (fd0);map (fd0) (fd1);map --floppies=2;map --hook;chainloader (fd0)+1;rootnoverify (fd0);"
仍与以前相同,当屏幕显示map --mem (fd0)/diskgen.img (fd0)时死机;
3.从U盘重新启动到DOS后,先运行GRUB,进入到GRUB命令行下,然后用quit返回到DOS下,运行Edit.com,打开上述镜象文件,能够完全打开(可以显示读出进度的百分比),该文件总共为4091行。
作者: 不点     时间: 2006-7-24 11:51
我不是要你制作一个小于 1.44M 的 IMG,而是要你把 U 盘的分区大小缩小为 1.44M。

如果分区大,一个小文件也可能被分配到 1.44M 以后的扇区,这样在打开时就会死机。

EDIT 是不能打开一个二进制的 IMG 文件的,只能打开其中的一部分而已。你需要用一个16进制的编辑器来打开,这个测试才有效。

你再确认一下,是不是在 GRUB 下可以打开 U 盘上的 IO.SYS 文件(DOS启动时读过它)。

如果同样失败死机,你准备一个 DEBUG 程序(DOS中有这个程序),我想让你在 DOS 下做进一步测试(测试 int 13 /AH=8,DL=0 的返回结果)。

还有啊,现在你可以做以下测试:

cat --hex (fd0)2878+1
cat --hex (fd0)2879+1
cat --hex (fd0)2880+1
cat --hex (fd0)2881+1
cat --hex (fd0)5000+1
cat --hex (fd0)127935+1

看看哪几个会死机?

[ Last edited by 不点 on 2006-7-24 at 12:09 ]
作者: fastslz     时间: 2006-7-24 11:53
笔误!我也被误进去了,改过来后25楼的第3个方法还是能启动的
作者: neiljoy     时间: 2006-7-24 12:04
你说用debug如何进行试验吧!
作者: neiljoy     时间: 2006-7-24 12:30
用第一个即cat --hex (fd0)2878+1就死机!
作者: fastslz     时间: 2006-7-24 12:34
neiljoy不防先更新下BIOS

华硕系列好象都支持在线更新
作者: neiljoy     时间: 2006-7-24 12:37
从华硕网站得知,这已经是最后的BIOS版本。
作者: 不点     时间: 2006-7-24 16:09
再给你一个任务,找出死机和不死机的界限:

cat --hex (fd0)xxxxxx+1

已知当 xxxxxx=0 时不死机,当 xxxxxx=2878 时死机,找出最大的 xxxxxx 值,使得 cat 命令不死机。

就像你刚刚测试的那样,它如果连 1.44M 以内的扇区都不能读的话,我估计玄了,我们可能最终也无能为力。

不过,你还是在 DOS 下做以下测试,死马当活马医:

敲入 debug 进入 debug 的命令行。然后敲入以下命令:

a                       ;这个 a 是汇编命令
mov    AH,8
mov    DL,0         ;DL,0就是代表 (fd0),如果U盘是 (fd1),此处就应该是 mov DL,1
int     13
int     3
                         ;此处多敲一个回车,结束汇编命令
g                       ;这个 g 是运行的意思

好了,现在把屏幕的输出结果贴上来。

最后再用一条 q 命令退出 debug 返回到 DOS 下:

q

[ Last edited by 不点 on 2006-7-24 at 16:24 ]
作者: neiljoy     时间: 2006-7-24 17:24
我正在作试验,才上网看到你在楼上的内容。先说说我自己作试验的情况,然后再做楼上的试验。
1.  我分别作了含有grub.exe、menu.lst和diskgen.img文件且容量分别为1.44M和2.88M的img镜象;
2.  在虚拟机上试验,运行批处理,1.44M的可以用GRUB启动diskgen.img,但2.88M的不可以,不过不会死机;
3.  在1.44M的情况下,无论有无
map (fd0) (fd1);map --floppies=2
均可启动diskgen.img;
4.  发现一个问题,无论是用最新版还是0.4.1版,即使grub.exe与menu.lst均在软驱根目录下,运行grub.exe也没有菜单显示(在虚拟机和真实软驱中均如此),提示错误17,文件未发现。

结论:1.在U盘为FD或ZIP模式下,无法用U盘上的grub.exe启动U盘内1.44M及其以上容量的镜象文件。
      2.U盘上运行GRUB死机的问题与USB_ZIP盘的数据结构(指有MBR、DBR)有关。
作者: neiljoy     时间: 2006-7-24 17:51
因此处不能发图,我的图已发往无忧论坛,参见:
http://bbs.wuyou.com/viewthread.php?tid=80080&extra=page%3D1

请尽快察看,说不定会被版主删除的。
作者: 不点     时间: 2006-7-24 18:10
--4.  发现一个问题,无论是用最新版还是0.4.1版,
--即使grub.exe与menu.lst均在软驱根目录下,
--运行grub.exe也没有菜单显示(在虚拟机和真实软驱中均如此),
--提示错误17,文件未发现。

这不是问题。grub.exe 不像 GRLDR 那样,能够判断出所在磁盘的分区号,因此 grub.exe 无法知道你是从软盘根目录运行的 grub.exe。运行 grub.exe 必须带有 --config-file=(fd0)/menu.lst 才行。否则就要用默认的 (hd0,0)/menu.lst
作者: neiljoy     时间: 2006-7-24 21:32
现提供虚拟机中的试验结果
试验对象:1.44M和2.88M镜象,相当于容量为1.44M(简称A)和2.88M(B)的两个软驱
试验过程:
  1.  运行grub.exe --config-file=(fd0)/menu.lst,A能显示菜单;B不能显示,进入GRUB命令行。
  2.  对B中的文件按顺序存放至空img中:最先是io.sys,接着依次是menu.lst、diskgen.img(720K)、grub.exe,其它文件可不按序放入。
  3.  重新执行grub.exe --config-file=(fd0)/menu.lst,B仍无菜单显示。
  4.  执行cat --hex (fd0)2879+1全显示“F6”,表明该扇区无文件(而且前面几个扇区也是空的),但在2880+1处显示:
      Error 26:Attempt to access block outside partition

疑问:按说几个关键文件均在最前面的扇区,从cat命令来看,也在GRUB读取范围之内,但仍不能显示菜单,也不能启动diskgen.img。不知是何道理?

[ Last edited by neiljoy on 2006-7-24 at 21:58 ]
作者: 不点     时间: 2006-7-24 22:19
很简单,虚拟机的 BIOS 不支持大于 1.44M 的软盘。

前面我说的另外一项测试也是需要的,就是找出使得 cat --hex (fd0)xxxxxxx+1 不死机的最大 xxxxxxx 来。

这个情况我估计还有解决的希望。需要你继续配合测试。

DOS 下用 debug 测试:
a                       ;这个 a 是汇编命令
mov    AX,201
mov    BX,200
mov    CX,4F12
mov    DX,100
int     13
int     3
                         ;此处多敲一个回车,结束汇编命令
g                       ;这个 g 是运行的意思
q                       ;退回到 DOS

报告是否死机。如果不死机,报告右下角显示的是 NC 呢,还是 CY?
作者: neiljoy     时间: 2006-7-24 22:51
1. 你说的虚拟机的BIOS不支持>1.44M的软盘,如何理解?事实上,我使用的VM同样可以正常启动2.88M的镜象。不支持何以能启动?我的试验又怎么能够进行?

2. 寻找不死机的最大XXXXX,我已经在39楼提供了2.88M(软盘)的测试结果。至于U盘,如果一死机,就要重新按复位键重启,又费时又麻烦,看情况吧,如果超过两次死机我就不想试了。

debug我过一会就试。上次是没有死机,否则无法抓图了!

[ Last edited by neiljoy on 2006-7-24 at 22:53 ]
作者: 不点     时间: 2006-7-24 23:23
1. 能启动,不能说明支持 2.88M,很可能你的文件都在 1.44M 以内。

2. 不要软盘测试结果,要U盘的(你不是要解决U盘不能访问的问题吗?)。测试 U 盘肯定要有死机发生,不过,如果你设计好,只需要若干次测试,就能找到最大的 xxxxx 来。这个并不麻烦,当然也许你觉得麻烦,那就罢了,继续测试 debug 吧。
作者: neiljoy     时间: 2006-7-24 23:36
UM近一段时间我常使用,用它启动运行2.88M的镜象文件是常事,均能正常运行,可以肯定的是,我使用的大多数镜象文件的占有空间均接近于2.88M,今天不过是个特例。

通过在虚拟机中对2.88M的试验,我对U盘已经不太乐观了。

现在提交U盘的试验报告:三次死机。
第一次,用2875+1;
第二次,用2850+1;
第三次,严格按照你的debug程序,当执行-g后即死机,此后屏幕当然也无显示,也无必要抓图了。
作者: 不点     时间: 2006-7-24 23:42
你应该用一个小的值去试验,才有希望不死机。

不过,你的测试很重要,debug 的死机,表明 DOS 下也不可以按照 80/2/18 的规格来访问U盘。这很有用。如果这个测试序列能够完成,我想应该解决 U盘访问的问题的,一定行。不过,现在该休息了,明天再来。
作者: 不点     时间: 2006-7-25 09:44
估计 C 最大只能是 7 和 8,所以,用 C=7,H=2,S=18 应该安全。

7 * 2 * 18 = 252
8 * 2 * 18 = 288

所以,我估计用 252 以内的值就不会死机了。最大值应该出现在 252 和 288 之间。

cat --hex (fd0)252+1
cat --hex (fd0)288+1

------------------------------------------

DOS 下用 debug 测试:
a                       ;这个 a 是汇编命令
mov    AX,4100
mov    BX,55AA
mov    DX,0
int     13
int     3
                         ;此处多敲一个回车,结束汇编命令
g                       ;这个 g 是运行的意思
q                       ;退回到 DOS

报告是否死机。如果不死机,报告右下角显示的是 NC 呢,还是 CY?还要报告显示的四个寄存器 AX,BX,CX,DX的值。


不管是否死机,上述测试完了之后,再做以下测试,那么全部的测试就都结束了。


DOS 下用 debug 测试:
a                       ;这个 a 是汇编命令
mov    AX,4800
mov    SI,180
mov    DX,0
int     13
int     3
                         ;此处多敲一个回车,结束汇编命令
g                       ;这个 g 是运行的意思
d 180                 ;显示 180 处的数据
q                       ;退回到 DOS

如果没有死机,把屏幕截图发上来。
作者: neiljoy     时间: 2006-7-25 10:29
现报告测试结果:
287+1,显示FF;
288+1,死机。

debug没死机,抓图仍见无忧原贴。

顺便说一下,你如果今天不说明,我昨天晚上就那样瞎试,那不是拆腾人吗?幸亏我没有试!
作者: neiljoy     时间: 2006-7-25 12:23
我后来才发现你还有后面的debug程序,现补上抓图。在同一位置。

注意,usb2~usb4就是后面的程序,没错!

[ Last edited by neiljoy on 2006-7-25 at 12:25 ]
作者: neiljoy     时间: 2006-7-25 13:54
我又再次认真地用虚拟机进行了试验,2.88M与1.44M一样,也同样成功了!
希望不点也能最终把U盘攻克!
作者: 不点     时间: 2006-7-25 14:48
行了,你做的很好,我会尽快研究解决办法的。等着看 http://grub4dos.jot.com/ 上的更新吧。

已经上载了一个修复,你看是否解决了?

[ Last edited by 不点 on 2006-7-25 at 15:28 ]
作者: neiljoy     时间: 2006-7-25 16:41
我下载的是grub_for_dos-2006-07-25.zip,经在U盘上试验,结果还是和原来一样。即:
1.  用grub.exe --config-file=(fd0)/menu.lst,死机。
2.  用批处理启动U盘内的img文件,死机。
死机时的屏幕显示与原来相同。
作者: 不点     时间: 2006-7-25 16:48
好,我今天会再上载一个的。

不过,你能否报告一下 geometry (fd0) 的输出结果?

另外,

cat --hex (fd0)+1
cat --hex (fd0)287+1
cat --hex (fd0)288+1
cat --hex (fd0)2879+1
cat --hex (fd0)2880+1

会死机吗?

[ Last edited by 不点 on 2006-7-25 at 17:21 ]
作者: neiljoy     时间: 2006-7-25 17:47
geometry输出:
drive 0x0:c/h/s=80/2/18,The mumber of sectors=2880,CHS Bytes per Sector=512
partition mun:0,Filesystem type unknown,partition type 0x74
partition mun:1,Filesystem type unknown,partition type 0x65
partition mun:2,Filesystem type unknown,partition type 0x53
partition mun:3,Filesystem type unknown,partition type 0xbb
partition mun:0,Filesystem type unknown,using whole disk


cat --hex (fd0)+1                有内容
cat --hex (fd0)287+1                显示ff               
cat --hex (fd0)288+1                死机
cat --hex (fd0)2879+1                死机
cat --hex (fd0)2880+1                未死机,显示错误26。

[ Last edited by neiljoy on 2006-7-25 at 17:55 ]
作者: 不点     时间: 2006-7-25 18:44
已经上载,请再试。估计差不多应该解决了。

万一还是失败,那么再报告 geometry (fd0) 的输出结果,以及下面这些是否死机:

cat --hex (fd0)+1
cat --hex (fd0)287+1
cat --hex (fd0)288+1

[ Last edited by 不点 on 2006-7-25 at 18:56 ]
作者: neiljoy     时间: 2006-7-25 20:46
我刚下载完毕,迫不及待地进行了测试,结果是--大功告成!!!!!!!!!
特地向grub_for_dos的创建者--不点大师表示最热烈的祝贺!最衷心的感谢!

有志者事竟成!!

我只是很快地粗略地试了一次,就赶快发出这个喜讯。
接下来我再比较细致地测试一下。
作者: 不点     时间: 2006-7-25 22:00
祝贺你,neiljoy!中国DOS联盟会见证并记录下你的功绩!

这个 BUG 已经存在很多年(几年前就有人在同一论坛报告这个BUG,但没能解决),是你坚持不懈的努力,最终帮助解决了问题。我作为一个编程者,也只是尽了我的义务。而没有你的测试,这个 BUG 可以说是很难解决的(达到 “几乎不可能解决” 的程度)。你,才是这次行动的主角。恭喜!也对你说,有志者事竟成!

这个 BUG 是 BIOS 和 GNU GRUB 共同 “拥有” 的 BUG。从你提供的测试结果中,我又了解了很多深层的有关 BIOS 的信息(有关 int13/ah=41h 的),这些有用的信息还可以用于其他程序的排错中。因此我本人在这里也对你表示特别的感谢!
作者: neiljoy     时间: 2006-7-25 22:16
让我们欢呼吧!让我们庆贺吧!
这一似乎不可愈越的难关终于被不点攻克了!!

又进行了一番测试,目前尚未发现问题。
geometry输出:
drive 0x0:c/h/s=96/255/63,The mumber of sectors=1542240,CHS Bytes per Sector=512
Filesystem type unknown,partition type 0x74
Filesystem type unknown,partition type 0x65
Filesystem type unknown,partition type 0x53
Filesystem type unknown,partition type 0xbb
Filesystem type unknown,using whole disk

52楼的几个死机的扇区正常,均有数据显示。
作者: fastslz     时间: 2006-7-25 22:40
neiljoy坚持不懈的精神可嘉
不点大帅耐心指导有方
恭喜!恭喜!
作者: globemobile     时间: 2006-8-7 22:04
同喜同喜!
作者: waffle     时间: 2006-8-20 15:30
"这个 BUG 是 BIOS 和 GNU GRUB 共同 “拥有” 的 BUG。"
不点能说说这是个什么样的bug吗?
作者: 不点     时间: 2006-8-20 16:49
在 neiljoy 写的另外一个主题中已经详细谈了这个 BUG 的有关信息。在本站搜索 neiljoy ,可以找到:

http://www.cn-dos.net/forum/viewthread.php?tid=22105&fpage=2
作者: waffle     时间: 2006-8-21 20:17
请问neiljoy,你用的是什么虚拟机?我用的是VMware 5.52,但启动选项里没有USB启动相关的内容,虚拟机里不能从u盘启动。
作者: neiljoy     时间: 2006-8-22 08:03


  Quote:
Originally posted by waffle at 2006-8-21 20:17:
请问neiljoy,你用的是什么虚拟机?我用的是VMware 5.52,但启动选项里没有USB启动相关的内容,虚拟机里不能从u盘启动。

我是在实机中进行的。
作者: rroo     时间: 2008-11-26 12:26
可能用
grub --config-file="find --set-root /menu.lst configfile /menu.lst”
------------------------------------------------------------
map --mem (fd0)/diskedit.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
boot
可免跳过对软驱(fd0)的访问
作者: woo88     时间: 2008-12-15 18:04
支持