已复制
全屏展示
复制代码

简说BIOS UEFI MBR GPT等概念


· 15 min read

在安装或重装操作系统(Windows、Linux)的时候,会频繁地接触到BIOS、UEFI、MBR、GPT、GRUB等诸多概念,本文尽量通过容易理解的表达进行。

一. 计算机主板固件

BIOSUEFI是不同的计算机启动固件(Fireware),其中UEFI是比较新的方式,它们是跟随着主板而存在的,固件也有不同的版本,但是除非有特殊要求,通常不对其进行升级,保持默认的版本即可。

1.1 BIOS

BIOS(Basic Input/Output System)是一种业界标准的固件接口。这种主板类型大家应该比较熟悉,老一点的机器都是使用BIOS主板。对于支持BIOS的主板来讲,BIOS只能完成非常基本的硬件检测和初始化,之后的事情就都由bootloader来接手。所以BIOS只认识设备,不认识分区、不认识文件。

BIOS启动的时候,会按照CMOS设置里的顺序,挨个查看存储设备的前512字节是不是以0x55 0xAA结尾,如果不是,那就跳过找下一个设备;如果是的话,则表示这个磁盘可以启动,加载这512字节里的代码,执行之后,后面的事,几乎就跟BIOS没啥关系了。

至于加载引导代码后面启动什么系统,取决于这512B(字节)里存了什么系统的代码。这个代码是各家系统安装程序写进去的,目的是启动自家系统。比如安装Windows,这里面就变成了Windows的启动代码,安装了Linux,这里面就会变成Grub的启动代码。

BIOS能识别的分区表类型为MBR,只能管理最大2.2T的硬盘,并且分区数上限最大为4个,后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。而UEFI采用GPT分区表的方式后,硬盘容量和分区数目几乎没有上限

1.2 UEFI

UEFI,全称Unified Extensible Firmware Interface,即统一的可扩展固件接口,是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替BIOS。此标准由intel公司带头组织UEFI联盟中的140多个技术公司共同创建,其中包括微软公司。UEFI旨在提高软件互操作性和解决BIOS的局限性。作为传统BIOS的继任者,UEFI拥有前辈所不具备的诸多功能,比如图形化界面、多种多样的操作方式、允许植入硬件驱动等等。这些特性让UEFI相比于传统BIOS更加易用、更加多功能、更加方便。

UEFI还包含了其他功能,它支持安全引导,这意味着可以检查操作系统的有效性,以确保没有恶意软件篡改引导过程。它可以在UEFI固件本身中支持联网特性,这有助于远程故障排除和配置。对于传统BIOS,必须坐在物理计算机前才能配置它。

老一点的机器都是使用BIOS主板,现在大部分新机器都是采用UEFI主板,UEFI采用了向后兼容,所以BIOS切换为UEFI不可以,而UEFI切换为BIOS是可以的。

不仅仅是BIOS替换。UEFI本质上是一个运行在PC固件之上的微型操作系统,它可以做的比BIOS多得多。它可以存储在主板的闪存中,也可以在启动时从硬盘或网络共享加载。一般的UEFI系统仅能识别FAT32,不同于BIOS只能识别固定位置的磁盘引导块。这意味着只要将引导程序放到FAT32分区里,UEFI系统就能通过分区表的指引找到这个保存着引导程序的FAT32分区。UEFI系统是由模块化的C语言程序写出来的,所以通过添加或修改程序模块就能获得更多的功能。例如支持更多的文件系统,图形界面,甚至能使用浏览器浏览网页。

二. 磁盘分区表

硬盘分区表DPT(Disk Partition Table)。一个磁盘抛开物理组成部分的话,它就是一个地址序列,这个序列从0 ~ n-1,每个地址包含512B字节的空间。一般我们将这些地址称作逻辑块地址(LBA),每块由512B组成。分区表告诉操作系统,磁盘的分区有几个,从哪里开始到哪里结束。当将一个磁盘插入已经含有操作系统的机器上时,操作系统会检索这个磁盘的分区表,并正确认识它的分区结构。一个磁盘是先有分区表,后有分区,然后才有文件系统,有了文件系统才能被操作系统读写删。磁盘分区表格式目前主要有两种,分别是MBR分区表和GPT分区表。

2.1 MBR

