9
原文地址: https://www.tony-yin.site/201...

最近一直在搞Linux系统启动方面的事情,频繁地接触到BIOSUEFIMBRGPTGRUB等诸多概念,一下子有些混淆不清,本文就这些概念进行总结,尽量通过容易理解的表达进行讲解,对这些概念有一个清楚的认识。

<center>bios</center>

简介

BIOSBasic Input/Output System)和UEFIUnified Extensible Firmware Interface )是不同的计算机启动固件(Fireware),需要硬件(通常为主板)支持,相互代替的,其中UEFI 是比较新的方式。可以通过下面图片对这两个概念先有个直观了解:

BIOS:

<center>bios</center>

UEFI:

<center>uefi</center>

BIOS

BIOS(Basic Input/Output System):在IBM PC兼容系统上使用,是一种业界标准的固件接口。这种主板类型大家应该比较熟悉,老一点的机器都是使用BIOS主板。对于支持BIOS的主板来讲,BIOS只能完成非常基本的硬件检测和初始化,之后的事情就都由bootloader来接手。

一句话概括:BIOS只认识设备,不认识分区、不认识文件。

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

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

MBR

那么这512字节里面到底什么东西呢,看起来如此重要?这就是MBRMaster Boot Record),主分区引导记录。

硬盘分区表 DPT(Disk Partition Table)

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

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

<center>mbr</center>

BIOS 引导流程

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

<center>bios loader</center>

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

<center>bios loader partition</center>

为什么图中有两组虚线?

因为“启动磁盘”和“装系统的磁盘”可以是同一个磁盘,也可以不是同一个。“启动分区”和“系统分区”可以是不同磁盘的不同分区,也可以是相同磁盘的不同分区,也可以是同一个分区。

这就解释了,为什么有的时候,Windows装在磁盘2上,却要在BIOS里选磁盘1启动了。因为bootmgr可能在磁盘1上。

UEFI

UEFI,全称Unified Extensible Firmware Interface,即“统一的可扩展固件接口”,是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替BIOS。此标准由intel公司带头组织UEFI联盟中的140多个技术公司共同创建,其中包括微软公司。UEFI旨在提高软件互操作性和解决BIOS的局限性。作为传统BIOS的继任者,UEFI拥有前辈所不具备的诸多功能,比如图形化界面、多种多样的操作方式、允许植入硬件驱动等等。这些特性让UEFI相比于传统BIOS更加易用、更加多功能、更加方便。而Windows 8在发布之初就对外宣布全面支持UEFI,这也促使了众多主板厂商纷纷转投UEFI,并将此作为主板的标准配置之一。Intel更是宣布在2020之前实现在芯片上将BIOS全部替换UEFI。对UEFI的由来感兴趣的可以阅读一下【UEFI背后的历史】
  
BIOS只能在16位模式下运行,而UEFI可以在32位或64位模式下运行,并且具有比BIOS更多的可寻址地址空间,这意味着引导过程更快。这也意味着UEFI设置屏幕可以比BIOS设置屏幕更光滑,包括图形和鼠标光标支持。但是这不是强制性的,许多pc机仍然带有文本模式的UEFI设置界面,这些界面看起来和工作起来都像一个旧的BIOS设置屏幕。老一点的机器都是使用BIOS主板,现在大部分新机器都是采用UEFI主板,UEFI采用了向后兼容,所以BIOS切换为UEFI不可以,而UEFI切换为BIOS是可以的。

UEFI还包含了其他功能,它支持安全引导,这意味着可以检查操作系统的有效性,以确保没有恶意软件篡改引导过程。它可以在UEFI固件本身中支持联网特性,这有助于远程故障排除和配置。对于传统BIOS,必须坐在物理计算机前才能配置它。虽然目前有厂商利用这一特性尝试垄断市场,但这不意味着这不是一个很好的功能。

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

上面提到BIOS分区表类型为MBR,只能管理最大2.2T的硬盘,并且分区数上限最大为4个,尽管后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念,但是换汤不换药,满足不了硬盘容量和分区数目急速增长的需求。而UEFI采用GPT分区表的方式后,硬盘容量和分区数目几乎没有上限(目前windows支持最大128个分区)。

UEFI架构感兴趣的可以关注UEFI架构详解

GPT

GPT,即Globally Unique Identifier Partition Table,全局唯一标识码分区表,简称GPTGUID分区表,它是UEFI规范的一部分。由于MBR分区表 的局限性(还有BIOS的),而UEFI BIOS的推广也为GPT的实现打下了坚实的技术基础,GPT应运而生。GPTGPT头和GPT主体,GPT备份组成。起始于磁盘LBA1的位置,相对的LBA0仍然为MBR,但是这个MBR是被保护的,没有引导代码,仅仅有一个被标识为未知的分区,当支持GPT分区表的操作系统检索到这个MBR后就会自动忽略并跳到LBA1读取GPT分区表。如下图,由于篇幅的关系,表的长度比例不等同与实际在磁盘地址里的实际比例。

<center>gpt</center>

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

GPT表头,主要定义了分区表中分区数及每个分区大小,还包含硬盘的容量信息。分区表头还记录了这块硬盘的GUID,分区表头位置(总是LBA1)和大小,也包含了备份分区表头和分区表的位置和大小信息(LBA-1~LBA-34)。同时还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。

