简说BIOS UEFI MBR GPT等概念
在安装或重装操作系统(Windows、Linux)的时候,会频繁地接触到BIOS、UEFI、MBR、GPT、GRUB等诸多概念,本文尽量通过容易理解的表达进行。
一. 计算机主板固件
BIOS
和UEFI
是不同的计算机启动固件(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
引导代码占446B
,MBR
分区表占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
在运行后加载操作系统的引导程序到内存运行,例如Windows
的bootmgr
或Linux
的grub
。当引导程序运行后,操作系统内核就被加载运行,完成从BIOS
程序中接手的引导流程,整体流程如下图:
Windows
的PBR
认识FAT32
和NTFS
两种分区,找到分区根目录的bootmgr
文件,加载、执行bootmgr
。bootmgr
没了MBR
和PBR
的大小限制,可以做更多的事。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
,全局唯一标识码分区表,简称GPT
或GUID
分区表,它是UEFI规范的一部分。
GPT
由GPT
头、GPT
主体、GPT
备份组成。起始于磁盘LBA1
的位置,相对的LBA0
仍然为MBR
,但是这个MBR
是被保护的(叫做PMBR
),没有引导代码,仅仅有一个被标识为未知的分区,当支持GPT
分区表的操作系统检索到这个MBR
后就会自动忽略并跳到LBA1
读取GPT
分区表。如下图,由于篇幅的关系,表的长度比例不等同与实际在磁盘地址里的实际比例。
PMBR
存在的意义是当不支持GPT
的分区工具试图对硬盘进行操作时(例如MS-DOS
和Linux
的fdisk
程序),它可以根据这份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 loader
。MBR
中也存储了boot loader
,但MBR
无法存储超过512字节的内容,所以MBR
中的这段boot loader
被当作stage1
使用,它的主要作用是加载功能更多更复杂的stage2
这段boot loader
,stage2
可以从文件系统读取和载入操作系统内核。
当使用了BIOS boot
分区,该分区将包含stage2
的boot loader
程序,例如grub2
文件,而stage1
的boot loader
代码仍保留在MBR
中。复杂的boot loader
如grub2
无法完全符合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 2
在bios boot
分区中存储它的core.img
。
三. 启动引导程序
3.1 GRUB
GRUB(Grand Unified Boot loader)
是硬盘中的软件,引导器(loader)的一种,目前主流版本是 GRUB2
。GNU GRUB
(简称GRUB
)是一个来自GNU
项目的启动引导程序。GRUB
是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB
可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。下图便是一个GRUB
的引导界面:第一个选项和最后一个选项是选择不同的操作系统;第一个选项和第二个选项是选择不同的内核配置。
对于只支持BIOS
的主板,可以使用grub
进入grub
命令行,然后为grub
添加第三方的EFI shell
模块,然后就可以启动那些使用EFI
启动的OS
了。对于只有EFI
的主板,当然可以写个.efi
文件,然后转去读取MBR
传统引导。
GRUB
的执行顺序为boot.img –> core.img –> /boot/grub/
,在MBR
和GPT
的分区方式不同,导致GRUB
的存放位置也不同。
在MBR
分区表中,boot.img
和core.img
都在MBR
中。MBR
虽然只占用一个扇区(512Byte)
,但是其所在的磁道是空闲的,不会用于分区,可以放下core.img
。
在GPT
分区表中,MBR
为protected MBR
(为兼容MBR
,在硬盘起始位置保留的空间),后面并没有空间放core.img
,需要建一个专门的分区来放,称为BIOS boot partition
,该分区的文件类型为unformatted
,flag
为BOIS_grub
,该flag
用于标识core.img
所要安装到的分区。若果使用UEFI
引导,GRUB
读取的是ESP
分区中的数据,不需要flag
为BIOS_grub
的分区。