Linux下的GRUB引导

安装过Linux操作系统的朋友应该都知道:Linux的引导程序(Loader)有2个:Grub【Grand Unified Bootloader】和lilo,其中lilo【Linux Loader】是比较早期的引导程序,GRUB是后来才引入的,由于以下2个原因:

1)现在的Linux操作系统默认安装的引导程序都是Grub;

2)我自己接触Linux的时候,Lilo已经不流行了。

基于以上2点,我只对Grub比较了解,对Lilo知之甚少,所以只能谈谈Grub这只引导程序,权当抛砖引玉。

从MBR谈起。现在的操作系统程序包括引导程序、操作系统的内核和相关服务等,基本上都是保存在硬盘上。硬盘由一个一个的扇区组成,每个扇区大小固定为512bytes(SSD存储和部分HD硬盘逐步改成了4K),这是系统能物理寻址的最小单位。部分大型的存储阵列由专门的存储控制器控制,存储控制器在对硬盘进行控制时,为了提高每个可管理卷的容量或者提升应用性能,可能会在条带化的时候提供块大小的设置参数,比如说4096bytes,在这样的存储器上安装文件系统时,文件系统的最小寻址单位为将不在是512bytes,而是4096bytes,当然,这需要文件系统支持。为什么可以实现最小单位为4096的寻址呢?这是因为现在的有些硬盘可以支持每个扇区为4096Bytes(最新的磁盘标准LBD,2009年之后才出),当然,有些控制器也可以进行一次地址虚拟转换,即对外是一个地址,但对内可以再影射影射到一个地址块上,比如将对外的4K空间映射为内部的8个连续的0.5K空间上,这样扇区大小为0.5K的硬盘也能实现这样的功能。说远了,硬盘的扇区都是按照1、2、3、4……编了号的,其中编号为1的第一块扇区,被称为MBR区,在我们磁盘分区的时候,你比如说微软的windows系统按照C、D、E等盘符分区,linux按照/dev/sda1,/dev/sda2方式分区,solaris操作系统按照dev/dsk/c0t0d0p0,dev/dsk/c0t0d0p1方式分区,不论是什么操作系统,这个第一块扇区MBR不会属于任何一个分区的,它是独立于分区之外的,除非用特殊的方法,否则我们是不可能访问得到这个MBR区的。

MBR区只是硬盘上的第一块扇区,所以它的大小仍然为512bytes。这512个字节又细分为3个不同的部分:其中第一部分为前446字节,这446bytes保存引导程序的部分代码,这里谈的grub,那就是Grub的部分代码;接下来的64bytes用于保存系统分区表,这里的“系统”是指文件系统,但不是SAN共享文件系统,SAN共享文件系统的分区表有特殊的保存方法,每个分区信息占分区表的16bytes,因此一共可以保存4个分区信息,如果分区个数大于4,那么至少有一个分区要设置为扩展分区,再在扩展分区上建立逻辑分区来实现。最后2bytes是MBR的结束标志位。

当我们的个人电脑开机启动时,系统的控制权首先由BIOS获取,BIOS获取控制权后,检查各个硬件的状态,如CPU、内存等,如果设备都正常,则将硬件复位,试硬件处于“待命”状态,如果有设备不能正常运行,则系统将无法继续下去,这个过程一般称为POST过程。待POST正常结束后,引导程序将登场。我们的个人电脑主板BIOS上都有启动设置的选项,如从网络启动、光盘启动还是硬盘启动等,实际上这就是告诉系统,我们的引导程序是保存在哪里的。如果设置为硬盘启动,那么POST完成,硬盘的MBR中的信息会被读入内存,grub程序开始执行。grub程序会告诉电脑,操作系统的内核是安装在哪个分区内的,这是电脑再查询MBR(已经读入内存)中的系统分区表,再将该分区中的内核映像文件读入内存、解压,之后执行内核程序,系统的控制权交由内核管理,Grub的使命也就完成了。

有人可能会问:Grub引导程序是怎么知道我们操作系统的内核映像文件保存在哪个分区的呢?这是接下来将要说的事情了。Grub也不是天马行空乱执行的,它执行时会读入Grub的配置文件/boot/grub/grub.conf中的内容,根据配置文件的内容来按部就班地执行。/boot/grub/grub.conf这个配置文件是由我们手动设置(或者安装操作系统的时候,系统自行设置)的,下面我们看看这个文件的具体内容:

default=0 #这一行告诉系统默认引导第一个内核,grub可以引导多个操作系统,当安装了多个操作系统时,我们可以选择引导哪个操作系统,如果超时时,就默认引导配置的第一个操作系统;

timeout=5 #选择内核的默认等待时间,单位秒,Grub引导程序启动时,会进行倒计时,如果倒计时时间内没有按下键盘enter键,就自动引导default=0这个内核,如果按下enter,则会出现一个内核的选择画面,供用户选择;

splashp_w_picpath=(hd0,5)/grub/splash.xpm.gz #grub引导过程中,读取的背景画面的保存位置,(hd0,5)告诉grub背景画面文件保存在(hd0,5)这个分区上,这里有个重点,就是硬盘分区的表示法,(hd0,5)的第一个数字0表示第一块硬盘,即hda,第二个数字5表示硬盘上的第6个分区,即硬盘的序号和分区的序号都是从0开始计数的,因此,(hd0,5)分区实际对应/dev/hda6这个分区;

hiddenmenu #告诉Grub运行时,隐藏开机的选单,无论是单系统还是多系统引导,如果没有这行,则表示各个待引导系统的标题会自动列出来,否则需要我们按键盘enter键后才会显示出来;

passwd --md5 !@#[email=$HDDDO@&(*$]!@#$HDDDO@&(*$[/email]…… (乱码显示) # 启动时如果要传参数给内核,那么需要输入密码,而这个密码是MD5加密过的,如果不MD5加密,这一行可写为passwd 123456 表示传参密码为123456;

title Red Hat ES4(2.6.9-33) #待引导的操作系统名字,可自行取名;

root(hd0,5) #告诉grub我们的操作系统启动分区/boot是在(hd0,5)这个分区上, 即hda6这个分区;

Kernel /vmlinuz-2.6.9-5.EL ro root=/dev/hda5 rhgb quiet #告诉Grub内核文件名是vmlinuz-2.6.9-5.EL,根据上一行,系统自行得出内核的绝对路径是/boot/vmlinuz-2.6.9-5.EL, root=/dev/hda5 告诉grub根文件系统/安装在/dev/hda5这个分区上,ro表示挂载这个根分区时,以只读方式挂载,根文件系统还有另外一种表示方法:root=LABEL=/,如果我们的根分区是挂载在LVM的一个逻辑卷上,也支持LVM的路径表示方式,rhgb(red hat graphical boot),即启动时会以图形的方式显示进度,否则会以字符的方式显示各个开机启动服务的详细情况, quiet是设定在启动的过程当中,不要显示错误的信息;

initrd /initrd-2.6.9-5.EL.img #initrd-2.6.9-5.EL.img这个映像文件存放的是一些驱动文件,这一行和root(hd0,5)一起,告诉Grub驱动文件的保存位置及文件名,在Grub运行时,需要将这个文件读入内存。

好啦,根据上面配置文件的介绍,我们就清楚地知道,grub是怎么知道待加载的内核是保存在哪里的,已经相关的一些配置了。

前面提到过,MBR不属于任何一个分区,而grub的配置文件grub.conf是保存在/boot/grub/这个路径下,属于某个硬盘分区中,因此,在文中提到的“grub这个引导程序只是一部分安装在MBR中”,也就能够理解了。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: