无忧启动论坛

标题: 【已解决】关于grub4dos中的两个命令的疑惑 [打印本页]

作者: Hcrty    时间: 2010-10-8 18:00
标题: 【已解决】关于grub4dos中的两个命令的疑惑
偶可以说是个菜鸟...

在这次国庆之余,比较认真的学了一下grub4dos一些命令

不过,碰到了一个比较纠结的问题...

坛子上有关这两个的命令也写的很乱

有的 rootnoverify 居前,有的 chainloader 居前,不过总归能启动IMG和ISO工具

而这次我遇到了却不是两种写法通吃...

rootnoverify  与 chainloader 的前后问题??!

对于 ATI2010.iso (取自 忠诚维护盘 )

map --mem /BOOT/IMGS/BKRT/ATI2010.ISO (0xff)
map --hook
chainloader (0xff)
rootnoverify (hd32)
boot
这种chainloader居前写法启动失败...

而交换两个命令的顺序则成功
map --mem /BOOT/IMGS/BKRT/ATI2010.ISO (0xff)
map --hook
rootnoverify (hd32)
chainloader (0xff)
boot

这是为什么??!

[ 本帖最后由 丞羽 于 2010-10-8 23:17 编辑 ]

2.png (4.47 KB, 下载次数: 195)

失败

失败

3.png (4.33 KB, 下载次数: 183)

成功

成功

作者: chenall    时间: 2010-10-8 18:47
你rootnoverify和chainloader的不是同一个磁盘当然失败了。

相当于你叫人去超市帮你买药。

如果这家超市刚好有卖药就或以买到了。如果没有当然是买不到了。

rootnoverify 设定启动磁盘号。(可能这个说法不是很贴切)

比如你可以先从(cd)上chainloader一个bootmgr
然后
rootnoverify (hd0,0)
就可以启动硬盘上的NT6系统了.

[ 本帖最后由 chenall 于 2010-10-8 18:52 编辑 ]
作者: sratlf    时间: 2010-10-8 19:00
标题: 回复 #1 丞羽 的帖子
root  用来指定根设备

rootnoverify  也可以用来指定根设备。root在设置根设备前,先测试一下该分区的文件系统是否可以识别,而rootnoverify则省略这一测试。

加载img时直接chainloader可以  但是在之前加上rootnoverify再chainloader成功率较高
作者: wlsx    时间: 2010-10-8 20:35
rootnoverify和chainloader的不是同一个磁盘当然失败了。
作者: Hcrty    时间: 2010-10-8 21:55
受教...
谢谢....

[ 本帖最后由 丞羽 于 2010-10-10 17:05 编辑 ]
作者: intellect    时间: 2010-10-9 09:40
3楼的版主不是说了“加载img时直接chainloader可以  但是在之前加上rootnoverify再chainloader成功率较高”这样看就是第一个写法好,我也学到了这个方面的知识,谢谢C大,和版主。
作者: yjstone    时间: 2010-10-9 16:37
我看了不是很懂,很明显地,chainloader 和rootnoverify 的不是同一个设备,但为什么chainloader (0xff)在rootnoverify (hd32)之前不可以,但rootnoverify (hd32)在chainloader (0xff)之前就可以了呢?
比如以我的Ram2003启动菜单为例,我的Ram2003镜像放在(hd0,1)上,是通过放在(hd0,1)的软盘镜像里的ntldr来加载的(boot.ini、NTDETECT.com都放在软盘镜像里),(hd0,1)是激活的启动分区。
原来的启动菜单一直是这样的:
title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr

这个启动菜单当然是没有问题的,看到这个贴子这后,我这样改写了启动菜单:

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
root (hd0,1)
chainloader (fd0)/ntldr

这时依然可以启动成功,但一将root (hd0,1)放到最后便启动失败了:

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr
root (hd0,1)

而下面两个菜单都是可以成功的:
title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr
root (fd0)

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
root (fd0)
chainloader /ntldr

向各位请教了。

