无忧启动论坛

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

求解GRUB boot、rootnoverify等命令作用以及顺序……

[复制链接]
跳转到指定楼层
1#
发表于 2010-9-18 00:13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天对GRUB命令的一些细节感兴趣,所以也有如下四个问题,向不点、版主大大们和各位高手求解……先谢谢了!以下是这四个问题……

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

启动IMG镜像的常见写法

title Boot from Floppy image
map --mem /boot/grub/xxx.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)


问题一:为什么rootnoverify (fd0)是放在最后,我觉得就是与chainloader (fd0)+1的位置调换才更符合逻辑,或如此顺序有特殊效用,或是无所谓二者的顺序,而且我试了rootnoverify (fd0)可以不用?

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

启动ISO镜像的常见写法

title Boot myiso.iso
map --mem /myiso.iso (hd32)
map --hook
chainloader (hd32)
boot


问题二:为什么启动ISO要在最后加上boot,却不用rootnoverify (hd32),经测试不加boot也可以正常启动啊,为什么上面那个启动IMG的就不用boot命令?

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

问题三:假如我有一个某硬盘分区的镜像文件,那我可以这样么写么?

title Boot XX image
map --mem /boot/grub/xxx.img (hd32,0)
map --hook
rootnoverify (hd32,0)
makeactive
chainloader +1

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

问题四:假如我有一个某硬盘(包含了一柱面一磁头和MBR在内)的镜像文件,那我可以这样么写么?
title Boot XX image
map --mem /boot/grub/xxx.img (hd32)
map --hook
rootnoverify (hd32)
makeactive
chainloader (hd32)




[ 本帖最后由 zyphio 于 2010-9-18 00:28 编辑 ]
2#
 楼主| 发表于 2010-9-18 00:54:33 | 只看该作者
我的理解……

分区(hd0,0)和软盘(fd0),引导扇区都从第一扇区开始,要写成chainloader (hd0,0)+1这种形式……
如果前面有rootnoverify (hd0,0)或(fd0),可以写成chainloader +1……

如果是整个硬盘(hd0)或光盘(cd0),引导扇区不一定是在第一扇区,MBR不一定在第一扇区,而光盘启动扇区实际上是从第17扇区开始,所以要写成chainloader (hd0)或chainloader (cd0),如果前面有rootnoverify(hd0)或(cd0),那只要在最后写上不带参数的chainloader即可……

我觉得rootnoverify是为了避免分区文件系统无法识别时才有意义……对于整个盘时没涉及分区文件格式的加载没必要用rootnoverify语句……

至于在菜单中,chainloader后会自动boot,我觉得没必要再在后面加上boot……而在命令行模式下,chainloader后要boot才能开始启动……

对吗?

[ 本帖最后由 zyphio 于 2010-9-18 01:27 编辑 ]
回复

使用道具 举报

3#
发表于 2010-9-18 10:22:18 | 只看该作者
呵呵,我也有相同的疑问好久了,不过那样用也没有问题,就没有多想
回复

使用道具 举报

4#
发表于 2010-9-19 19:37:49 | 只看该作者
问题一: 什么rootnoverify (fd0)是放在最后,我觉得就是与chainloader (fd0)+1的位置调换才更符合逻辑,或如此顺序有特殊效用,或是无所谓二者的顺序,而且我试了rootnoverify (fd0)可以不用?
回答: 二者顺序随意  chainloader 命令是指定要引导的设备或文件 chainloader (fd0)+1 意思是说从软盘的第一扇区引导 rootnoverify 命令是用来改变当前路径的,在某些情况下不更改当前路径为要启动的设备可能出会错。
问题二: 为什么启动ISO要在最后加上boot,却不用rootnoverify (hd32),经测试不加boot也可以正常启动啊,为什么上面那个启动IMG的就不用boot命令?
回答:boot 命令可以不用写,也可以写上,这个无所谓,在菜单中不是必须的,boot只是用于在控制台下操作的时候用于启动的。(hd32)表示的是光盘,一般情况下可以不用更改当前路径。
问题三:假如我有一个某硬盘分区的镜像文件,那我可以这样么写么?
回答:不可以,因为(hd32)是用来表示光盘的,具体我没有测试过。

上面是我自己的一些理解,不正确的还请高手指教。
回复

使用道具 举报

5#
 楼主| 发表于 2010-9-25 15:53:03 | 只看该作者
