10. 配置引导程序

内容:

10.a. 做出您的选择

介绍

现在,您已经配置并编译好了内核,必需的一些系统配置文件也已经就位,是时候安装一个叫做引导程序的程序来“引燃”您的内核并启动系统了。

对于x86,Gentoo Linux提供了GRUBLILO

但在安装bootloader之前,我们要告诉您如何配置framebuffer(前提当然是您想使用它)。在framebuffer的帮助下,您系统的Linux命令行将拥有(有限的)图形特性(例如使用Gentoo提供的漂亮的bootsplash图片)。

可选:Framebuffer

如果您已经为您的内核加上了framebuffer支持(或者您使用genkernel的默认内核配置),您就可以在bootloader配置文件中加入一个video内核参数来激活它。

首先,您需要知道您使用的framebuffer设备。您应该使用uvesafb作为VESA驱动.

video语句用来控制framebuffer的显示参数。此语句中需指定欲使用的framebuffer驱动以及你想启用的控制语句。/usr/src/linux/Documentation/fb/uvesafb.txt文件里列出了所有变量。最常用的选项是:

控制选项 描述
ywrap 假设显卡支持显存回卷操作(也就是说显存里的数据填充到尽头的时候会接着从起始处继续)
mtrr:n 设置MTRR寄存器. n 可以是:
0 - 禁用
1 - 不使用cache
2 - write-back
3 - write-combining
4 - write-through
模式 设定分辨率,颜色深度和刷新率。 例如,1024x768-32@85对应的分辨率是1024x768,32位色深和85Hz的刷新率。

最后这个参数的内容可能类似这样video=uvesafb:mtrr:3,ywrap,1024x768-32@85。将它记下来;很快您将用到它。

接下来要继续安装GRUBLILO

10.b. 默认:使用GRUB

了解GRUB的术语

理解GRUB最重要的在于熟悉它如何表述硬盘驱动器和分区。在GRUB中,您的Linux分区/dev/sda1将很可能都被称为(hd0,0)。请注意hd0,0两边的括号——它们是必须加上的。

硬盘是从0而不是从“a”开始,分区从0而不是1开始。要明确的是,hd设备只指硬盘,而不包括atapi-ide设备,例如cdrom播放器和刻录机。同样的标识构造方式也适用于SCSI驱动器。(正常情况下,除非BIOS被配置为从SCSI驱动器引导,否则SCSI硬盘的标识数字会比IDE的高。)当您要求BIOS从一个不同的硬盘引导时(例如您的主IDE接口上的从盘),那个硬盘就会被视为hd0

假设您有一个硬盘是/dev/sda,还有两个分别是/dev/sdb/dev/sdc,那么/dev/hdd7将会被GRUB标识为(hd1,6)。听起来这有些不合常理,确实如此。但正如我们即将见到的,GRUB为您提供了一个tab补全机制,这将大大方便您的操作。即使您拥有许多的硬盘和分区,而且对GRUB的数字标识方案不甚了解,也不用怕。

我们已经有了一些感觉了,是时候安装GRUB了。

安装GRUB

要安装GRUB,首先让我们emerge它:

代码 2.1: 安装GRUB

# emerge grub

尽管现在已经安装完GRUB,我们仍需要为其写一个配置文件,并将其安置到硬盘的主引导记录中,使它能自动引导您新创建的内核。您可以使用nano(或其他可用的编辑器)来创建配置文件/boot/grub/grub.conf

代码 2.2: 创建/boot/grub/grub.conf

# nano -w /boot/grub/grub.conf

现在我们将详细地写一个grub.conf。您在下面的内容中可以找到两个可能的针对本指南中前面章节给出的分区方式例子的grub.conf。我们只详细地评述第一个grub.conf。确保您使用您自己的内核镜像文件名,以及如果有的话,您自己的的initrd镜像文件名。

注意: Grub根据BIOS来决定设备名。如果你改变了你的BIOS设定,你的设备字母和序号也会改变。比如如果你改变了你的设备的启动顺序,你就需要改变你的grub配置。

注意: 如果您使用JFS来作为root文件系统,您就必须kernel那行添加上“ro”参数,因为JFS文件系统在其允许被加载为可读写状态前需要使用这个参数来重放它的日志。

代码 2.3: 不使用genkernel的用户的grub.conf

# 默认选择哪个列表来引导。0表示第一个, 1表示第二个,以此类推。
default 0
# 引导默认列表前等待多少秒
timeout 30
# 使用漂亮、“臃肿”的spalsh图像来增加一点趣味:)
# 如果您没有安装显卡,请将这行注释掉
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Gentoo Linux 2.6.30-r5
# 内核镜像(或者操作系统)所在分区
root (hd0,0)
kernel /boot/kernel-2.6.30-gentoo-r5 root=/dev/sda3

title Gentoo Linux 2.6.30-r5 (rescue)
# 内核镜像(或者操作系统)所在分区
root (hd0,0)
kernel /boot/kernel-2.6.30-gentoo-r5 root=/dev/sda3 init=/bin/bb

