GRUB引导程序利用4项内容启动系统:一个内核文件、驱动器名、内核文件所在的分区号和一个可选的初始RAM磁盘。GRUB有两种启动方式:一个是直接查找并加载想要的内核,这是大多数linux发行版本的启动方式。GRUB还支持一种叫做链式加载的启动方法:GRUB用这个方法去加载另一个引导程序,例如Windows的加载器,然后这个引导程序加载想要的操作系统内核。这样就使GRUB可以用其他操作系统的引导程序引导进入这些操作系统。
当然,GRUB引导程序是可配置的。它的配置文件名为grub.conf(ubuntu系统中名为menu.lst)。在redhat中,grub.conf位于/boot/grub/路径下,也通常会符号连接为/etc/grub.conf。下面是一个RHEL5.5中的grub.conf文件。
上图显示了grub引导redhat操作系统所需的信息。这和ubuntu或者其他使用grub的linux主机里的grub.conf文件很相似。grub.conf文件列出了每个可启动的内核(内核对应操作系统)。配置选项制定哪一个是默认加载的内核,其他选项控制菜单的显示与配置。
继续深入看一下这个配置文件。注释的最后一行#boot=/dev/sda是启动设备。它是由anaconda redhat安装程序加载的,grub会忽略它,因此用#号注释掉。配置的第一行default=0指明那一个内核是默认加载的,我们可以选择任何操作系统作为启动时默认加载的操作系统。如果所定义的内核不止一个,grub会按从头到尾的顺序读取,第一个内核标号为0 ,第二个标号1,以此类推。例如,如果设置默认加载第三个内核,配置文件就得指定default=2。timeout=5设置超时值,它指定了grub程序应该等待多少秒才可以开始加载默认内核。如果在等待的过程中按了任意键,这个计数就会被打断,然后显示grub菜单。
配置第三行是闪屏图像的位置,它为grub菜单提供背景图片。它通过磁盘、分区以及在文件系统中的位置定位;这里的(hd0,0)/grub/splash.xpm.gz表示splash.xpm.gz文件位于安装在主机上的第一块硬盘驱动器hd0,0中的第一个分区的/grub目录里。
下一行hiddenmenu指令告诉grub要默认隐藏它的菜单,并启动加载默认内核的倒计时。按任意键都会停止倒计时,并显示菜单。
再往下面是第一个内核的说明。每个可启动的内核都会列在这里,第一个内核是0,第二个是1,等等。在上面的图中只有一个内核被列出。每次升级内核(一般通过安装一个新的内核软件包完成),都会另外增加一个输入项,一般同时会有一个较老的内核从列表中删除并卸载。
每个内核说明中都会有许多配置变量。第一个是title,他表示一条说明的开始。这也是那个内核在菜单屏幕上所显示的标题字符串。下一个选项root,指明到哪寻找内核的根分区;如图中hd0,0表示内核被安装在主机上的第一块硬盘驱动器上的第一个分区。grub就在这个指定的位置寻找所想要的内核。
内核选项要指定要加载的内核名、内核的位置以及如何加载内核,可能还要给要处理的内核传递选项。图中配置文件指定grub将加载一个版本为2.6.18的内核,它的根分区位于一个LVM卷组上。rhgb意为redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信息(其实,这些信息在启动后用dmesg命令也是能查看到的)。quite的作用是使启动过程中只显示重要的消息,而类似硬件自检等消息则不会显示。
最后,grub程序大多时候要知道一个叫initrd的特殊文件的位置。这个文件是一个微型的文件系统,它包括使用主机硬件所需的大部分驱动程序。不是所有内核都需要initrd文件,例如,一些特别编译的内核有时不需要initrd文件。推荐使用发行版提供的主流内核。
grub还有很多配置选项,这里不一一赘述。使用grub菜单几乎可以处理所有的配置设置。有兴趣的朋友可以查询相关资料,如http://www.gnu.org/software/grub/manual/grub.html有相关介绍。