原帖由 sgw888 于 2010-9-19 19:37 发表
问题一: 什么rootnoverify (fd0)是放在最后,我觉得就是与chainloader (fd0)+1的位置调换才更符合逻辑,或如此顺序有特殊效用,或是无所谓二者的顺序,而且我试了rootnoverify (fd0)可以不用?
回答: 二者顺序随意  chainloader 命令是指定要引导的设备或文件 chainloader (fd0)+1 意思是说从软盘的第一扇区引导 rootnoverify 命令是用来改变当前路径的,在某些情况下不更改当前路径为要启动的设备可能出会错。
问题二: 为什么启动ISO要在最后加上boot,却不用rootnoverify (hd32),经测试不加boot也可以正常启动啊,为什么上面那个启动IMG的就不用boot命令?
回答:boot 命令可以不用写,也可以写上,这个无所谓,在菜单中不是必须的,boot只是用于在控制台下操作的时候用于启动的。(hd32)表示的是光盘,一般情况下可以不用更改当前路径。
问题三:假如我有一个某硬盘分区的镜像文件,那我可以这样么写么?
回答:不可以,因为(hd32)是用来表示光盘的,具体我没有测试过。

上面是我自己的一些理解,不正确的还请高手指教。



太谢谢了!!!!

boot命令的作用确实如你所说……

我已经在一IBM的文献资料中查到了,大概如你所说,rootnoverify确实比较重要,可以让GRUB访问到第一个分区前的一些常规非可见的区域(像第一柱面第一磁头的63个扇区),从而提高了GRUB的兼容性,不论是分区还是整盘,都最好加上这一句,且我觉得放在chainloader前就不必在chainloader后注明设备,直接+1加载扇区……

对于第三、四个问题,(hd32)是用来表示光盘?已经hd打头了,启动后也是硬盘模式…这是GRUB里专门规定的是吧…
我想问的是最后面chainloader (hd0)和chainloader (hd0,0)+1的区别,是不是整个盘包含MBR的情况下不用指定+1扇区?!……

[ 本帖最后由 zyphio 于 2010-9-25 16:22 编辑 ]
回复

使用道具 举报

6#
发表于 2010-9-26 10:17:29 | 只看该作者
关于对(hd32)的权威解释,来源于grub4dos的readme.txt,如下:
Note: (hd32) is a grub drive number equivalent to (0xA0). If a virtual drive is
specified with a drive number greater than or equal to 0xA0, then it will be
treated as a cdrom (i.e., with 2048-byte big sectors).


实际上,无论是(fdX)还是(hdY)还是(cdZ),实质上都是对应设备的BIOS标识号(drive number),例如(fd0)对应(0x0),(hd0)对应(0x80),而(cd)应该对应(0xA0),也就是(hd32)。一般来说,0x80开始属于硬盘,而从(0xA0)开始就对应光驱了(直到0xFF)。
回复

使用道具 举报

7#
 楼主| 发表于 2011-1-9 16:31:34 | 只看该作者
原帖由 Climbing 于 2010-9-26 10:17 发表
关于对(hd32)的权威解释,来源于grub4dos的readme.txt,如下:


实际上,无论是(fdX)还是(hdY)还是(cdZ),实质上都是对应设备的BIOS标识号(drive number),例如(fd0)对应(0x0),(hd0)对应(0x80),而(cd)应 ...


谢谢版主……这个总算明白了……

刚看到不点的一个回帖……

chainloder (hd0)+1表示加载硬盘第一扇区,即MBR……
chainloder (fd0)+1表示加载软盘第一扇区,即PBR(VBR、DBR)……
chainloder (hd0,0)+1表示加载硬盘第一个分区第一扇区,也是PBR(VBR、DBR)……
chainloder (cd0)表示加载光驱的第17扇区,即光盘引导扇区
回复

使用道具 举报

8#
发表于 2011-1-9 20:26:58 | 只看该作者
学习中,多谢分享资料。
回复

使用道具 举报

9#
发表于 2011-1-10 14:21:04 | 只看该作者
原帖由 Climbing 于 2010-9-26 10:17 发表
关于对(hd32)的权威解释,来源于grub4dos的readme.txt,如下:


实际上,无论是(fdX)还是(hdY)还是(cdZ),实质上都是对应设备的BIOS标识号(drive number),例如(fd0)对应(0x0),(hd0)对应(0x80),而(cd)应 ...

原来是这样(hd32)就是(cd)郁闷很多天,这下明白了
回复

使用道具 举报

10#
发表于 2011-1-12 14:09:43 | 只看该作者
原先菜单中要不要boot都可以。最近C大更新g4d后菜单里支持批处理命令,要想激活菜单项,必须加上boot
回复

使用道具 举报

11#
发表于 2011-1-12 15:21:27 | 只看该作者
6楼 Climbing 的答复并不完全准确。

(cd) 不一定是 (hd32)。假如 (cd) 一定是 (hd32) 的话,我们就完全没必要创造 (hd32) 这个写法了(直接用 (cd) 多么容易记忆)。

(cd) 是 BIOS 提供的光盘,它的盘号是不确定的。微软等公司制订了光盘启动标准,这个标准并没有规定 BIOS 所提供的 CDROM 盘号应该是什么。在具体实现时,有的 BIOS 用 0xE0,有的用 0x9F,有的用 0xFF……总之,从 0x80 至 0xFF 之间的任何一个号码都可能被某个 BIOS 用于 cdrom。换句话说,grub4dos 中的 (cd) 所代表的盘号有可能是从 0x80 至 0xFF 之间的一个值,随着 BIOS 的不同而变化。

grub4dos 所建立的虚拟光盘的盘号在 0xA0 至 0xFF 之间。
回复

使用道具 举报

12#
 楼主| 发表于 2011-1-12 17:46:16 | 只看该作者
哈哈……

总算理解(hd32)特殊用意了……

这么说来……
例一:
        map --mem /boot/img/tinycore.iso (0xFF)
        map --hook
        rootnoverify (0xFF)
        chainloader (0xFF)

例二:
        map --mem /boot/img/tinycore.iso (hd32)
        map --hook
        rootnoverify (hd32)
        chainloader (hd32)

是不是意味着例二的兼容性更好呢?
回复

使用道具 举报

13#
发表于 2011-1-12 17:56:48 | 只看该作者

回复 #12 zyphio 的帖子

我记得是例一兼容性好于例二
回复

使用道具 举报

14#
 楼主| 发表于 2011-1-12 22:58:38 | 只看该作者

回复 #13 sratlf 的帖子

谢谢版主,能否告知是为什么呢?

用(hd32)这样不是避免了与物理光驱重叠吗?

[ 本帖最后由 zyphio 于 2011-1-12 23:00 编辑 ]
回复

使用道具 举报

15#
发表于 2011-1-13 09:02:31 | 只看该作者
顺便说下,记得在哪里看过,0xFF是最后一g4d虚拟的光盘号,仿真的时候用map 0xFF的效果好像要比hd32(0xA0)要好?避免与实际光驱冲突什么的。

[ 本帖最后由 liuzhaoyzz 于 2011-1-13 09:03 编辑 ]
回复

使用道具 举报

16#
 楼主| 发表于 2011-1-13 13:32:58 | 只看该作者
原帖由 liuzhaoyzz 于 2011-1-13 09:02 发表
顺便说下,记得在哪里看过,0xFF是最后一g4d虚拟的光盘号,仿真的时候用map 0xFF的效果好像要比hd32(0xA0)要好?避免与实际光驱冲突什么的。


(0xFF)确实是GRUB读取的BIOS里的最后一个设备号……

但上面不点又说“从 0x80 至 0xFF 之间的任何一个号码都可能被某个 BIOS 用于 cdrom”、“grub4dos 中的 (cd) 所代表的盘号有可能是从 0x80 至 0xFF 之间的一个值”,所以我的理解是GRUB创造出了(hd32),才不至于(cd)重叠……

难道说兼容性不是指这一方面的……而是指某些系统从ISO启动后,会把根据BIOS中的设备号来断定其自身是否是从光盘启动……兼容性就是体现在这里?

不解啊……

不点啊……版主啊……各位高手啊……解释一下啊……
回复

使用道具 举报

17#
发表于 2011-1-13 20:54:26 | 只看该作者
为了让 DOS 下的光盘驱动 eltorito.sys 能够躲过某些 bios 的 “bug”,使用 (0xff) 比别的都好。

目前 eltorito.sys 已经是一个开源项目了,由 syslinux 的开发者来维护。因此,我估计新版的 eltorito.sys 已经可以自动躲避恶意 BIOS 的 “bug” 了。也就是说,即使把 (0xff) 换成别的,也应该可以了。大家应该测试一下新版 eltorito.sys 的主板适应情况。