分区表包含分区的类型GUID(如:EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}),名称,起始终止位置,该分区的GUID以及分区属性。

相较于MBRGPT具有以下优点:

  • 得益于LBA提升至64位,以及分区表中每项128位设定,GPT可管理的空间近乎无限大,假设一个扇区大小仍为512字节,可表示扇区数为,算下来,可管理的硬盘容量=18EB(1EB=1024PB=1,048,576TB),2.2T在它面前完全不在话下。按目前的硬盘技术来看,确实近乎无限。
  • 分区数量几乎没有限制,由于可在表头中设置分区数量的大小,如果愿意,设置分区也可以(有人愿意管理这么多分区吗),不过,目前windows仅支持最大128个分区。
  • 自带保险,由于在磁盘的首尾部分各带一个GPT表头,任何一个受到破坏后都可以通过另一份恢复,极大地提高了磁盘的抗性。
  • 循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率。
  • 尽管目前分区类型不超过百数,GPT仍提供了16字节的GUID来标识分区类型,使其更不容易产生冲突。
  • 每个分区都可以拥有一个特别的名字,最长72字节,足够满足种奇葩命名需求。
  • 完美支持UEFI,毕竟它就是UEFI规范的衍生品。在将来全行业UEFI的情境下,GPT必将更快淘汰MBR

UEFI 引导流程

整个UEFI的启动详细流程描述如下:

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

如下图:

<center>uefi loader</center>

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

<center>uefi mbr loader</center>

如何使用 GPT 方式安装系统

由于MBR方式限制重重,所以大部分情况下我们都会选择使用GPT分区方式安装系统。通过上面的讲解,我们应该知道UEFI方式安装的系统是肯定是使用GPT分区方式;而BIOS方式安装的系统默认使用MBR分区方式。

看下图,这是一个主板支持UEFI的机器,最下面有一个启动设备是UEFI:开头的,即表示通过UEFI方式安装系统,这样安装默认支持使用GPT分区方式:

<center>uefi support</center>

再看下图,这是一个主板不支持UEFI的机器,最下面没有启动设备是UEFI:开头的,只有ATEN开头的,ATEN就是默认地通过BIOS方式安装系统:

<center>uefi no support</center>

这样安装默认不支持使用GPT分区方式,不过我们可以通过一些手段强制以GPT分区方式安装系统,

在安装开机后第一个界面,按tab键,在行末尾,空格,输入inst.gpt,如下图所示:

<center>force gpt</center>

GRUB

GRUB 是什么

GRUBGrand Unified Boot loader)是硬盘中的软件,引导器(loader)的一种。目前主流版本是 GRUB2,可以看GRUB2中文介绍。

Wikipedia这样介绍GURB

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

<center>grub loader</center>

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

GRUB用于从多操作系统的计算机中选择一个系统来启动,或从系统分区中选择特殊的内核配置。

如图:第一个选项和最后一个选项是选择不同的操作系统;第一个选项和第二个选项是选择不同的内核配置。

GRUB位置

其启动代码(boot.img)直接安装在MBR中,然后执行GRUB内核镜像(core.img),最后从/boot/grub中读取配置和其他功能代码。

BIOS引导方式中,MBR分区表和GPT分区表的GRUB引导文件所放分区不同

<center>grub location</center>

如图,GRUB的执行顺序为boot.img –> core.img –> /boot/grub/

  • MBR分区表中,boot.imgcore.img都在MBR中。MBR虽然只占用一个扇区(512Byte),但是其所在的磁道是空闲的,不会用于分区,可以放下core.img
Some MBR code loads additional code for a boot manager from the first track of the disk, which it assumes to be “free” space that is not allocated to any disk partition, and executes it. – MBR
  • GPT分区表中,MBRprotected MBR(为兼容MBR,在硬盘起始位置保留的空间),后面并没有空间放core.img,需要建一个专门的分区来放,称为BIOS boot partition,该分区的文件类型为unformattedflagBOIS_grub,该flag用于标识core.img所要安装到的分区。若果使用UEFI引导,GRUB读取的是ESP分区中的数据,不需要flagBIOS_grub的分区。

总结

本文依次对BIOSUEFIMBRGPTGRUB等概念进行了介绍和讲解,相信看完本文后,应该对BIOS + MBRUEFI + GPT这两种方式有了充分的了解。本文做了一个比较详细的总结,旨在让读者对这些概念有一个入门的认识,当你不断研究,深入下去之后会发现这些概念只是冰山一角,还有很多知识等我们去探索,比如boot loaderboot managerFAT等等。

Refer

  1. What Is UEFI, and How Is It Different from BIOS?
  2. Intel to Remove Legacy BIOS Support from UEFI by 2020
  3. UEFI是什么?与BIOS的区别在哪里?
  4. Ubuntu16.10 迁移到 SSD
  5. 现代计算机 Boot 相关知识
  6. 科普贴:BIOS和UEFI的启动项
  7. Mac 系统引导过程概述 & BootCamp 的秘密
  8. UEFI背后的历史
  9. UEFI架构
  10. MBR与GPT
  11. 关于UEFI启动+GPT分区的一些经验
  12. CentOS 7 安装强制使用GPT分区
  13. 反Secure Boot垄断:兼谈如何在Windows 8电脑上安装Linux

Tony_Zby
7.1k 声望154 粉丝

世界太大,没事瞄一瞄


引用和评论

0 条评论