Zhi Wei 的个人博客
GRUB2启动引导程序
GRUB2启动引导程序

GRUB2启动引导程序

GRUB2启动引导程序

在日常工作中,经常使用由GRUB2引导的各种Linux操作系统,在一次安装学习Android X86时,我对GRUB2的产生了兴趣,虽然早在XP时代就已经轻度体验过早期的GRUB引导程序,但一直以来都一知半解,遂花了点功夫深入了解一下GRUB2的工作原理与逻辑。

要想了解GRUB2,我们首先需要知道几个基本概念,什么是MBR?什么是GPT?传统BIOS固件与UEFI固件有什么区别?以及计算机启动流程等。但如果全都说明一下,恐怕就要写好长好长了。所以我就简单记录一下在传统BIOS固件的平台下GRUB2的相关知识吧。

MBR/GPT与GRUB的关系

  1. 什么是MBR

通俗理解:MBR是一种磁盘分区表,有两个功能,第一个是引导操作系统与记录磁盘分区信息,如果MBR扇区异常则无法正常启动计算机和访问该磁盘上的信息。MBR格式不支持超过2TB的磁盘。

维基百科释义:MBR即主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

    在讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。

    DPT磁盘分区表由4组记录构成,每组16个字节。共64字节。所以采用MBR主引导记录的磁盘最多只能有4个主分区,或者3个主分区1个拓展分区。同时MBR也不支持2TB以上磁盘。

MBR图例

MBR实例

什么是GPT

通俗理解:GPT分区表是对MBR的加强和拓展,支持超过2TB的磁盘,最多可以有128个主分区。

维基百科:全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准。在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。传统MBR信息存储于扇区0,GPT头存储于扇区1,接下来才是分区表本身。64位Windows操作系统使用16,384字节(或32扇区)作为GPT分区表,接下来的扇区34是硬盘上第一个分区的开始。为了减少分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。

GPT分区表图例

GPT分区表实例

什么是GRUB

通俗理解:GRUB引导程序是在BIOS/UEFI启动完成后,操作系统启动前运行的一个微型系统,它能够让用户自由选择需要启动的操作系统。

维基百科:GNU GRUB(简称“GRUB”)是一个来自GNU项目的启动引导程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

GRUB具有多种用户界面。多数Linux发行版利用GRUB对图形界面的支持,提供了定制的带有背景图案的启动菜单,有时也支持鼠标。GRUB可通过GFX支持更美观的引导画面和引导菜单。通过对GRUB的文字界面的设定,可以通过串口实现远程终端启动。

GRUB可以从网络上下载操作系统镜像,因此可以支持无盘系统。GRUB支持在启动操作系统前解压它的镜像。

与其它启动器不同,GRUB可以通过GRUB提示符直接与用户进行交互。加载操作系统前,在GRUB文本模式屏幕下键入c键可以进入GRUB命令行。在没有作业系统或者有作业系统而没有”menu.lst”(或grub.cfg)配置文件的系统上,同样可以进入GRUB提示符。通过类似bash的命令,GRUB提示符允许用户手工启动任何操作系统。把合适的命令记录在”menu.lst”(或grub.cfg)文件里,可以自动启动一个操作系统。

GRUB拥有丰富的终端命令,在命令行下使用这些命令,用户可以查看硬盘分区的细节,修改分区设置,临时重新映射磁盘顺序,从任何用户定义的配置文件启动,以及查看GRUB所支持的文件系统上的其它启动器的配置。因此,即便不知道一台电脑上安装了什么,也可以从外部设备启动一个操作系统。

通过链式启动,一个启动器可以启动另一个启动器。GRUB通过2到3行的命令就可以从DOS、Windows、Linux、BSD和Solaris系统启动。

 GRUB引导程序工作流程

在传统BIOS固件中,完成POST等任务后,会读取MBR中的引导代码(boot.img),将控制权交给下一阶段的引导程序(core.img)或者/boot/grub中的引导程序。然后由用户决定启动哪个操作系统。

在MBR分区表中的启动流程

而在GPT格式的磁盘中,也基本类似。只不过core.img中的数据放在了GPT头后面的扇区中。

在GPT分区表中的启动流程

GRUB与MBR/GPT的关系

我个人认为,可以把GRUB理解为一种超小型的命令行系统,而MBR/GPT只是硬盘分区格式。通俗一点来说,可以把MBR/GPT理解为硬盘的基础数据库。GRUB和MBR/GPT干的活是不一样的,前者可以让计算机跟随使用者的意愿启动磁盘上存在的操作系统;而后者更像是一种协议规范。GRUB根据MBR/GPT所规定标准在相关的区域写入自己的程序,让计算机读取并执行从而实现上述功能。