当你使用虚拟光盘 (hd32) .... (0xFF) 的时候,通常你不指望能够访问 (cd) 上的文件。因此,即使 (hd32) ... (0xFF) 把 (cd) 覆盖了,也没有什么关系的。如果你实在担心覆盖,你可以使用以下的方法:

map (cd) (hd33)
map /.../my.iso (hd32)
map --hook

这样,当 (hd32) 与 (cd) 重叠时,你用 (hd33) 照样可以访问原来的 (cd) 设备。这与硬盘仿真的情况类似。通常是没必要这么折腾的。

通常我们所说的“兼容性”,是指硬件兼容性,也就是说,为了躲避硬件制造商的 “bug” 而采取的额外步骤。这里的 bug 带了引号,表示这不是通常的 bug,而可能是硬件制造商为了某种目的而故意制造的陷阱。

我们一般不考虑软件兼容性。换句话说,如果什么软件与 grub4dos 发生了冲突,只要我们知道 grub4dos 没有 bug,那么我们不去寻求额外的努力来兼容那些软件,除非那个软件特别 NB,比如,它是微软的软件,有着绝对的市场占有率。
回复

使用道具 举报

18#
发表于 2011-1-15 12:39:58 | 只看该作者
学习中,   多谢分享。
回复

使用道具 举报

19#
发表于 2011-7-9 15:59:21 | 只看该作者
学习中,多谢分享.............每天进步一点点
回复

使用道具 举报

20#
发表于 2011-9-26 01:35:27 | 只看该作者
楼上 咱们的态度一样
回复

使用道具 举报

21#
发表于 2011-10-10 11:13:29 | 只看该作者
看完了,  受教了。
回复

使用道具 举报

22#
发表于 2011-10-29 09:19:58 | 只看该作者
謝謝分享經驗。。學習了。
回复

使用道具 举报

23#
发表于 2011-10-30 16:33:33 | 只看该作者
title Boot myiso.iso
map --mem /myiso.iso (hd32)
map --hook
chainloader (hd32)
boot


这样写无法识别到文件。不知为何?

点评

好帖,学习,顶一下,顺便回答一个两年前的问题,呵呵: 这样写,连路径都没有指定,当然无法识别iso 可以在map前加一句: find --set-root /myiso.iso 就可以识别了 或者指定磁盘路径: map --mem (hd0,1)/  详情 回复 发表于 2013-11-6 17:21
回复

使用道具 举报

24#
发表于 2013-1-28 13:39:27 | 只看该作者
这是个好贴!!!要顶上去让更多人看到!!!!
回复

使用道具 举报

25#
发表于 2013-8-29 05:07:56 | 只看该作者
好好学习,天天向上!!!
回复

使用道具 举报

26#
发表于 2013-11-6 17:21:15 | 只看该作者
wanghh 发表于 2011-10-30 16:33
这样写无法识别到文件。不知为何?

好帖,学习,顶一下,顺便回答一个两年前的问题,呵呵:

这样写,连路径都没有指定,当然无法识别iso
可以在map前加一句:
find --set-root /myiso.iso
就可以识别了
或者指定磁盘路径:
map --mem (hd0,1)/myiso.iso (hd32)

回复

使用道具 举报

27#
发表于 2015-3-4 23:25:06 | 只看该作者
正如我在 17 楼所说,虚拟光盘盘号采用 0xFF,纯粹是为了躲避 bios 的 bug 或者 bios 制造商的攻击。其影响的范围仅仅是 dos 下的 eltorito.sys 这个光盘驱动软件。如果不采用 0xFF 而采用别的虚拟光盘号码,则容易掉进恶意 bios 制造商所制造的陷阱里面。

如果你从来不进入 dos,或者虽然进入 dos,但永远不在 config.sys 中使用 eltorito.sys 这个驱动程序,那么,你可以使用任何一个虚拟光盘盘号,也就是说,0xA0 至 0xFF 之间的任何一个盘号都可以作为你的虚拟光盘的盘号。

顺便说,如果你需要使用 eltorito.sys 这个驱动程序,你应该使用 grub4dos 自带的 eltorito.sys 而不是 syslinux 当中的 eltorito.sys 。grub4dos 里面的 eltorito.sys 解决了 syslinux 所带的原版 eltorito.sys 的几个 bug,因而具有更好的硬件兼容性。

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-30 11:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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