# 接下来的四行只有在您与Windows系统进行双启动的情况下才需要。
# 本例中,windows系统位于/dev/sda6。
title Windows XP
rootnoverify (hd0,5)
makeactive
chainloader +1

代码 2.4: 使用genkernel的用户的grub.conf

default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Gentoo Linux 2.6.30-r5
root (hd0,0)
kernel /boot/kernel-genkernel-x86-2.6.30-gentoo-r5 root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/sda3 
initrd /boot/initramfs-genkernel-x86-2.6.30-gentoo-r5

# 只有在双启动的情况下才需要以下内容
title Windows XP
rootnoverify (hd0,5)
makeactive
chainloader +1

如果您使用与此不同的分区方案和/或内核镜像,请相应地进行调整。无论怎样,请确保紧跟在GRUB设备(例如(hd0,0))后面的是相对于挂载点的路径,而不是根目录。换句话说,(hd0,0)/grub/splash.xpm.gz的实际目标是/boot/grub/splash.xpm.gz,因为(hd0,0)就是/boot分区。

另外,如果您选择使用不同的分区方案并且没有将/boot置于一个独立的分区,上述示例代码中/boot前缀实际上是必需的。如果您使用我们所建议的分区方案,则不一定非要使用/boot前缀,但即便加了它,由于/boot分区里有一个boot符号链接指向当前目录,也可以正常工作。简单的说,无论您是否定义了一个独立的/boot分区,上述例子应该都能正常工作。

如果您需要传递任何其他的参数给内核,简单地在内核命令后面加上它们就可以了。我们已经传递了一个参数(root=/dev/sda3real_root=/dev/sda3),但您也可以加上其他的,例如我们前面讨论过的为framebuffer加上video参数。

如果你的引导程序配置文件包含real_root参数,请使用real_rootflags参数来设置根文件系统的挂载选项。

如果您使用的是2.6.7或更高版本的内核,并且您使用硬盘跳线来使主板的BIOS能正确处理大硬盘,那么在启动内核时您还需要附加sda=stroke的参数。请把sda替换成需要这个参数的设备。

genkernel用户需知道他们的内核使用与安装光盘相同的启动参数。例如,若您有SCSI设备时,您就需要添加doscsi这个内核启动参数。

现在请保存grub.conf文件并退出。您仍需要将GRUB安装到MBR(主引导记录),以便重启时GRUB能自动执行。

GRUB的开发者推荐使用grub-install。尽管如此,如果在某些情况下grub-install无法正常工作,您依然可以选择进行手动安装GRUB。

默认:使用grub-install安装GRUB或者备选:使用手动指令安装GRUB继续。

默认:使用grub-install安装GRUB

为了安装GRUB,您将需要执行grub-install命令。尽管如此,当我们处于chroot的环境时,grub-install并不能正常的工作。我们还需要创建一个/etc/mtab,在里面列出所有已加载的文件系统。幸运的是,有一个简单的方法来完成这个任务——将/proc/mounts拷贝成/etc/mtab,如果您没有创建一个独立的boot分区,请排除rootfs行。下面的命令在两种情况下都可以正常工作:

代码 2.5: 创建/etc/mtab

# grep -v rootfs /proc/mounts > /etc/mtab

现在我们就可以用grub-install来安装GRUB了:

代码 2.6: 执行grub-install

# grub-install --no-floppy /dev/sda

如果您还有更多与GRUB相关的问题,请查阅GRUB FAQ或者GRUB手册

重启系统章节继续。

备选:使用手动指令安装GRUB

您可以通过输入grub来开始配置GRUB。呈现在您面前的将是grub命令提示符grub>。现在,您需要输入正确的命令来将GRUB引导记录安装到您的硬盘中。

代码 2.7: 启动GRUB shell

# grub --no-floppy

注意: 如果您的系统中没有任何的软盘驱动器,在上面的命令后面加上--no-floppy选项,防止grub检测(实际上不存在的)软驱。

在此示例配置中,我们想让我们安装的GRUB可以从boot分区/dev/sda1读取信息,同时我们将GRUB引导记录安装到硬盘的MBR(主引导记录)中,这样当打开电脑时您首先可以看到的就是GRUB引导的界面。当然,如果您安装时没有按照示例配置来做,请相应的更改一些命令。

