这一次探秘的是进入linux世界的大门---开机引导程序Grub(GRand Unfied
Bootloader).
GRUB是GNU下的FSF开发的一套多重开机引导程序,在其主页上已经声明旧的版本将不在开发,以后的重点放在GRUB2上,所以这一次探秘将以GRUB2为例介绍,当然在阐述一些原理时会使用GRUB0.97的一些文件作类比。
一、为何说Grub是进入linux世界的大门呢?
在中
我提到过“BIOS最后一步的工作就是协助加载位于硬盘上的OS”,这是通过将程序指针指向硬盘的MBR中的bootloader程序完成的,而现在
linux系统的bootloader就是由Grub提供的。通常MBR占用一个扇区即512字节,共分成以下三个部分:bootloader占用446
字节,partition
table即分区表64字节,Magic number
即标识MBR结束的字符占两字节其内容固定为"55aa"。简单地说,grub就是Computer启动时执行的第一个程序(BIOS除外,因其为固件程
序不是由用户安装的)。它的主要任务是加载和传递参数给OS的kernle(如linux系统),kernel负责初始化并控制此后的整个系统。
另外再提下占64字节的分区表,通常大容量硬盘是要分区使用的,这便于数据的分类存储同时也提高了其安全性。分区时由于历史原因(主要是
BIOS寻找的问题)被限定为最多只能建立4个主分区,其中每个主分区的开始地址、结束地址、分区类型(以固定数字表示用fdisk命令可以查看,如88
表示linux分区,1表示FAT12分区)都存在MBR的分区表中,每个分区占16字节。需要注意的是各主分区建立后即使硬盘还有空闲空间,这时也不能
使用,因为MBR能容纳的4个分区表已经全用了。解决的方法是拿出一个主分区的分区表用于建立扩展分区,在扩展分区的空间里可建立建立多个逻辑分区。所以
常见的硬盘分区方案是三个主分区一个扩展分区,在扩展分区里建立多个逻辑分区。
二、GRUB的主要特点如下:
1.支持多种文件系统 这可以从/boot/grub下的许多mod文件看出来
2.支持不可多重开机的OS如XP
这是通过链式(chainloader)加载完成的
3.支持自动解压缩
kernel和initrd就是以压缩文件的形式被GRUB加载到内存中的
3.配置文件及交互接口较人性化
4.支持GRUB SHELL 在系统不能引导时,grub
的shell就显得非常重要!
5.支持远程终端模式和无磁盘系统
GRUB较其它bootloader的重要优点是其灵活性。它理解文件系统和kernel的可执行文件格式,所以你可以引导你喜欢的任意OS
而不管它的kernel位于物理硬盘上的位置。在加载kernel时你只只需指明kernel的文件名以及所在设备和分区即可。用GRUB引导OS时你有
两者选择(但在系统出现问题如grub.cfg文件丢失时你实际上只有一种选择即GRUB
CLI)即command-line interface , or a menu interface。在使用command-line
interface 时你需要手动指定kernel的名称及位于硬盘上的位置,在使用menu
interface时,你只需要移动光标选择你要引导的OS即可,在menu interface时也可以切换到command-line
interface。
三、下面让我们看一下系统上安装了哪些和GRUB相关的软件包:
geekard@geekard-laptop:~$
dpkg -l \*grub* |grep ii
ii grub-common
1.98-1ubuntu7
GRand Unified Bootloader, version 2 (common
ii grub-pc
1.98-1ubuntu7
GRand Unified Bootloader, version 2 (PC/BIOS
geekard@geekard-laptop:~$
其中grub-pc软件包就是系统安装的GRUB套件,是我们探秘的重点,下面看一下它的功能和安装到系统中的文件
geekard@geekard-laptop:~$ dpkg -s grub-pc
Package: grub-pc
。。。。
Description: GRand Unified Bootloader, version 2 (PC/BIOS
version)
GRUB is a portable, powerful
bootloader. This version of GRUB
is based on a
cleaner design than its predecessors, and provides the following
new features:
.
- Scripting in grub.cfg using
BASH-like
syntax.
#注意配置文件是BASH-LIKE语法
- Support for modern partition
maps such as GPT.
- Modular generation of
grub.cfg via
update-grub. Packages providing
GRUB
add-ons
can plug in their own script rules and trigger updates by
invoking
update-grub2.