1.5.4 Grub介绍

在之前的系统引导概述中,相信大家已经看到Grub这个词了,它的全称为Grand Unified Bootloader,也是GNU赞助的项目之一,事实上Grub可以引导多个操作系统。早先Linux的引导程序是lilo,含义为Linux Loader,这是ext2文件系统中特有的引导程序,现在基本上已经不再使用了。

在之前的系统启动流程中提到,计算机在启动时,BIOS默认会从硬盘上的第0柱面、第0磁道、第一个扇区中读取512字节的数据来引导系统启动,但是Grub这个程序远远大于512字节,这一个扇区又如何能够载下Grub所有的内容呢?为了解决这个问题,实际上Grub的启动是分成两段完成的。第一段以stage1作为主引导程序,它的主要任务是定位和装载第二段引导程序,并转交控制权,即stage2。Grub目录中的内容如下:


  1. [root@localhost grub]# cd bootgrub/
  2. [root@localhost grub]# ls -l
  3. total 257
  4. -rw-r--r-- 1 root root 63 Oct 7 21:02 device.map
  5. -rw-r--r-- 1 root root 7584 Oct 7 21:02 e2fs_stage1_5
  6. -rw-r--r-- 1 root root 7456 Oct 7 21:02 fat_stage1_5
  7. -rw-r--r-- 1 root root 6720 Oct 7 21:02 ffs_stage1_5
  8. -rw------- 1 root root 573 Oct 7 21:02 grub.conf
  9. -rw-r--r-- 1 root root 6720 Oct 7 21:02 iso9660_stage1_5
  10. -rw-r--r-- 1 root root 8192 Oct 7 21:02 jfs_stage1_5
  11. lrwxrwxrwx 1 root root 11 Oct 7 21:02 menu.lst -> ./grub.conf
  12. -rw-r--r-- 1 root root 6880 Oct 7 21:02 minix_stage1_5
  13. -rw-r--r-- 1 root root 9248 Oct 7 21:02 reiserfs_stage1_5
  14. -rw-r--r-- 1 root root 55808 Mar 13 2009 splash.xpm.gz
  15. -rw-r--r-- 1 root root 512 Oct 7 21:02 stage1
  16. -rw-r--r-- 1 root root 104988 Oct 7 21:02 stage2
  17. -rw-r--r-- 1 root root 7072 Oct 7 21:02 ufs2_stage1_5
  18. -rw-r--r-- 1 root root 6272 Oct 7 21:02 vstafs_stage1_5
  19. -rw-r--r-- 1 root root 8904 Oct 7 21:02 xfs_stage1_5

注意一下,有一个stage1的文件,大小为512字节,正好是一个扇区的大小。其实这不是一个巧合,stage1确实是MBR的一个副本。还可以看到有很多文件是以stage1_5结尾的,事实上这些文件是各种文件系统的驱动文件,当stage1从不同的文件系统中读取stage2时将用到这些驱动文件。

对Grub的配置可以通过修改Grub的配置文件完成,一般配置文件为bootgrub/grub.conf。修改后的配置将直接影响下次引导时的行为。下面是系统安装过程中自动生成的配置:


  1. # grub.conf generated by anaconda
  2. #
  3. # Note that you do not have to rerun grub after making changes to this file
  4. # NOTICE: You have a /boot partition. This means that
  5. # all kernel and initrd paths are relative to boot, eg.
  6. # root (hd0,0)
  7. # kernel vmlinuz-version ro root=dev/sda3
  8. # initrd initrd-version.img
  9. #boot=dev/sda
  10. default=0
  11. timeout=5
  12. splashimage=(hd0,0)/grub/splash.xpm.gz
  13. hiddenmenu
  14. title CentOS (2.6.18-194.el5)
  15. root (hd0,0)
  16. kernel vmlinuz-2.6.18-194.el5 ro root=LABEL= rhgb quiet
  17. initrd /initrd-2.6.18-194.el5.img

其中,default=0的含义是默认从第一个title处启动。这里的配置文件中只有一个title项,但是如果还有第二个title项,则可以配置默认从第二个title处引导系统,只要把default改为1就可以了(注意这里的计数是从0开始的)。

timeout=5的含义是显示这个title项时,同时有5秒倒计时,5秒内可以按回车键提前从默认的启动项中启动,也可以按上下键立即停止倒计时,选定一个title,然后按回车键确认从选定的title中启动。也可以选定某一个title后,按e键进入编辑模式,这样可以即时对Grub进行配置,但是这时的配置并不会写入配置文件中,而只是当时生效。

splashimage是指定启动时的背景图像。如果系统使用的是sata磁盘,则命名规则为:第一块磁盘是sda,第二块磁盘是sdb,以此类推。对磁盘进行分区后的分区命名规则是,第一个磁盘的第一个分区是sda1,第一个磁盘的第二个分区是sda2,第二个磁盘的第一个分区是sdb1,第二个磁盘的第二个分区是sdb2。而Grub使用hd0代表第一块磁盘,而这里(hd0,0)的含义是第一块磁盘的第一个分区。所以(hd0,0)/grub/splash.xpm.gz的绝对路径就是bootgrub/splash.xpm.gz,这是一个压缩文件,Grub在启动时会自动对该文件做解压缩。

hiddenmenu是设置启动时是否显示菜单。

title是系统引导时显示的名字,这只是一种识别性的文字,可以任意修改。文件的最后3行是相互关联的,第一行root(hd0,0)参数指定了内核放置的分区;第二行kernelvmlinuz-2.6.18-194.el5 ro root=LABEL=rhgb quiet指定了内核的路径,表示内核是(hd0,0)分区中的vmlinuz-2.6.18-194.el5文件,ro root=LABEL=/rhgb quiet是启动内核时向内核传入的参数;最后一行initrd/initrd-2.6.18-194.el5.img指定了initrd文件的路径是(hd0,0)中的initrd-2.6.18-194.el5.img文件。

这里第一次提到initrd文件,其英文含义是boot loader initialized RAM disk,也就是boot loader用于初始化的内存磁盘,是系统启动时的临时文件系统,kernel通过读取initrd来获得各种可执行文件和设备驱动,并挂载真实的文件系统,然后卸载这个临时文件系统。在桌面或者Linux服务器中,initrd文件只是一个临时的文件系统,其生命周期很短,只会用作挂载真实文件系统的一个接力,在很多嵌入式系统中,由于不需要外接大存储设备,所以initrd会作为永久的文件系统直接使用。