BIOS支持的主板上引导的启动硬盘中,硬盘前512字节就是MBR(Master Boot Record),主分区引导记录。注意: MBR有两个意思,一个表示主引导记录(磁盘的第一个逻辑扇区),一个表示分区表类型MBR。和BIOS相对应的磁盘分区类型是MBR。

  • MBR
    主引导记录位置在磁盘的第一个逻辑扇区,即LBA0的位置。一个逻辑扇区仅有512B(字节) ,MBR引导代码占446BMBR分区表占64B,最后的magic number占2B(即上述以0x55 0xAA结尾的标识符)。因为每个分区只有16B大小的分区表记录,所以寻址最大只能到2.2TB,并且由于分区表总共只占64B,所以MBR分区表最多4个分区。上图的绿色部分。
  • PBR
    即Partition Boot Record,对应主引导记录,每个分区都存在引导记录,位置在每个磁盘分区的开始部分,占用扇区不定。这个扇区一般保存着操作系统引导程序的所在位置。上图的红色部分。
  • File System
    操作系统对磁盘的所有操作都需要经过文件系统,删除文件指的是在文件系统里删除文件的索引条目,创建文件就是在在文件系统里添加索引条目并将具体数据写入磁盘。常见的文件系统格式有:FAT、ext4、NTFS。文件系统位置一般在PBR之后。上图黄色部分。

2.2 BIOS 引导流程

开机后,固化在ROM里的BIOS就会被加载到内存运行,BIOS自检完毕以后加载COMS的参数,通过COMS的参数,BIOS程序加载启动磁盘的MBR到内存里运行,运行MBR的引导代码,这段代码会查找活动分区(BIOS不认识活动分区,但这段代码认识活动分区)的位置,加载并执行活动分区的PBR(另一段引导程序),与MBR类似,PBR在运行后加载操作系统的引导程序到内存运行,例如WindowsbootmgrLinuxgrub。当引导程序运行后,操作系统内核就被加载运行,完成从BIOS程序中接手的引导流程,整体流程如下图:

WindowsPBR认识FAT32NTFS两种分区,找到分区根目录的bootmgr文件,加载、执行bootmgrbootmgr没了MBRPBR的大小限制,可以做更多的事。bootmgr可以跨越磁盘读取文件了。所以无论你有几个磁盘,你在多少块磁盘上装了Windows,一个电脑只需要一个bootmgr就行了。bootmgr会去加载某磁盘某NTFS分区的\Windows\System32\WinLoad.exe,后面启动Windows的事就由WinLoad.exe来完成了。

为什么图中有两组虚线呢?因为"启动磁盘"和"装系统的磁盘"可以是同一个磁盘,也可以不是同一个。"启动分区"和"系统分区"可以是不同磁盘的不同分区,也可以是相同磁盘的不同分区,也可以是同一个分区。这就解释了,为什么有的时候,Windows装在磁盘2上,却要在BIOS里选磁盘1启动了。因为bootmgr可能在磁盘1上。

2.3 GPT

GPT,即Globally Unique Identifier Partition Table,全局唯一标识码分区表,简称GPTGUID分区表,它是UEFI规范的一部分。

GPTGPT头、GPT主体、GPT备份组成。起始于磁盘LBA1的位置,相对的LBA0仍然为MBR,但是这个MBR是被保护的(叫做PMBR),没有引导代码,仅仅有一个被标识为未知的分区,当支持GPT分区表的操作系统检索到这个MBR后就会自动忽略并跳到LBA1读取GPT分区表。如下图,由于篇幅的关系,表的长度比例不等同与实际在磁盘地址里的实际比例。

PMBR存在的意义是当不支持GPT的分区工具试图对硬盘进行操作时(例如MS-DOSLinuxfdisk程序),它可以根据这份PMBR以传统方式启动,过程和MBR+BIOS完全一致,极大地提高了兼容性。而支持GPT的系统在检测PMBR后会直接跳到GPT表头读取分区表。和MBR类似,分区表中存储了某个分区的起始和结束位置及其文件系统属性信息,而分区才是实际存在的物理磁盘的一部分。

  • GPT表头主要定义了如下信息:
  • 分区表中分区数及每个分区大小。
  • 硬盘的容量、硬盘的GUID
  • GPT表头位置(总是LBA1)和大小。
  • 备份GPT表头和备份分区表的位置和大小信息(LBA-1~LBA-34)。
  • GPT头和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。
  • 分区表主要定义的如下信息:
  • 分区名称,起始终止位置。
  • 该分区的GUID以及分区属性。
  • 相较于MBR,GPT具有以下优点:
  • GPT可管理的空间近乎无限大,假设一个扇区大小仍为512字节,可表示扇区数为,算下来,可管理的硬盘容量=18EB(1EB=1024PB=1,048,576TB)
  • 分区数量几乎没有限制,由于可在表头中设置分区数量的大小。不过,目前windows仅支持最大128个分区。
  • 由于在磁盘的首尾部分各带一个GPT表头,任何一个受到破坏后都可以通过另一份恢复,极大地提高了磁盘的抗性。
  • 循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率。
  • 每个分区都可以拥有一个特别的名字,最长72字节,足够满足种奇葩命名需求。
  • 完美支持UEFI,毕竟它就是UEFI规范的衍生品。在将来全行业UEFI的情境下,GPT必将更快淘汰MBR

2.4 UEFI 引导流程

开机后,固化在ROM里的UEFI BIOS就会被加载到内存运行。UEFI BIOS将引导EFI系统进行运行。在EFI系统启动后,GUID分区表就会被识别,之后EFI系统就会通过.efi文件启动Boot Loader程序加载操作系统内核。

对于分区表格式为MBR分区表的磁盘,UEFI系统会先启动CSM兼容模式后按传统BIOS的步骤加载操作系统的内核。如下图:

使用 GPT 方式安装系统。对于CentOS7来说,在安装系统时,在vmlinuz 这一行给内核传递一个参数inst.gpt即可(在这一行的末尾添加inst.gpt)。

2.5 BIOS BOOT分区

BIOS boot partition是一个分区,Grub用它来引导基于legacy bios但启动设备上却包含GPT格式分区表时的操作系统。这种结构有时候被称为BIOS/GPT启动。

Bios boot分区是必要的,因为GPT使用紧跟在MBR后面的扇区来保存实际的分区表,但在传统的MBR分区架构中,这些扇区并没有特殊的作用,这样的结果是没有足够的可用空闲空间来存储stage2这段boot loaderMBR中也存储了boot loader,但MBR无法存储超过512字节的内容,所以MBR中的这段boot loader被当作stage1使用,它的主要作用是加载功能更多更复杂的stage2这段boot loaderstage2可以从文件系统读取和载入操作系统内核。

当使用了BIOS boot分区,该分区将包含stage2boot loader程序,例如grub2文件,而stage1boot loader代码仍保留在MBR中。复杂的boot loadergrub2无法完全符合MBR中的398-446字节的区域的大小,因此它们需要一个辅助的存储空间。在MBR磁盘上,一般使用紧跟在MBR后的扇区空间来存储这些复杂的boot loader,这些扇区空间就是大众所熟知的"MBR gap"。而在GPT磁盘上,由于没有与MBR gap等效的未使用空间,所以单独使用一个bios boot分区来分配这样的空间,以存储复杂的boot loader

BIOS boot分区的GUID可以是"21686148-6449-6E6F-744E-656564454649"。在基于BIOS的平台下的GPT中,BIOS boot分区有点类似于EFI平台下的EFI系统分区,EFI系统分区使用UEFI保存文件系统和文件,而用于BIOS平台的BIOS boot分区则不使用文件系统来保存代码,在bios boot分区上是没有创建文件系统的。

bios boot分区的大小非常小,可以小到只有31kB(由于第一个扇区是mbr,所以bios boot的内容从第2扇区到第63扇区),但是由于未来boot loader可能会扩展,所以建议bios boot分区设置为1M大小,而且很多磁盘分区工具都使用1MB分区对齐策略,这样MBR到第一个分区之间会保留一些空闲空间。grub 2bios boot分区中存储它的core.img

三. 启动引导程序

3.1 GRUB

GRUB(Grand Unified Boot loader)是硬盘中的软件,引导器(loader)的一种,目前主流版本是 GRUB2GNU GRUB(简称GRUB)是一个来自GNU项目的启动引导程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。下图便是一个GRUB的引导界面:第一个选项和最后一个选项是选择不同的操作系统;第一个选项和第二个选项是选择不同的内核配置。

对于只支持BIOS的主板,可以使用grub进入grub命令行,然后为grub添加第三方的EFI shell模块,然后就可以启动那些使用EFI启动的OS了。对于只有EFI的主板,当然可以写个.efi文件,然后转去读取MBR传统引导。

GRUB的执行顺序为boot.img –> core.img –> /boot/grub/,在MBRGPT的分区方式不同,导致GRUB的存放位置也不同。

MBR分区表中,boot.imgcore.img都在MBR中。MBR虽然只占用一个扇区(512Byte),但是其所在的磁道是空闲的,不会用于分区,可以放下core.img

GPT分区表中,MBRprotected MBR(为兼容MBR,在硬盘起始位置保留的空间),后面并没有空间放core.img,需要建一个专门的分区来放,称为BIOS boot partition,该分区的文件类型为unformattedflagBOIS_grub,该flag用于标识core.img所要安装到的分区。若果使用UEFI引导,GRUB读取的是ESP分区中的数据,不需要flagBIOS_grub的分区。

🔗

文章推荐