一天一点学习Linux之boot loader:GRUB

来源:岁月联盟 编辑:exp 时间:2011-10-12

在前一个学习内容中,我们讲到在BIOS读完信息后,接下来就是会到第一个开机设备的MBR去读取boot loader了。boot loader的作用就是载入内核。下面我们就了解一下这个boot loader。

我们先看张MBR的组成图


从上图我们可以知道:MBR其实只有512字节的大小,其中bootloader更是只占了这其中的446字节,另外的分别是64字节的分区表信息(一个分区需要16字节,这也是为什么只能分4个主分区的原因)以及2字节的magic number。而GRUB的大小绝对不止512字节,那么它怎么放下多出来的东西呢?


了解/boot/grub这个目录里面的内容
我们先来看看/boot/grub这个目录里面放了些什么东东
[root@yufei ~]# ls -l /boot/grub/
total 272
-rw-r–r–. 1 root root     63 Dec 15 22:43 device.map
-rw-r–r–. 1 root root  13216 Dec 15 22:43 e2fs_stage1_5
-rw-r–r–. 1 root root  12528 Dec 15 22:43 fat_stage1_5
-rw-r–r–. 1 root root  11760 Dec 15 22:43 ffs_stage1_5
-rw——-. 1 root root    788 Jan  2 21:08 grub.conf
-rw——-. 1 root root    788 Jan  2 20:58 grub.conf.bak
-rw-r–r–. 1 root root  11768 Dec 15 22:43 iso9660_stage1_5
-rw-r–r–. 1 root root  13232 Dec 15 22:43 jfs_stage1_5
lrwxrwxrwx. 1 root root     11 Dec 15 22:43 menu.lst -> ./grub.conf
-rw-r–r–. 1 root root  11952 Dec 15 22:43 minix_stage1_5
-rw-r–r–. 1 root root  14312 Dec 15 22:43 reiserfs_stage1_5
-rw-r–r–. 1 root root   1341 May  7  2010 splash.xpm.gz
-rw-r–r–. 1 root root    512 Dec 15 22:43 stage1
-rw-r–r–. 1 root root 113056 Dec 15 22:43 stage2
-rw-r–r–. 1 root root  12020 Dec 15 22:43 ufs2_stage1_5
-rw-r–r–. 1 root root  11376 Dec 15 22:43 vstafs_stage1_5
-rw-r–r–. 1 root root  13944 Dec 15 22:43 xfs_stage1_5
我们特别注意stage1这个文件的大小,发现他正好是512字节,我们来看看这个文件的属性
[root@yufei grub]# file stage1
stage1: x86 boot sector; GRand Unified Bootloader, stage1 version 0×3, GRUB version 0.94, code offset 0×48
这个文件很有意思,是X86的启动扇区,GRand Unified Bootloader(GRUB)
通过上面我们可以得出这样一个结论,那就是(我个人认为)这个stage1就是MBR。所以说,Stage1是执行boot loader的主程序,他是安装在我们的启动扇区。
我们再来看看这个stage2
[root@yufei grub]# hexdump -C stage2
如下图




虽然我们看不懂这些代码,但是我们在右侧会发现点什么
这个文件会加载/boot/grub/grub.conf这个文件。
我们在/boot/grub这个目录里面还能看到很多*stage1_5的文件,那这些文件是干吗的呢?
哈哈,我的理解就是个过渡的一些内容,就像stage1到stage2之间的桥梁。所以都是stage1_5(就如同1-1.5-2一样)。这些文件都是一些针对不同的文件系统格式的识别文件。

再来了解一下device.map和splash.xpm.gz这两个文件
[root@yufei grub]# file device.map
device.map: ASCII text
[root@yufei grub]# cat device.map
# this device map was generated by anaconda
(hd0)     /dev/sda
看到了吗,他就是记录grub所安装的位置了

[root@yufei grub]# gunzip splash.xpm.gz
[root@yufei grub]# file splash.xpm
splash.xpm: X pixmap image text
明白了吧,这是个图片,他就是系统在开机时grub底下的背景图了

