【Linux进阶】文件系统2——MBR和GPT

1.磁盘的分区

因为如果你的磁盘被划分成两个分区,那么每个分区的设备文件名是什么?

在了解这个问题之前,我们先来复习一下磁盘的组成,因为现今磁盘的划分与它物理的组成很有关系。

我们谈过磁盘主要由碟片、机械手臂、磁头与主轴马达所组成,而数据的写入其实是在碟片上面。碟片上面又可细分出扇区(Sector)与磁道(Track)两种单位,其中扇区的物理大小设计有两种,分别是512字节与4K字节。

假设磁盘只有一个碟片,那么碟片有点像上图这样。那么是否每个扇区都一样重要?

其实整块磁盘的第一个扇区特别重要,因为它记录了整块磁盘的重要信息。

早期磁盘第一个扇区里面含有的重要信息我们称为MBR(Master Boot Record)格式,但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰,甚至有些2TB以上的磁盘分区已经让某些操作系统无法存取,因此后来又多了一个新的磁盘分区格式,称为GPT(GUID partition table),这两种分区格式与限制不太相同。

那么分区表又是啥?

其实你刚刚拿到的整块硬盘就像一根原木,你必须要在这根原木上面切割出你想要的区段,这个区段才能够再制作成为你想要的家具,如果没有进行切割,那么原木就不能被有效地使用。同样的道理,你必须要针对你的硬盘进行分区,这样硬盘才可以被你使用。

2. MBR(MS-DOS)与GPT磁盘分区表(partition table)

但是硬盘总不能真的拿锯子来切割吧?那硬盘还真的是会坏掉。

那怎么办?在上面的图中,我们有看到"开始与结束磁道"吧?

而通常磁盘可能有多个碟片,所有碟片的同一个磁道我们称为柱面(Cylinder),通常那是文件系统的最小单位,也就是分区的最小单位。

为什么说"通常"?

**因为近来有GPT这个可达到64位记录功能的分区表,现在我们甚至可以使用扇区(Sector)号码来作为分区单位。**所以说,我们就是利用参考对照柱面或扇区号码的方式来处理。

也就是说,分区表其实目前有两种格式,我们就依序来谈谈这两种分区表格式。

2.1.MBR(MS-DOS)分区表格式与限制

早期的Linux系统为了兼容Windows的磁盘,因此使用的是支持Windows的 MBR(Master Boot Record,主引导记录)的方式来处理启动引导程序与分区表。

而启动引导程序记录区与分区表则通通放在磁盘的第一个扇区,这个扇区通常是512字节的大小(旧的磁盘扇区都是512字节),所以说,第一个扇区的512字节主要会有这两个东西:

  • 主引导记录(Master Boot Record,MBR):可以安装启动引导程序的地方,有446字节;
  • 分区表(partition table):记录整块硬盘分区的状态,有64字节。

由于分区表所在区块仅有64字节容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的柱面号码。

若将硬盘以长条形来看,然后将柱面以柱形图来看,那么那64字节的记录区段有点像下面的图

假设上面的硬盘设备文件名为/dev/sda时,那么这四个分区在Linux系统中的设备文件名如下所示,重点在于文件名后面会再接一个数字,这个数字与该分区所在的位置有关。

  • P1:/dev/sda1
  • P2:/dev/sda2
  • P3:/dev/sda3
  • P4:/dev/sda4

上图中我们假设硬盘只有400个柱面,共划分成为四个分区,第四个分区所在为第301~400号柱面的范围。

当你的操作系统为Windows时,那么第一到第四个分区的代号应该就是C、D、E、F。

当你有数据要写入F分区时,你的数据会被写入这块磁盘的301~400号柱面之间的意思。

由于分区表就只有64字节而已,最多只能容纳四组分区记录,这四个分区的记录被称为主要分区(Primary)或扩展(Extended)分区。

注意了:

  • 主分区:也叫引导分区,最多可能创建4个,当创建四个主分区时候,就无法再创建扩展分区了,当然也就没有逻辑分区了。
  • 扩展分区:除了主分区外,剩余的磁盘空间就是扩展分区了,**扩展分区可以没有,最多1个。**严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。

