用 GRUB 来引导你的系统

这是 tram 刚刚做的,很多人喜欢 GRUB 而不是 Lilo,那么就看看这一章吧!

用 GRUB 代替 Lilo

在 LFS BOOK 里,是用 Lilo 做启动引导器的,我是按照书上装好了 Lilo,后来又按照一篇提示(http://hints.us.linuxfromscratch.org/hints/lilo.txt)给它用上了 LFS 的背景,还挺好看的,不过很多人都比较喜欢 GRUB,那么我也试一试在 LFS 中安装 GRUB。下面的内容都是在 LFS 下进行的,而不是在 chroot 环境里,我不知道在 chroot 环境里会产生什么影响,最好不要这样做。在安装前先提醒一下,最好准备好启动盘,没有软盘有 CDROM 也行,如果安装失败了,还能修复。

首先要下载软件,我下了三个,一个是 GRUB 0.92(ftp://alpha.gnu.org/pub/gnu/grub/grub-0.92.tar.gz),一个是用图片背景的补丁(http://archive.linuxfromscratch.org/mail-archives/lfs-support/2002/09/att-0084/01-grub-0.92-vga-nodeprecated.patch.bz2),最后是 LFS 的启动图片(http://linuxfromscratch.org/~gerard/lfs-grub-splash.xpm)。这个补丁可找了我很长的时间,因为 LFS 的 GRUB-HOWTO 提示还没有更新,只好到邮件列表里找。

然后就把它们放在 /usr/src/grub 下。当然这时候已经是 root 了,下面也都是用 root 用户来做的。解压缩软件包:

tar zxvf grub-0.92.tar.gz &&
bunzip2 01-grub-0.92-vga-nodeprecated.patch.bz2

然后是安装了:

cd grub-0.92 &&
patch -Np1 -i ../01-grub-0.92-vga-nodeprecated.patch &&
./configure --prefix=/usr &&
make &&
make install &&
mkdir /boot/grub &&
cp /usr/share/grub/i386-pc/stage1 /boot/grub &&
cp /usr/share/grub/i386-pc/stage2 /boot/grub &&
cp ../lfs-grub-splash.xpm /boot/grub

好了,下面就要开始设置 GRUB。首先跟大家说说我的分区情况。我有两个硬盘,hda6 安装的是 redhat 8,hdc4 安装的是 LFS,hdc5安装的是 Mandrake 8.1。在你开始之前,应该确认一下你的分区情况。下面是我的 hdc :

/sbin/fdisk -l /dev/hdc

Disk /dev/hdc: 255 heads, 63 sectors, 1582 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdc1   *         1        44    353398+  82  Linux swap
/dev/hdc2           428       555   1028160    5  Extended
/dev/hdc3           556      1582   8249377+   c  Win95 FAT32 (LBA)
/dev/hdc4            45       427   3076447+  83  Linux
/dev/hdc5           428       555   1028128+  83  Linux

现在你要编辑一个 /boot/grub/menu.lst (不是1,2,3的1,而是英语的"l")文件,把你想加载的分区写上,写的方法可以参考一下你原有的发行版,我的这个文件是这样的:

default=0
splashimage=(hd1,3)/boot/grub/lfs-grub-splash.xpm
timeout=10
title TLFS
kernel (hd1,3)/boot/lfskernel root=/dev/hdc4
title Mandrake
        root (hd1,4)
        kernel /boot/vmlinuz ro root=/dev/hdc5
        initrd /boot/initrd.img
title Red Hat Linux (2.4.18-14)
        root (hd0,5)
        kernel /boot/vmlinuz-2.4.18-14 ro root=/dev/hda6
        initrd /boot/initrd-2.4.18-14.img
title Win2000
        rootnoverify (hd0,0)
        chainloader +1

上面的 (hd1,3) 这些如果搞不清楚,就看看你原来版本里是怎么写的,原来版本里没有也没关系,过一会等我们设置完 GRUB 后,可以再回过头来改。

运行 GRUB (root身份哦):

/usr/sbin/grub

等几分钟后,就进入 GRUB 的控制台了。在这里输入:

find /boot/grub/stage1

这个命令是看看你在哪些分区上有 /boot/grub/stage1 这个文件。有这个文件才能设置成根分区。下面是我的结果:

 (hd0,5)
 (hd1,3)
 (hd1,4)

要注意的是,这里的 hd1 是我的 /dev/hdc。(hd1,3) 是我的 /dev/hdc4。 GRUB 所使用的硬盘/分区命名约定与Linux 使用的命名约定不同。在 Linux 中,第一个硬盘的第五个分区称作 "hda5"。而 GRUB 把这个分区称作 "(hd0,4)"。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。

下面把 LFS 的分区作为根分区,这个命令也是在 GRUB 的控制台下输入的:

root (hd1,3)

最后,把设置写到我第一块硬盘的 MBR(还是在 GRUB 的控制台下输入):

setup (hd0)

上面这一步要尤其注意,我第一次是用setup (hd1)的,结果不能启动了:( ,在这个命令后,你能看到一些信息。如果一切正常,就退出控制台:

quit

好了,看一下你的 /boot/grub/menu.lst 文件里设置的参数对不对,然后就重启动,你可以看到 LFS 的图片了。这时应该能正常地进入你的所有操作系统。上面我所做的只是 GRUB 的基本用法,还有一些高级的用法,如果你感兴趣的话,可以看看它的 info 页,有些比较有用的比如:map(能启动第二个硬盘上的 windows),stage1.5(能在启动的时候直接给出内核和根分区)。好了,我就不多说了,自己探索一下,体验 LFS 的乐趣!