GRUB的tab自动补全机制可以在GRUB中使用。例如,如果您输入“root (”之后按下TAB键,一个设备列表就会呈现在您面前(例如hd0)。如果您输入“root (hd0,”之后按下TAB键,系统又将返回一个已有的分区列表,以便您选择(例如hd0,0)。

利用tab补全,设置GRUB将不会那么困难。现在我们继续设置GRUB,如何? :-)

代码 2.8: 将GRUB安装到硬盘主引导记录中

grub> root (hd0,0)    (指定您的/boot目录所在分区)
grub> setup (hd0)     (将GRUB安装到硬盘主引导记录)
grub> quit            (退出GRUB shell)

注意: 如果您想将GRUB安装到某一个分区而不是硬盘主引导记录中,您需要调整setup命令,使其指向正确的分区。例如,如果您要将GRUB安装到/dev/sda3,对应的命令应该是setup (hd0,2)。但是只有少数用户需要这么做。

如果您还有更多与GRUB相关的问题,请查阅GRUB FAQ或者GRUB手册

重启系统章节继续。

10.c. 备选:使用LILO

安装LILO

LILO,是LInuxLoader的简称,它是一个可靠且确实能担当重任的Linux的bootloader。尽管如此,它缺少一些GRUB具有的特性(这正是目前GRUB之所以流行的原因)。LILO仍被人们使用的原因在于:在一些系统中,GRUB不能工作而LILO可以。当然,也有一些用户是因为熟悉它而仍坚持使用它。无论是什么原因,Gentoo对两个bootloader都提供了支持,看到这里显然您已经选择了使用LILO。

安装LILO是件轻而易举的事;只需emerge就好了。

代码 3.1: 安装LILO

# emerge lilo

配置LILO

要配置LILO,您必须创建/etc/lilo.conf文件。打开一个您喜欢的编辑器(为保持一致性,在本手册中我们使用nano)然后创建它。

代码 3.2: 创建/etc/lilo.conf

# nano -w /etc/lilo.conf

前面章节中我们已经提醒您记下您所创建的内核镜像文件名。在接下来的示例lilo.conf中,我们使用的是示例的分区方案。这里有两个独立的部分:

请确保您使用的是您自己的内核镜像的文件名,以及(如果用到的话)您自己的initrd镜像的文件名。

注意: 如果您使用JFS来作为root文件系统,您就必须在每个引导项目的后面添加上形如append="ro"的一行内容,因为JFS文件系统在其允许被加载为可读写状态前需要使用这个参数来重放它的日志。

代码 3.3: 示例/etc/lilo.conf

boot=/dev/sda             # 将LILO安装到硬盘主引导扇区
prompt                    # 给用户选择其他引导项目的机会
timeout=50                # 引导默认引导项目前等待5秒钟
default=gentoo            # 当等待结束后引导“gentoo”项目

# 给不使用genkernel的用户的
image=/boot/kernel-2.6.30-gentoo-r5
  label=gentoo            # 我们为此引导项目起的名字
  read-only               # 以只读root状态开始。此处不要改变!
  root=/dev/sda3          # 定位root文件系统

image=/boot/kernel-2.6.30-gentoo-r5
  label=gentoo.rescue     # 我们为此引导项目起的名字
  read-only               # 以只读root状态开始。此处不要改变!
  root=/dev/sda3          # 定位root文件系统
  append="init=/bin/bb"   # 启动Gentoo的静态急救shell

# 给使用genkernel的用户的
image=/boot/kernel-genkernel-x86-2.6.30-gentoo-r5
  label=gentoo
  read-only
  root=/dev/ram0
  append="init=/linuxrc ramdisk=8192 real_root=/dev/sda3"
  initrd=/boot/initramfs-genkernel-x86-2.6.30-gentoo-r5

# 下边的两行只有在您与Windows系统进行双启动的情况下才需要
# 在本例中,Windows位于/dev/sda6
other=/dev/sda6
  label=windows

注意: 如果您使用了与此不同的分区方案和/或者内核镜像,请进行相应的调整。

如果您需要为内核传递任何额外的参数,可以在相应的启动项目里添加一个append语句。例如,我们加上video参数来启用framebuffer:

代码 3.4: 使用append来添加内核参数

image=/boot/kernel-2.6.30-gentoo-r5
  label=gentoo
  read-only
  root=/dev/sda3
  append="video=uvesafb:mtrr,ywrap,1024x768-32@85"

如果您使用的是2.6.7或更高版本的内核,并且您使用硬盘跳线来使主板的BIOS能正确处理大硬盘,那么在启动内核时您还需要附加sda=stroke的参数。请把sda替换成需要这个参数的设备。

genkernel用户需知道他们的内核使用与安装光盘相同的启动参数。例如,若您有SCSI设备时,您需添加doscsi这个内核启动参数。

现在让我们保存文件并退出。要最终完成,您还得运行/sbin/lilo,这样LILO才能将/etc/lilo.conf应用到您的系统(也就是将其自身安装到硬盘中)。请记住每当你安装了一个新内核或改变了菜单的任何内容时,您也需要再运行一次/sbin/lilo

代码 3.5: 完成LILO的安装

# /sbin/lilo

如果您还有更多与LILO有关的问题,请参阅它的wikipedia页面

现在请继续阅读重启系统

10.d. 重启系统

退出chroot的环境,卸载所有已挂载的分区。然后输入您已经等待多时的那个魔术般的命令:reboot

代码 4.1: 卸载所有分区和重启

# exit
cdimage ~# cd
cdimage ~# umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo
cdimage ~# reboot

当然您别忘了取出可引导光盘,否则重启后引导的将是这张光盘而不是您的新Gentoo系统。

当重启进入到您新装的Gentoo系统之后,请阅读结束Gentoo的安装来完成剩下的工作。