根据上面的图与说明,我们可以得到几个重点信息:

  • 其实所谓的分区只是针对那个64字节的分区表进行设置而已。
  • 硬盘默认的分区表仅能写入四组分区信息。
  • 这四组划分信息我们称为主要(Primary)或扩展(Extended)分区。
  • 分区的最小单位通常为柱面(Cylinder)。
  • 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理。

你会不会突然想到,为啥要分区?基本上你可以这样思考分区的角度:

1.数据的安全性

因为每个分区的数据是分开的。所以,当你需要将某个分区的数据重新整理时,例如你要将计算机中Windows的C盘重新安装一次系统时,可以将其他重要数据移动到其他分区,例如将邮件、桌面数据移动到D盘,那么C盘重新安装系统并不会影响到D盘,所以善用分区,可以让你的数据更安全。

2.系统的性能考虑

由于分区将数据集中在某个柱面区段中,例如图2.2.2当中第一个分区位于柱面号码1~100号,如此一来当有数据要读取自该分区时,磁盘只会查找前面1~100的柱面范围,由于数据集中,将有助于数据读取的速度与性能,所以说,分区是很重要的。

既然分区表只有记录四组数据的空间,那么是否代表一块硬盘最多只能划分出四个分区呢?

当然不是。有经验的朋友都知道,你可以将一块硬盘划分成十个以上的分区。那又是如何达到的呢?

在Windows与 Linux系统中,我们是通过刚刚谈到的扩展分区(Extended)的方式来处理。

扩展分区的意思是:既然第一个扇区所在的分区表只能记录四组数据,那我可否利用额外的扇区来记录更多的分区信息?

实际上示意图有点像下面这样:

实际上扩展分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记录分区信息。只是为了方便读者记忆,在上图就将它简化了。

在图2.2.3当中,我们知道硬盘的四个分区记录区仅使用到两个,P1为主要分区,而P2则为扩展分区。

请注意,扩展分区的目的是使用额外的扇区(因为第一个扇区只能存4个分区)来记录分区信息,扩展分区本身并不能被拿来格式化。然后我们可以通过扩展分区所指向的那个区块继续做分区的记录。

如图2.2.3右下方那个区块继续划分出五个分区,这五个由扩展分区继续切出来的分区,就被称为逻辑分区(logical partition)。

同时注意一下,由于逻辑分区是由扩展分区继续划分出来的,所以它可以使用的柱面范围就是扩展分区所设置的范围,也就是图中的101~400。

我知道大家肯定懵逼了

我也是

主分区:**也叫引导分区,最多可能创建4个,当创建四个主分区时候,就无法再创建扩展分区了,当然也就没有逻辑分区了。**主分区是独立的,对应磁盘上的第一个分区,"一般"就是C盘。 在Windows系统把所有的主分区和逻辑分区都叫做"盘"或者"驱动器",并且把所有的可存储介质都显示为操作系统的"盘"。因此,从"盘"的概念上无法区分主分区和逻辑分区。并且盘符可以在操作系统中修改,这就是要加上"一般"二字的原因。

扩展分区:除了主分区外,剩余的磁盘空间就是扩展分区了,**扩展分区可以没有,最多1个。****严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。****这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。**无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。

逻辑分区:在扩展分区上面,可以创建多个逻辑分区。逻辑分区相当于一块存储截止,和操作系统,别的逻辑分区、主分区没有什么关系,是"独立的"。

同样,上述的分区在Linux系统中的设备文件名分别如下:

  • P1:/dev/sda1
  • P2:/dev/sda2
  • L1:/dev/sda5
  • L2:/dev/sda6
  • L3:/dev/sda7
  • L4:/dev/sda8
  • L5:/dev/sda9

仔细看看,怎么设备文件名没有/dev/sda3与/dev/sda4?

因为前面四个号码都是保留给主要分区或扩展分区(第一个扇区)用的,所以逻辑分区的设备名称号码就由5号开始。

这在MBR方式的分区表中是个很重要的特性,不能忘记。

