IT应用产品技术研究
分类: LINUX
2014-03-28 18:29:58
绝对是可以引导多块硬盘的。我自己的机器就是在 hda 上面装的 Linux ,在 hdc 上面装的是 dos 和 win2000.(主要是 hdc 40G ,是公司的硬盘, hda 是我自己的,并且,hda 是后来接上去的。win2000 dos 所在硬盘没有做过任何改变。不影响工作的关键数据)。在 hda 上面装的 grub , 用它引导linux 和 win2000。
只要注意的使用 map , makeactive ,chainload +1 .这些命令的使用。只要写对了,就没有问题。可以在 grub 启动以后, 按键盘 c 进入命令模式,依次敲入你的 配制。最后敲 boot 。一次次试验,写对了配制,就能引导,写错了,也就显示一个错误信息,也不会死机,可以重新继续敲命令。不用每次进入 Linux 或 FreeBSD 改 grub.conf 。grub 的命令行方式和 bash 很像,同时也是支持按 TAB 键自动补全的,很方便的。可以在不起动系统的情况下,浏览,查看linux 分区里面的目录,文件哈。(cat 命令)多尝试,多看资料,没有问题的。
毕竟,我的机器上确实这样作到了。
同时,我家里的机器,也用的 grub 引导的 Linux 和 FreeBSD.分别是不同的硬盘。都没有问题。
查阅了 grub 官方网站上的手册,结合自己的使用实践, map 指令是可以只用一个的。但通常情况下,写 两个 map 是更可靠的。
grub 官方网站上对于 map 指令的解释(自己翻译的 ,见笑):
首先,要明确一点,grub 是依照系统 BIOS 而确定的设备号,从0开始。设备名需要用()括起来。例如:(hd0,1) 。其中,hd 表示一个硬盘设备,fd表示一个软盘设备。
第一个整数表示设备号。故,第一块硬盘被标为 hd0,第二块硬盘被标为 hd1。依次类推;第二个整数表示分区号(或者 BSD 术语中的 PC slice 号),也是从0开始的。因此, (hd0,1) 表示了第一块硬盘的第2个分区。
又: (hd0,4) 表示了第一块硬盘的第一个扩展分区。
(hd1,a) 表示了第二块硬盘上的一个 BSD 分区。如果需要指明具体哪一个 PC slice ,你需要写成类似下面的样子 (hd1,0,a)。如果没有指明 slice 号,grub 将寻找第一个含有一个 a 分区的slice。
然后,解释下 map 的用法。
map (diskA) (diskB) :
映射驱动器 diskB 到 驱动器diskA。仅在链式装载其他的操作系统时需要使用,比如 Dos, Windows,当它们不在第一个启动驱动器的时候需要。对于依赖 BIOS 确定驱动器顺序的系统才有作用。还是比如: Dos,windows。
例如:
map (hd1) (hd0)
map (hd0) (hd1)
这个命令交换了第一个硬盘和第二个硬盘的顺序。
我的使用实例:
第一块物理硬盘装的 Linux ,grub 和 Linux 装在一个硬盘。第二块物理硬盘装的 Windows2000。我的grub 的 grub.conf 内容为:
# Magiclinux
root (hd0,0)
kernel /vmlinuz-2.4.20-1.1 ro root=LABEL=/
initrd /initrd-2.4.20-1.1.img
# Windows 2000
root (hd1,0)
map (hd1) (hd0)
chainloader +1
因为 Windows 只能从第一个硬盘启动,并且它又是依赖 BIOS 确定硬盘顺序的。所以,我用 map (hd1,hd0) 把我的第 二 块物理硬盘映射到第一块硬盘。这个在 BIOS 里面改成第二块硬盘启动电脑是一样的作用。
还有一台机器,第一块物理硬盘装的 windows98 ,第二块物理硬盘装的是 Linux,grub 和 Linux 装在一个硬盘。使用 grub 启动机器,所以在 BIOS 里面交换了硬盘逻辑顺序,用第二块硬盘启动。这个会影响 windows 确定磁盘。所以grub里面要再交换硬盘顺序,把第一个物理硬盘,也就是放 windows98的那个变为第一个硬盘。 这次 grub.conf 的内容:
# Magiclinux
root (hd0,0)
kernel /vmlinuz-2.4.20-1.1 ro root=LABEL=/
initrd /initrd-2.4.20-1.1.img
# Windows 98
root (hd1,0)
map (hd1) (hd0)
map (hd0) (hd1)
chainloader +1
# FreeBSD
root (hd1,1,a)
kernel /boot/loader
这样,把硬盘的顺序第一块和第二块,通过两次映射调了个个,消除了 BIOS 里改变启动顺序的影响,还原了 windows 从第一块硬盘启动的环境。所以,成功启动了。我的爱机第一块物理硬盘还有 FreeBSD。装在第 2 个主分区。
最后,放一个 grub 官方手册里面引导 FreeBSD 的写法,我的爱机也是参照这个写的。想来,作为 FreeBSD 的爱好者,这个也是很有用的。
# For Booting FreeBSD
title FreeBSD
root (hd0,2,a)
kernel /boot/loader
FreeBSD 是用自己的 loader 引导自己的。所以,上面这个配置意思是装载第一块硬盘的第 三 个 PC slice 的 a 分区里的 FreeBSD 的 kernel loader。
简单的描述一下 grub 的用法:
title
是告诉 grub 显示一个什么样的列表标头。
root (hd0,1)
是告诉 grub 操作系统内核所在位置在第 1 块硬盘,第 2 个分区。普通人装 linux 分一个 /boot ,就会是这种。
root (hd0,0,a)
类推,是告诉引导第一块硬盘上第一个 slias 上的 a 分区。 FreeBSD 必须是这种 3 个参数。这种写法跟它的分区方式有关。
map (diskA) (diskB) :
映射驱动器 diskB 到 驱动器diskA。
makeactive
是让 grub 把 root 命令中描述的物理磁盘的那个分区变成活动分区
chainloader +1
将指定的文件作为一个链式装载程序载入。为了获取在一个指定分区第一扇区内的文件,使用+1作为文件名。由于 grub 不能直接启动 Dos , Windows,必须使用链式装载。
kernel :
当使用直接载入方式引导操作系统时,kernel命令指定内核从GRUB的指明的根文件系统(就是 root 指令确定的那个)中载入。
initrd file ... :
加载一个 linux 格式的 ram 盘 (ram disk) 启动映象当内核为了完全引导而需要某些模块时,这是必需的。
boot
是依照之前这些命令所要求的参数,启动机器的
rootnoverify device [hdbias]:
与 root 命令类似,区别在于不去做挂载该分区的尝试。对于操作系统在磁盘中 grub 所能读取的范围之外的情况下非常有用。
基本上,我们常用的就是这些命令。足够引导 我们遇的到的系统了。包括 FreeBSD linux windos dos.其他的由于个人硬件条件所限,没有尝试过。