LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1752|回复: 14

问题: 关于GRUB配置中“root(hd#,#)”的定义

[复制链接]
发表于 2008-11-14 14:05:36 | 显示全部楼层 |阅读模式
引导多重操作系统的时候,在GRUB中通常会有这样的配置:

default=0
timeout=5
title Fedora Core (2.6.11-1.1369_FC4)
        root (hd0,3)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd /boot/initrd-2.6.11-1.1369_FC4.img
title WinXp
        root (hd0,0)
        chainloader +1

root(hd#,#) 是指内核所在的分区(或者说是/boot所在分区),比如第4行的root (hd0,3),我查询过许多资料也都是这么说,这是在直接搜索内核文件来启动系统的时候

但是如果是使用chaniloader的时候呢?

如果是windows没有问题,因为windows的内核和引导加载程序都在同一分区,比如第8行的root (hd0,0)

如果是linux, 内核和引导加载程序可以位于不同分区,比如内核在hda5[/boot分区,包含内核和grub第二阶段的设置文件],引导加载程序在hda4[根分区,grub第一阶段的主程序在它的第一个扇区], 那么,

root(hd#,#) 是用root(hd0,4)[hda5]还是root(hd0,3)[hda4]呢?

如果是用root(hd0,3)[hda4],那么它是引导加载程序(grub第一阶段的主程序)所在的分区,而不是内核所在的分区(或者说不是启动分区,包含内核和grub第二阶段的设置文件),是不是这样呢?

清高手解答,谢谢!
发表于 2008-11-14 15:25:09 | 显示全部楼层
不是高手哈,我的理解:
root 只是指示 grub 所在的分区。
kernel 那一行才指定内核所在的分区。两者的指定方法不同,例如你这里的例子是用 root=LABEL=/ 来指定的,这实际就对应了 /dev/disk/by-label// 这个文件,你可以查看你机器上的对应目录。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-14 15:40:36 | 显示全部楼层
楼上理解有误

如果是直接搜索内核文件来启动系统的话,
root(hd#,#) 是指内核所在分区,或者称作启动分区(BOOT分区),同时包含GRUB目录
kernel 只是指出内核文件所在的路径名和文件名
initrd (同上)

但是如果是使用chaniloader,而且是引导另一个linux的时候,我就不知道root(hd#,#)是指引导加载程序所在的分区,还是内核所在的分区? [假设分/和BOOT两个分区]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-14 15:52:06 | 显示全部楼层
或者说在使用chaniloader的时候,要求一定要将引导加载程序和内核放在相同分区?
回复 支持 反对

使用道具 举报

发表于 2008-11-14 16:23:53 | 显示全部楼层
title WinXp
root (hd0,0)
chainloader +1
当你用这种方式去引导Linux2的时候,root里面就是指定的Linux2的引导分区,即/boot所在的分区(有可能和根分区同一分区,也可能另开一个),
这时就会开启另外一个Grub,

当然,你也可以直接在这Grub1里面
kernel上Linux2的内核,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-14 16:36:51 | 显示全部楼层
楼上,你的意思我能理解,可是我有一个问题,如果分/和BOOT两个分区,而且Linux2的引导分区,即/boot所在的分区中只有KERNEL和GRUB  STAGE2,GRUB  STAGE1是在Linux2/分区的第一个扇区,也就是超级块里面,那么root里面是指定的Linux2的BOOT分区还是/分区呢?
回复 支持 反对

使用道具 举报

发表于 2008-11-14 17:07:58 | 显示全部楼层
Sorry,我没有完全明白你的意思,可能是我的理解力差,

什么叫"只有KERNEL和GRUB STAGE2"???

不管怎么样,/boot里面都是有stage1,state2和那些...stage1_5的,
stage1是bootloader的备份,不管Grub是装在MBR中的还是还是分区boot sector中的.

以这个为例:
title Fedora Core (2.6.11-1.1369_FC4)
root (hd0,3)
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
initrd /boot/initrd-2.6.11-1.1369_FC4.img

root命令中指的是/boot分区,(也可能是根分区)
kernel参数root=指是的根分区,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-14 17:24:18 | 显示全部楼层
我可能没说明白,首先说明一下GRUB分两个阶段来执行,第一阶段可以放在MBR或超级块中,是作为主程序,第二阶段放在/BOOT/GRUB里面,是相关设置文件。

我的意思是如果分/和BOOT两个分区,GRUB第一阶段的主程序放在/分区的超级块中,GRUB第二阶段的相关设置文件放在BOOT分区的GRUB目录中(同时内核也在该分区中,所以该分区也作为启动分区)。

此时,如果使用CHAINLOADER来引导LINUX2,那么在ROOT后应该用/分区还是BOOT分区?
回复 支持 反对

使用道具 举报

发表于 2008-11-14 17:25:31 | 显示全部楼层
互相学习。干嘛那么复杂,/boot(目录或分区)一定是存放内核的目录,你make install内核就一定装到那里,没有目录那就给你建一个,当然你也可以独立出来作为一个分区,用/dev/sda4挂到 /boot目录;grub程序默认也安装到那个目录中(/boot/grub),没有也给你建一个(当然你也可以选择安装到其他地方),当然grub会把关键代码植入mbr或某分区的第一扇区。接下来就可以引导了...
回复 支持 反对

使用道具 举报

发表于 2008-11-14 17:34:38 | 显示全部楼层
Post by alpie8;1908542
如果使用CHAINLOADER来引导LINUX2,那么在ROOT后应该用/分区还是BOOT分区?

这一点我认为和grub有关,和内核无关,就看grub把那部分关键代码放到哪里去了?是sda4 还是sda5,windows loader找到grub的代码后执行之,然后grub运行,接管引导...你可以用grub-install /dev/sdX来安装,或者用dd分别导出sda4和sda5的前512字节,然后让windows loader引导看一看就知道了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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