MBR主要分区、扩展分区与逻辑分区的特性我们做个简单的定义。

  • 主要分区与扩展分区(第一个扇区里的)最多可以有4个(硬盘的限制);
  • 扩展分区最多只能有1个(操作系统的限制);
  • 逻辑分区是由扩展分区持续划分出来的分区;
  • 能够被格式化后作为数据存取的分区是主要分区与逻辑分区,扩展分区无法格式化;
  • 逻辑分区的数量依操作系统而不同,在Linux系统中SATA硬盘已经可以突破63个以上的分区限制。

事实上,分区是个很麻烦的东西,因为它是**以柱面为单位的连续磁盘空间,**且扩展分区又是个类似独立的磁盘空间,所以在分区的时候要特别注意。

我们举下面的例子来解释一下好了。

在Windows操作系统当中,如果你想要将D与E盘整合成为一个新的分区,而如果有两种分区的情况如图2.2.4所示,图中的特殊颜色区块为D与E盘的示意,请问这两种方式是否均可将D与E整合成为一个新的分区?

上图可以整合:因为上图的D与E同属于扩展分区内的逻辑分区,因此只要将两个分区删除,然后再重新建立一个新的分区,就能够在不影响其他分区的情况下,将两个分区的容量整合成为一个。

下图不可整合:因为D与E分属主要分区与逻辑分区,两者不能够整合在一起,除非将扩展分区破坏掉后再重新划分。

但如此一来会影响到所有的逻辑分区,要注意的是:如果扩展分区被破坏,所有逻辑分区将会被删除,因为逻辑分区的信息都记录在扩展分区里面。

由于第一个扇区所记录的分区表与MBR是这么的重要,几乎只要读取硬盘都会先由这个扇区先读起。

**因此,如果整块硬盘的第一个扇区(就是MBR与分区表所在的扇区)有损坏,那这个硬盘大概就没有用了。**因为系统如果找不到分区表,怎么知道如何读取柱面区间?您说是吧!

下面还有一些例题您可以思考看看:

如果我想将一块大硬盘暂时划分成为四个分区,同时还有其他的剩余容量可以让我在未来的时候进行规划,我能不能划分出四个主分区呢?若不行,那么你建议该如何划分?

答:

  • 由于主分区与扩展分区最多只能有四个,其中扩展分区最多只能有一个,这个例题想要划分出四个分区且还要预留剩余容量,因此P+P+P+P(四个主分区)的划分方式是不适合的。因为如果使用到四个P,则即使硬盘还有剩余容量,因为无法再继续划分,所以剩余容量就会被浪费。
  • 假设你想要将所有的四组记录都用完,那么P+P+P+E(三个主分区加1个拓展分区)就比较适合。所以可以用的四个分区有三个主要及一个扩展分区,剩余的容量在逻辑分区中。
  • 如果你要划分超过四分区时,**一定要有扩展分区,而且必须将所有剩下的空间都分配给扩展分区,然后再以逻辑分区的方式来划分扩展分区的空间。**另外,考虑到磁盘的连续性,一般建议将扩展分区的柱面号码分配在最后面的柱面内。
    假如我的计算机有两块 SATA硬盘,我想在第二块硬盘划分出六个可用的分区(可以被格式化来存取数据之用),那每个分区在Linux系统下的设备文件名是什么?且分区类型各是什么?至少写出两种不同的划分方式。

答:由于P(主分区)+E(扩展分区)最多只能有四个,其中E最多只能有一个。现在题目要求六个可用的分区,因此不可能分出四个P。

下面我们假设两种环境,一种是将前四个号全部用完,一种是仅使用一个P及一个E的情况:

实际可用的是/dev/sdb1、/dev/sdb2、/dev/sdb3、/dev/sdb5、/dev/sdb6、/dev/sdb7这六个,
至于/dev/sdb4这个扩展分区本身仅是提供来给逻辑分区建立之用。

注意到了吗?因为1~4号是保留给主要/扩展分区的,因此第一个逻辑分区一定是由5号开始的,
再次强调,所以/dev/sdb3、/dev/sdb4就会被保留下来没有用到。

MBR分区表除了上述的主要分区、扩展分区、逻辑分区需要注意之外,由于每组分区表仅有16字节而已,因此可记录的信息真的是相当有限。

所以,在过去MBR分区表的限制中经常可以发现如下的问题:

  • 操作系统无法使用2.2TB 以上的磁盘容量;
  • MBR仅有一个区块,若被破坏后,经常无法或很难恢复;
  • MBR内的存放启动引导程序的区块仅446字节,无法存储较多的程序代码。

这个2.2TB 限制的现象在早期并不会很严重。但是,近年来硬盘厂商推出的磁盘容量动不动就高达好几个TB。目前(2015年)单一磁盘最高容量甚至高达8TB。

如果使用磁盘阵列的系统,像一个系统中,用了24块4TB磁盘搭建出磁盘阵列,那在Linux下面就会看到有一块70TB左右的磁盘。如果使用MBR的话,那得要 2TB/2TB地划分下去,虽然Linux kernel现在已经可以通过某些机制让磁盘分区高过63个以上,但是这样就得要划分出将近40个分区,真要命,为了解决这个问题所以后来就有GPT这个磁盘分区的格式出现。

2.2.GPT(GUID partition table)磁盘分区表

因为过去一个扇区大小就是512字节而已,不过目前已经有4K的扇区设计出现。

为了兼容所有的磁盘,因此在扇区的定义上面,大多会使用所谓的逻辑区块地址(Logical BlockAddress,LBA)来处理。

GPT 将磁盘所有区块以此LBA(默认为512字节)来规划,而第一个LBA称为LBA0(从0开始编号)。

与MBR仅使用第一个512字节区块来记录不同,GPT使用了34个LBA区块来记录分区信息。

同时与过去MBR仅有一个区块,被干掉就死光光的情况不同,**GPT除了前面34个LBA之外,整个磁盘的最后34个LBA也拿来作为另一个备份。**这样或许会比较安全些吧!详细的结构有点像下图的模样。

上述图例的解释说明如下:

  • LBAO(MBR 兼容区块)

与MBR 模式相似,这个兼容区块也分为两个部分,一个就是跟之前446字节相似的区块,存储了第一阶段的启动引导程序

而在原本的分区表的记录区内,这个兼容模式仅放入一个特殊标志符,用来表示此磁盘为GPT格式之意。

而不懂GPT分区表的磁盘管理程序,就不会认识这块磁盘,除非用户有特别要求要处理这块磁盘,否则该管理软件不能修改此分区信息,进一步保护了磁盘。

  • LBA1(GPT 表头记录)

**这个部分记录了分区表本身的位置与大小,同时记录了备份用的GPT分区(就是前面谈到的在最后34个LBA区块)放置的位置,同时放置了分区表的校验码(CRC32),**操作系统可以根据这个校验码来判断GPT是否正确。若有错误,还可以通过这个记录区来获取备份的GPT(磁盘最后的那个备份区块)来恢复GPT的正常运行。

  • LBA2-33(实际记录分区信息处)

从LBA2区块开始,每个LBA 都可以记录4组分区记录,所以在默认的情况下,总共可以有4×32=1128组分区记录。

因为每个LBA有512字节,因此每组记录用到128字节的空间,除了每组记录所需要的标识符与相关的记录之外,GPT在每组记录中分别提供了64位来记载开始/结束的扇区号码,因此,GPT分区表对于单一分区来说,它的最大容量限制就会在【204x512字节=×1K字节=xTB=8ZB】,要注意1ZB=TB,你说够不够大?

现在 GPT 分区默认可以提供多达128组记录,而在Linux本身的内核设备记录中,针对单一磁盘来说,虽然过去最多只能到达15个分区,不过由于Linux内核通过udev等方式的处理,现在Linux也已经没有这个限制了。

此外,GPT分区已经没有所谓的主、扩展、逻辑分区的概念,既然每组记录都可以独立存在,当然每个都可以视为是主要分区,每一个分区都可以拿来格式化使用。

**虽然新版的Linux大多支持GPT分区表,没办法,我们的服务器常常需要比较高容量的磁盘。不过,在磁盘管理工具上面,fdisk 这个老牌的软件并不支持GPT。**要使用GPT的话,得要运行类似gdisk或是parted命令才行,这部分我们会在第二部分再来谈一谈。

另外,启动引导程序方面,grub第一版并不支持GPT。得要grub2以后版本才会支持,启动引导程序这部分在第五部分再来谈。

并不是所有的操作系统都可以读取到GPT的磁盘分区格式。

同时,也不是所有的硬件都可以支持GPT 格式,是否能够读写GPT格式又与启动的检测程序有关。那启动的检测程序又分成什么呢?

就是BIOS与UEFI。那这两个又是什么?就让我们来聊一聊。

2.3.启动流程中的BIOS与UEFI启动检测程序

没有运行软件的硬件是没有用的。

而为了计算机硬件系统的资源合理分配,因此有了操作系统这个系统软件的产生。由于操作系统会控制所有的硬件并且提供内核功能,因此我们的计算机就能够认识硬盘内的文件系统,并且进一步地读取硬盘内的软件与运行该软件来完成各项软件的运行目的。

**问题是,你有没有发现,既然操作系统也是软件,那么我的计算机又是如何认识这个操作系统软件并且执行它的呢?**明明启动时我的计算机还没有任何软件系统,那它要如何读取硬盘内的操作系统文件?

嘿嘿,这就得要牵涉到计算机的启动程序了。下面就让我们来谈一谈这个启动程序吧!基本上,目前的主机系统在加载硬件驱动方面的程序,主要有早期的BIOS与新的UEFI两种机制,我们分别来谈谈。

2.3.1. BIOS搭配 MBR/GPT的启动流程

  • CMOS是记录各项硬件参数且嵌入在主板上面的存储器,
  • BIOS则是一个写入到主板上的一个固件(固件就是写入到硬件上的一个软件程序)。

**这个BIOS就是在启动的时候,计算机系统会主动执行的第一个程序。**接下来BIOS会去分析计算机里面有哪些存储设备,

我们以硬盘为例,

  1. BIOS会依据用户的设置去取得能够启动的硬盘,并且到该硬盘里面去读取第一个扇区的MBR位置。MBR这个仅有446字节的硬盘容量里面会放置最基本的启动引导程序,此时 BIOS就功成圆满
  2. 而接下来就是 MBR内的启动引导程序的工作了。 这个启动引导程序的目的是在加载(load)内核文件,由于启动引导程序是操作系统在安装的时候所提供的,所以它会认识硬盘内的文件系统格式,因此就能够读取内核文件,
  3. 然后接下来就是内核文件的工作,启动引导程序与BIOS也功成圆满,将之后的工作就交给大家所知道的操作系统。

简单地说,整个启动流程到操作系统之前的过程应该是这样的。

  • 1.BIOS:启动主动执行的固件,会认识第一个可启动的设备;
  • 2.MBR:第一个可启动设备的第一个扇区内的主引导记录块,内含启动引导代码;
  • 3.启动引导程序(bootloader):一个可读取内核文件来执行的软件;
  • 4.内核文件:开始启动操作系统。

要注意,如果你的分区表为GPT格式的话,那么BIOS也能够从LBA0的MBR兼容区块读取第一阶段的启动引导程序代码,如果你的启动引导程序能够支持GPT的话,那么使用BIOS同样可以读取到正确的操作系统内核。

换句话说,如果启动引导程序不懂GPT,例如Windows XP的环境,那自然就无法读取内核文件,就无法启动操作系统。

由于LBAO仅提供第一阶段的启动引导程序代码,因此如果你使用类似grub的启动引导程序的话,那么就得要额外划分出一个"BIOSboot"的分区,这个分区才能够放置其他开机过程所需的程序,在CentOS当中,这个分区通常占用2MB左右而已,

**由上面的说明我们知道,BIOS与MBR都是硬件本身会支持的功能,至于Boot loader则是操作系统安装在MBR上面的一个软件。****由于MBR仅有446字节而已,因此这个启动引导程序是非常小而高效。**这个Boot loader 的主要任务有下面这些:

  • 提供选项:用户可以选择不同的启动选项,这也是多重引导的重要功能;
  • 加载内核文件:直接指向可使用的程序区段来启动操作系统;
  • 转交其他启动引导程序:将启动管理功能转交给其他启动引导程序负责。