[root@yufei grub]# ls -l menu.lst
lrwxrwxrwx. 1 root root 11 Dec 15 22:43 menu.lst -> ./grub.conf
这个文件一看就明白了,一个连接文件,这个文件里面的具体内容,我们后面再谈。
/boot/grub里面的目录内容我们就介绍完了。

下面就是GRUB与开机顺序的关系
1.BIOS将控制权交给硬盘的主引导区,即MBR。
2.MBR中的bootloader(stage1)通过内置的地址加载*stage1_5
3.bootloader通过*stage1_5的内容,将分区中的stage2加载
4.stage2此时就可以在文件系统中将grub.conf文件加载,让用户看到选项界面。

了解/boot/grub/grub.conf
[root@yufei grub]# vim grub.conf
前面的注释我们去掉,直接看内容
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-71.el6.i686)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro root=UUID=8e4f6141-20f9-4f5a-aad4-bac048374152 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us nomodeset crashkernel=auto rhgb quiet
        initrd /boot/initramfs-2.6.32-71.el6.i686.img

default=0 开机时的默认选择项目,这个必须与后面的title对照,0表示对应一个title,1表示对应第二个title,以此类推。
timeout=5 如果设置了hiddenmenu,则等待5秒,如没有按下任意键则执行默认的title项目。
splashimage=(hd0,0)/grub/splash.xpm.gz 在选项中显示的背景图片。
hiddenmenu 不显示选项。
title Red Hat Enterprise Linux (2.6.32-71.el6.i686) 在选项中显示的名称。
root (hd0,0) 设置内核所在的磁盘位置
initrd /boot/initramfs-2.6.32-71.el6.i686.img 设置initrd(虚拟化磁盘)镜像文件名
initrd 称为初始化虚拟磁盘,用于帮助加载内核模块,让Linux内核在开机过程中不需挂载根目录就能载入所需要的模块。如果你的filesystem为LVM, Raid时,或者硬盘为SCSI接口(包括SATA和USB接口)时,Linux内核将无法认识这些设备从而导致不能正常启动。而initrd可以通过 int13 芯片读取内核模块(驱动程序),当硬盘被驱动后内核就可以挂载根目录了。其他模块的读取也就没问题了。

root=UUID=8e4f6141-20f9-4f5a-aad4-bac048374152 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us nomodeset crashkernel=auto rhgb quiet
这个在RHEL6中,和以前的版本有点不同,我们以前看到的一般是
kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro root=LABEL=/1 rhgb quiet
现在改成了上面的样子,硬盘分区现在改成用UUID来代替,其实都代表一个意思。后面又加上了一些启动时候的参数,如不启用LVM、RAID、键盘、语言环境等等。rhgb指的是颜色,quiet表示的是静态化启动(有些信息就补屏蔽掉了)。如何查看硬盘分区的UUID,我们可以通过dumpe2fs /dev/sda1 |more来查看。

GRUB中的硬盘分区表示方法
GRUB 要求设备名被括在一个( )中。fd表示软盘,hd表示硬盘(不区分是IDE硬盘还是SCSI硬盘,特别注意)。其次设备是从 0 开始编号,分区也是如此,分区和设备之间用一个 ‘,’ 分开。如果没有指定某个分区,则表示使用整个设备,否则只使用指定的分区。

硬盘搜索顺序 在GRUB中的代号
第一个
(hd0)(hd0,0)(hd0,1)(hd0,4)(hd0,5)… …
第二个
(hd1)(hd1,0)(hd1,1)(hd1,4)(hd1,5)… …
第三个
(hd2)(hd2,0)(hd2,1)(hd2,4)(hd2,5)… …
第四个
(hd3)(hd3,0)(hd3,1)(hd3,4)(hd3,5)… …
… …

如果本文有什么错误的地方,请各位看官及时与我联系更正。

本文关键字:一天一点,学习Linux,RHEL6,GRUB,MBR,boot loader

摘自:羽飞博客