Linux之boot loader:GRUB

http://www.opsers.org/base/learning-linux-the-day-that-the-boot-loader-grub.html

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

我们先看张MBR的组成图 
Linux之boot loader:GRUB_第1张图片

从上图我们可以知道: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 
如下图 
Linux之boot loader:GRUB_第2张图片

虽然我们看不懂这些代码,但是我们在右侧会发现点什么 
这个文件会加载/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之boot loader:GRUB)