上面前两点还容易理解,但是第三点很有趣。那表示你的计算机系统里面可能具有两个以上的启动引导程序。有可能吗?我们的硬盘不是只有一个 MBR 而已?

是没错,但是启动引导程序除了可以安装在MBR之外,还可以安装在每个分区的启动扇区(boot sector)。什么?分区还有各自的启动扇区?

没错,这个特性才能造就"多重引导"的功能。

我们举一个例子来说,假设你的个人计算机只有一个硬盘,里面分成四个分区,其中第一、二分区分别安装了Windows及Linux,你要如何在开机的时候选择用Windows还是Linux启动?

假设MBR内安装的是可同时认识Windows 与linux 操作系统的启动引导程序,那么整个流程如图2.2.8所示。

在图2.2.8中我们可以发现,MBR的启动引导程序提供两个选项,

  • 选项一(M1)可以直接加载Windows的内核文件来开机;
  • 选项二(M2)则是将开机管理工作交给第二个分区的启动扇区(boot sector )。

当用户在开机的时候选择选项二时,那么整个开机管理工作就会交给第二分区的启动引导程序。当第二个启动引导程序启动后,该启动引导程序内(图2.2.8中)仅有一个启动选项,因此就能够使用Linux的内核文件来启动。这就是多重引导的工作情况。

我们将上图做个总结:

  1. 每个分区都拥有自己的启动扇区(bootsector)
  2. 图中的系统分区为第一及第二分区;
  3. 实际可启动的内核文件是放置到各分区中的;
  4. 启动引导程序只会认识自己的系统分区内的可启动的内核文件,以及其他启动引导程序而已;
  5. 启动引导程序可直接指向或是间接将管理权转交给另一个管理程序。
    那现在请你想一想,为什么人家常常说:"如果要安装多重引导,最好先安装 Windows再安装Linux"?

这是因为:

  • **Linux 在安装的时候,你可以选择将启动引导程序安装在 MBR或各别分区的启动扇区,而且Linux的启动引导程序可以手动设置选项(就是图2.2.8的M1、M2),**所以你可以在Linux的启动引导程序里面加入Windows启动的选项;
  • Windows 在安装的时候,它的安装程序会主动地覆盖掉MBR以及自己所在分区的启动扇区你没有选择的机会,而且它没有让我们自己选择选项的功能。

因此,如果先安装Linux再安装Windows的话,那MBR的启动引导程序就只会有Windows的选项,而不会有Linux的选项(因为原本在MBR内的Linux的启动引导程序就会被覆盖掉)。

那需要重新安装Linux一次吗?当然不需要,你只要用尽各种方法来处理 MBR的内容即可。例如利用Linux的恢复模式来修复MBR。
启动引导程序与引导扇区是非常重要的概念,您在这里只要先对于

  • (1)启动需要启动引导程序,
  • (2)启动引导程序可以安装在MBR及引导扇区

两处这两个概念有基本的认识即可,一开始就记太多东西会很混乱。

2.3.2.UEFI BIOS搭配GPT启动的流程

我们现在知道GPT 可以提供64位的寻址,然后也能够使用较大的区块来处理启动引导程序,但是**BIOS其实不懂GPT。还得要通过GPT 提供兼容模式才能够读写这个磁盘设备,而且BIOS仅是16位的程序,在与现阶段新的操作系统接轨方面有点弱。**为了解决这个问题,因此就有了UEFI(Unified extensible Firmware Interface)这个统一可扩展固件接口的产生。

UEFI主要是想要取代BIOS这个固件接口,因此我们也称UEFI为UEFI BIOS。 UEFI使用C程序语言编写,比起使用汇编语言的传统BIOS要更容易开发。也因为使用C语言来编写,因此如果开发者够厉害,甚至可以在UEFI启动阶段就让该系统了解TCP/IP而直接上网,根本不需要进入操作系统,这让小型系统的开发充满各式各样的可能性。

基本上,传统 BIOS与UEFI的差异可以用《T客帮》杂志整理的表格来说明:

|------------|----------------------------------|-----------|
| 比较项目 | 传统BIOS | UEFI |
| 使用程序语言 | 汇编语言 | c语言 |
| 硬件资源控制 | 使用中断(IRQ)管理 不可变的内存存取 不可变的输入/输出存取 | 使用驱动程序和协议 |
| 扩充方式 | 通过IRQ连接 | 直接加载驱动程序 |
| 第三方厂商支持 | 较差 | 较佳且可支持多平台 |
| 处理器运行环境 | 16位 | CPU保护模式 |
| 图形能力 | 较差 | 较佳 |
| 内置简化操作系统环境 | 不支持 | 支持 |

从上面我们可以发现,与传统的BIOS不同,UEFI简直就像是一个低级的操作系统,甚至于连主板上面的硬件资源的管理,也跟操作系统相当类似,只需要加载驱动程序即可控制操作。同时由于其功能特性,一般来说,使用 UEFI的主机,在开机的速度上要比BIOS快上许多。

因此很多人都觉得UEFI似乎可以发展成为一个很有用的操作系统,不过,关于这个你无须担心未来除了Linux之外,还得要增加学一个 UEFI的操作系统,为啥?

UEFI 当初在开发的时候,就制定了一些规则在里面,包括硬件资源使用轮询(Poling)的方式来管理,与BIOS直接使用CPU以中断的方式来管理比较,这种轮询的效率稍微低一些。另外,UEF|并不能提供完整的缓存功能,因此执行效率也没有办法提升。不过由于加载所有的UEFI驱动程序之后,系统会启动一个类似操作系统的Shell环境,用户可以在此环境中执行任意的UEFI应用程序,而且效果比MS-DOS更好。

所以,因为效果华丽但性能不佳,这个 UEFI大多用来实现启动操作系统之前的硬件检测、启动管理、软件设置等目的,基本上是比较难的。同时,当加载操作系统后,一般来说,UEFI就会停止工作,并将系统交给操作系统,这与早期的BIOS差异不大。比较特别的是,在某些特定的环境下这些UEFI程序是可以部分继续执行,从而在某些操作系统无法找到特定设备时,该设备还可以持续运行。

此外,由于过去骇客(Cracker)经常借由 BIOS启动阶段来破坏系统,并取得系统的控制权,因此 UEFI加入了一个所谓的安全启动(secure boot)功能,这个功能代表着即将启动的操作系统必须要被 UEFI所验证,否则就无法顺利启动。微软用了很多这样的功能来管理硬件。不过加入这个功能后,许多的操作系统,包括 Linux,就很有可能无法顺利启动。所以,某些时刻,你可能得要将UEFI的secure boot 功能关闭,才能够顺利地进入Linux。

另外,与BIOS 模式相比,虽然UEFI可以直接获取GPT的分区表,不过最好依旧拥有BIOS boot的分区支持,同时,为了与Windows兼容,并且提供其他第三方厂商所使用的UEFI应用程序存储的空间,你必须要格式化一个FAT 格式的文件系统分区,大约提供512MB到1GB左右的大小,以让其他UEFI执行较为方便。

由于UEFI已经解决了BIOS的1024柱面的问题,因此你的启动引导程序与内核可以放置在磁盘开始的前2TB位置内即可。加上之前提到的BIOS boot以及UEFI支持的分区,基本上你的/boot目录几乎都是/dev/sda3之后的号码。这样启动还是没有问题的,所以要注意,与以前熟悉的分区情况已经不同,/boot不再是/dev/sdal。

相关推荐
m5127几秒前
LinuxC语言
java·服务器·前端
运维-大白同学22 分钟前
将django+vue项目发布部署到服务器
服务器·vue.js·django
糖豆豆今天也要努力鸭30 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
烦躁的大鼻嘎38 分钟前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器
乐大师39 分钟前
Deepin登录后提示“解锁登陆密钥环里的密码不匹配”
运维·服务器
ac.char1 小时前
在 Ubuntu 上安装 Yarn 环境
linux·运维·服务器·ubuntu
敲上瘾1 小时前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
长弓聊编程1 小时前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.1 小时前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒2 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生