传统BIOS与UEFI

传统BIOS发展至今已经被UEFI固件取代,因为如果需要在启动引导阶段实现更多的功能,BIOS/MBR的模式已经无法满足要求。但并不是意味着BIOS不能引导GPT分区格式硬盘上的操作系统。当然也存在MBR与GPT混合的硬盘分区表,这种格式的硬盘同时支持传统BIOS与UEFI。关于UEFI固件在这里我先不展开细说。如果以后有时间再补上。

GRUB的安装使用

如果你想安装GRUB,那肯定是因为你的计算机上存在多个操作系统。如果仅仅是Windows的话,Windows Boot Manager也是可以启动多个不同版本的Windows的。基本上目前几乎所有X86平台的Linux发行版的默认引导程序已经更新到了GRUB2,所以不需要另外安装。

 Windows7安装

下载安装GRUB,链接:https://ftp.gnu.org/gnu/grub/,运行grub-install.exe。

手动添加GRUB启动菜单”C:\boot\grub\grub.cfg”文件,并添加命令:

menuentry “windwos7” {
set root=(hd0,msdos1)
chainloader +1
}

重启检查安装状况

安装第二个操作系统CentOS

Centos6.4采用的是GRUB0.97(以下简称GRUB1),正好可以学习一下GRUB1的一些知识,由于MBR分区表只支持3个主分区,所以我们把CentOS安装到拓展分区,顺便测试一下是否能正常启动。

将CentOS的引导程序安装至boot分区的第一个扇区,也就是将GRUB1安装到这个分区的VBR(Volume boot record分区引导记录)。如果不进行这一步操作,GRUB1将覆盖GRUB2的数据,安装完成后将使用GRUB1来引导CentOS与Windows。

在GRUB2中添加CentOS的启动菜单,回到windows下,或者在CentOS下编辑分区2(Windows根目录)/boot/grub.cfg文件,追加已下内容:

menuentry "centos" {
set root=(hd0,msdos3)
chainloader +1
}

GRUB的配置文件

经过以上步骤,我们现在已经能启动磁盘上的Windows和CentOS了,随后我将boot分区格式化,通过LiveCD重建GRUB1引导,这里简单记录一下GRUB1与GRUB2的区别:

类型GURB1GUBB2
配置文件menu.lst ->./grub.confgrub.cfg
设置根目录root (hdX,X)set root=(hdX,[msdos]X)   
启动LinuxKernel /..Linux /..

在重建CentOS引导的时,如果在GRUB2菜单中使用chainloader +1命令,只能进入GRUB1SHELL,无法加载menu.lst,经过查询官方帮助文档,发现可使用legacy_configfile命令,加载GRUB1的配置文件;另外在启动Windows时,官网文档的范例是使用ntldr /bootmgr命令进行引导,所以最终的grub.cfg配置如下:

menuentry "windwos7" {
set root=(hd0,msdos1)
ntldr /bootmgr
}
menuentry "centos" {
set root=(hd0,msdos3)
legacy_configfile /grub/menu.lst
}

总结与发现

a)   GRUB2 SHELL

在研究了GRUB2引导程序以后,我发现其不仅仅可以作为引导程序使用,它内置了很多功能,比如挂载本地ISO启动、网络启动、图形化界面,甚至通过脚本来控制启动过程,实现一些高级功能。以后有空研究的话我再更新一下BLOG。

b)   GRUB2与Linux内核

我在尝试使用GRUB2加载CentOS6.4的Linux内核时,发现可能存在兼容问题,无法正常启动,而使用GRUB2引导至GRUB1后则可正常启动。也许是缺少某些命令?所以,尽量选择与发行相同的GRUB2程序来启动Linux。

c)    MBR与GPT

在如今,UEFI固件逐渐以及取代了传统BIOS,所以使用GPT分区表能避免许多麻烦事,也方便我们安装第二或第三个操作系统。

参考文档:

1. https://www.gnu.org/software/grub/manual/grub/grub.html#Simple-configuration 官方帮助文档GRUB2.02

2. https://www.gnu.org/software/grub/manual/legacy/grub.html#Configuration 官方帮助文档GRUB 0.97

3. https://blog.csdn.net/gkxg001/article/details/82870109 MBR分区表详解

4. https://zh.wikipedia.org/zh-hans/%E4%B8%BB%E5%BC%95%E5%AF%BC%E8%AE%B0%E5%BD%95 主引导记录

5. https://blog.woodelf.org/2014/05/28/uefi-boot-how-it-works  UEFI 原生启动:实际工作原理——背景

6. https://blog.csdn.net/liu5320102/article/details/54846418 GRUB启动分析之stage1

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注