[ 本帖最后由 yjstone 于 2010-10-9 16:42 编辑 ]
作者: sratlf    时间: 2010-10-9 16:51
标题: 回复 #7 yjstone 的帖子
root并不等于rootnoverify
作者: yjstone    时间: 2010-10-9 23:43
root命令的确与rootnoverify命令不尽相同,但貌似这与我的问题并没什么关系。
作者: sratlf    时间: 2010-10-9 23:53
标题: 回复 #9 yjstone 的帖子
chainloader前加rootnoverify可以提高成功率  但是没说加root可以  而且root也不是能随便乱加的
作者: yjstone    时间: 2010-10-10 00:22
标题: 回复 #10 sratlf 的帖子
既然你如此执着那我虚心地这样提问好了:
我看了不是很懂,很明显地,chainloader 和rootnoverifynoverify 的不是同一个设备,但为什么chainloader (0xff)在rootnoverifynoverify (hd32)之前不可以,但rootnoverifynoverify (hd32)在chainloader (0xff)之前就可以了呢?
比如以我的Ram2003启动菜单为例,我的Ram2003镜像放在(hd0,1)上,是通过放在(hd0,1)的软盘镜像里的ntldr来加载的(boot.ini、NTDETECT.com都放在软盘镜像里),(hd0,1)是激活的启动分区。
原来的启动菜单一直是这样的:
title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr

这个启动菜单当然是没有问题的,看到这个贴子这后,我这样改写了启动菜单:

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
rootnoverify (hd0,1)
chainloader (fd0)/ntldr

这时依然可以启动成功,但一将rootnoverify (hd0,1)放到最后便启动失败了:

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr
rootnoverify (hd0,1)

而下面两个菜单都是可以成功的:
title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr
rootnoverify (fd0)

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
rootnoverify (fd0)
chainloader /ntldr

向各位请教了。
作者: 2010倒影    时间: 2010-10-10 17:59
路过,观瞻,学习!~
作者: sgw888    时间: 2010-10-10 18:23
这时依然可以启动成功,但一将rootnoverify (hd0,1)放到最后便启动失败了:

title 启动Ram 2003
map --mem /2003.ima (fd0)
map --hook
chainloader (fd0)/ntldr
rootnoverify (hd0,1)

我来解释一下,看我说的对不对。
我的理解是不管是ROOT命令,还是ROOTNOVERIFY 命令,其结果都是改变当前路径。
CHAINLOADER (FD0)/NTLDR 是把启动文件指向FD0的NTLDR。
默认情况下NTLDR应该是会去引导HD0,0的相关启动文件的。而使用了ROOTNOVERIFY (HD0,1)之后,当前路径变成了HD0,1 也就是第一硬盘的第二主分区,NTLDR可能会去搜索HD0,1,这样就导致了启动失败。可能我表达的不是太清楚,希望高手来解释一下。
作者: chenall    时间: 2010-10-10 20:12
见2楼的解释。

rootnoverify /root 指定要启动时使用的设备号。只要了解了这一点就不会有迷惑了。

并且前面因为root和chainloader的设备号不一样时,启动失败。

并不是因为找不到chainloader的文件,失败其实已经和grub4dos无关了,因为只要chainloader成功了。其它是加载的文件的关系了。

比如你chainloader ntldr以后,再rootnoverify到其它设备,启动时NTLDR可能就会提示NTDETECT.COM不存在。
如果chainloader 一个IO.SYS那可能就是提示COMMAND.COM找不到。
这些都不再是GRUB4DOS的问题了。

如果是针对同一设备.
那rootnoverify和chainloader的顺序无关紧要。

[ 本帖最后由 chenall 于 2010-10-10 20:16 编辑 ]
作者: chenall    时间: 2010-10-10 20:21
原帖由 yjstone 于 2010-10-9 23:43 发表
root命令的确与rootnoverify命令不尽相同,但貌似这与我的问题并没什么关系。


rootnoverify 不检测root文件系统强制设置root.  比如你可以rootnoverify (hd88,8),强制设置root为(hd88,8)

root 如果设备不存在或文件系统不可识别都会出错。

rootnoverify 一般是在引导IMG时配合chainloader +1或(fdx)之类的形式来启动。

如果不是+1也不是像(fdx),(hdx,y)之类的那rootnoverify可有可无。
像chainloader /IO.SYS /NTLDR /BOOTMGR 这些都不需要rootnoverify。
作者: 2010weihu    时间: 2010-10-11 15:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: yjstone    时间: 2010-10-12 00:29
多谢楼上几位的热心解答,我在两台电脑(都有两个硬盘)测试了一下,发现了一些有趣的东西,总结如下:
1、如果是从map的镜像生效的设备chainloader启动则不用事先或事后指定根设备的,例如:
totle 启动DOS(启动成功)
map --mem /dos.ima (fd0)
map --hook
chainloader (fd0)/io.sys 或者 chainloader (fd0)+1

totle 启动RamXP(启动成功)
map --mem /ramxp.img (hd0)
map --hook
chainloader (hd0,0)/ntldr

2、如果有某些需要要在chainloader命令之前使用root(或rootnoverify)命令指定其它的根设备(非map镜像的设备)时,则不论root(rootnoverify)什么设备都对启动没有影响,例如:
totle 启动DOS(启动成功)
map --mem /dos.ima (fd0)
map --hook
root (hd0,0)
chainloader (fd0)/io.sys 或者 chainloader (fd0)+1

totle 启动RamXP(启动成功)
map --mem /ramxp.img (hd0)
map --hook
root (hd1,1)
chainloader (hd0,0)/ntldr
(请注意,以上两个菜单root和chainloader的是两个不同的设备)
以上菜单都是可以启动成功的.但将root(rootnoverify)命令放在chainloader之后则根据启动的系统不同而对启动有着不同的影响,例如下面的启动菜单是可以启动成功的:
totle 启动RamXP(启动成功)
map --mem /ramxp.img (hd0)
map --hook
chainloader (hd0,0)/ntldr
root (hd1,1)

但下面这个菜单则不能启动成功:
totle 启动RamXP(启动不成功)
map --mem /ramxp.img (hd0)
map --mem /test.ima (fd0)
map --hook
chainloader (hd0,0)/ntldr
root (fd0)
而奇怪的是用上面的菜单RamWindows7却可以启动成功,
totle 启动RamWin7(启动成功)
map --mem /ramwin7.img (hd0)
map --mem /test.ima (fd0)
map --hook
chainloader (hd0,0)/bootmgr
root (fd0)

3、同时还发现对于RamOS来说,如果是NT5.X(XP/2003)的系统则必须将镜像map 为(hd0),否则不能启动成功,但对于windows7系统来说则无此限制,例如你如果愿意甚至可以这样启动RamWin7:

title 启动RamWindows7(启动成功)
map --mem /ramwin7.img (hd8)
map --hook
map --harddrives=9
chainloader (hd8,0)/bootmgr

因此,基于Windows7的以上特性,如果你想从第一个硬盘启动的Grub4Dos来启动放在第二个硬盘的Windows7,可以这样来直接启动,
title 启动第二个硬盘的windows7
chainloader (hd1)+1
#或者chainloader (hd1,0)/bootmgr (假设Win7装在第一个主分区)

而对于启动放在第二个硬盘的NT5.X(XP/2003)来说,则必须要交换硬盘后才能启动成功,
title 启动第二个硬盘的XP系统
map (hd1) (hd0)
map (hd0) (hd1)
map --hook
chainloader (hd0)+1

以上纯粹经验之谈,毫无技术含量,如有错误请不吝指正。

[ 本帖最后由 yjstone 于 2010-10-12 00:36 编辑 ]
作者: 2010775454215    时间: 2010-10-17 17:20
支持楼主
支持楼主
支持楼主
支持楼主
作者: 2010wmwa    时间: 2010-10-17 20:26
跟楼主一样,也是十一假期接触grub4dos的,将无忧论坛看了近百个帖子了。
简单说下自己的心得:
1. rootnoverify是改变当前根目录的,我的U盘启动后默认是(ud),要访问外部U盘可见分区上的菜单等内容就改变到(hd0,0),这样root之后的所有的相对路径的访问都是改变后的当前目录了。
2. 对于软盘IMG虚拟后是需要用root的,这样DOS起来后批处理中的各命令的路径就对了。
3. 对于光盘ISO虚拟后,由于ISO是自引导启动方式的,所以不需要root改变当前根目录路径了。
4. root应放置在chainloader前更科学,理由见2,3
5.启动其他分区上的windows xp系列,需要改变映射到(hd0,0),即grub4dos启动后识别的默认的激活主分区,当然我这个是U盘启动的,其默认的激活主分区就是(hd0,0),即第一硬盘第一分区。
6. map --hook命令对所有之前的map均起作用,这样不需要每map一个就hook一下。
ok了
作者: dcdsyzc    时间: 2022-10-3 16:36
弄明白命令是啥意思是王道
作者: Liusy20837@hz    时间: 2022-10-22 19:30
我要学习,谢谢各位大神




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3