# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-53.1.14.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-53.1.14.el5
module /vmlinuz-2.6.18-53.1.14.el5xen ro root=/dev/VolGroup00/LogVol00 rhgb quiet
module /initrd-2.6.18-53.1.14.el5xen.img
title CentOS (2.6.18-53.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-53.el5
module /vmlinuz-2.6.18-53.el5xen ro root=/dev/VolGroup00/LogVol00 rhgb quiet
module /initrd-2.6.18-53.el5xen.img
Grub是如何找到硬盘的?grub对硬盘的代码设置有点像:
(hd0,0)
- 硬盘代号用小于号括起来的;
- 硬盘以hd表示,后面会接一组数字;
- 以“搜寻顺序作为硬盘代号,而不是依照硬盘排线的顺序!(这点很重要)
- 第一个搜寻到的硬盘代号为0,第二个为1,以此类推;
- 每块硬盘的第一个partition代号为0,以此类推。
在grub的配置文件中,title以前的四行是用来对grub进行整体设定的:
- default=0 开机时的默认选择项目,这个必须与title对照,0表示对应一个title,1表示对应第二个title,以此类推。
- timeout=5 如果设置了hiddenmenu,则等待5s,如没有按下任意键则执行默认的title项目。
- splashimage=(hd0,0)/grub/splash.xpm.gz 在选单中显示的图片。
- hiddenmenu 不显示选单。
title用于设置开机的设定项目,开机是可以选择直接指定内核进行启动或者将控制权交给下一个Loader(chain loader)。
1、直接指定内核启动:
title CentOS (2.6.18-53.1.14.el5xen) <--在选单中的显示名
root (hd0,0) <--设定内核所在的磁盘位置
kernel /xen.gz-2.6.18-53.1.14.el5 <--设定使用的内核
module /vmlinuz-2.6.18-53.1.14.el5xen ro root=/dev/VolGroup00/LogVol00 rhgb quiet <--设定根目录位置
module /initrd-2.6.18-53.1.14.el5xen.img <--设定initrd(虚拟化磁盘)镜像文件名
initrd 称为初始化虚拟磁盘,用于帮助加载核心模块,让Linux内核在开机过程中不需挂载根目录就能载入所需要的模块。如果你的filesystem为LVM, Raid时,或者硬盘为SCSI接口(包括SATA和USB接口)时,Linux内核将无法认识这些设备从而导致不能正常启动。而initrd可以通过 int13 芯片读取核心模块(驱动程序),当硬盘被驱动后内核就可以挂载根目录了。其他模块的读取也就没问题了。
2、利用chain loader方式将控制权交给下一个grub:
title Windows Partition
rootnoverify (hd0,0) <--将控制权交给C盘下的super block(第一个扇区)
chainloader +1 <--代表第一个sector
hide (hd0,1) <--隐藏不想让Windows看到的分区(搜寻到的第一块硬盘的第二个分区,此分区为Linux分区,可选项)
makeactive <--设定partition的active标志(可省略)
安装Grub
1、使用grub-install脚本将必要的文件复制到/boot/grub/下。
grub-install [--root-directory=DIR] INSTALL_DEVICE
--root-directory=DIR 设置实际的安装目录,grub默认会将文件复制到/boot/grub/
INSTALL_DEVICE 安装的设备代码
例如:grub-install /dev/hdb #将grub所需文件复制到/boot/grub/下,/boot/grub/在硬盘/dev/hdb上。
2、在/boot/grub/中设置menu.lst,然后用grub shell来安装grub到MBR或super block。
[root@linux ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashimage=(hd1,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-53.1.14.el5xen)
root (hd1,0)
kernel /xen.gz-2.6.18-53.1.14.el5
module /vmlinuz-2.6.18-53.1.14.el5xen ro root=/dev/VolGroup00/LogVol00 rhgb quiet
module /initrd-2.6.18-53.1.14.el5xen.img
[root@linux ~]# grub
1). 先设定一下含有 /boot 目录的那个 partition。
grub> root (hd1,0)
Filesystem type is ext2fs, partition type 0x83
# grub 认出他为 ext2 的 filesystem。
2). 搜寻一下,是否存在 stage1 这个文件。
grub> find /boot/grub/stage1
(hd1,0)
# gurb安装在 /dev/hdb1 嘛!
3). 搜寻一下是否可以找到内 ? /boot/vmlinuz ?
grub> find /boot/vmlinuz
Error 15: File not found
grub> find /boot/vmlinuz-2.6.18-53.1.14.el5xen
(hd1,0)
# 需要填写完整的 kernel 档案名称!
4). 将grub安装到 MBR。
grub> setup (hd1)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 15 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/boot/grub/stage2
/boot/grub/grub.conf"... succeeded
Done.
5). 将grub安装到/dev/hdb1 呢?亦即是 super block 当中!
grub> setup (hd1,0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)
Running "embed /boot/grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)
Running "install /boot/grub/stage1 (hd1,0) /boot/grub/stage2 p
/boot/grub/grub.conf "... succeeded
Done.
# 虽然 法经 stage1_5 安装到 super block 去,不过,还是没问题的!
# 关键是 stage1 要安装成功,最后显示 succeeded 字 就可以了!
grub> quit