磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)

本文为《鸟哥的 Linux 私房菜》读书笔记

目录

  • 磁盘分区
    • MBR (MS-DOS) 分区表
    • GPT (GUID partition table) 磁盘分区表
  • BIOS 与 UEFI 启动检测程序
    • BIOS 搭配 MBR / GPT 的启动流程
      • BIOS 搭配 MBR
      • BIOS 搭配 GPT
      • BIOS 的 1024 柱面问题
    • UEFI BIOS 搭配 GPT 启动的流程
  • 启动引导程序 (boot loader)
    • 多重引导

磁盘分区

  • 硬盘必须要分区之后才能使用,那么为什么要磁盘分区?
    • 数据的安全性: 每个分区的数据是分开的,所以,当你需要将某个分区的数据重整时,例如你要将计算机中Windows的C盘重装系统时, 可以将其他重要数据移动到其他分区,那么C盘重装系统并不会影响到D盘
    • 系统的性能考虑: 由于分区将数据集中在某个柱面的区段,当有数据要读取自该分区时, 磁盘只会查找对应的柱面范围,由于数据集中,将有助于数据读取的速度与性能

磁盘的第一个扇区

  • 扇区 (sector) 的物理大小设计有两种,分别是 512Bytes 与 4KBytes
  • 其中磁盘的第一个扇区特别重要,它存储了磁盘分区表
    • 早期磁盘第一个扇区里面含有的磁盘分区表我们称为 MBR (Master Boot Record) 格式
    • 但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰, 甚至有些大于 2TB 以上的磁盘分区已经让某些操作系统无法存取。因此后来又多了一个新的磁盘分区格式,称为 GPT (GUID partition table)
      磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第1张图片
    • 由于第一个扇区所记录的分区表与 MBR 十分重要,几乎只要读取硬盘都会先由这个扇区先读起。 因此,如果硬盘的第一个扇区有损坏,那这个硬盘大概就没有用了

  • 通常磁盘可能有多个盘片,所有盘片的同一个磁道 (track) 我们称为柱面 (Cylinder), 通常那是文件系统的最小单位,也就是分区的最小单位
    • 为什么说“通常”?因为 GPT 的分区表可达到 64bit 纪录功能, 现在我们甚至可以使用扇区号码来作为分区单位

MBR (MS-DOS) 分区表

  • 早期的 Linux 系统为了兼容 Windows 的磁盘,使用的是支持 Windows 的 MBR(Master Boot Record, 主引导记录) 的方式来处理引导程序与分区表。而引导程序与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes (旧的磁盘扇区都是 512Bytes),所以说,第一个扇区 512Bytes 主要会有这两个数据 (还有一个结束标志 55 A A 55AA 55AA):
    • 主引导记录 (MBR):可以安装启动引导程序的地方,有 446 Bytes
    • 分区表(partition table):记录整块硬盘分区的状态,有 64 Bytes
      • 由于分区表所在区块仅有 64 Bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的柱面号码;这四个分区的记录被称为 主要分区(Primary)或 扩展分区(Extended)
        磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第2张图片
      • 下图中假设硬盘只有400个柱面,共划分为四个分区;如果硬盘设备文件名为 /dev/sda,则 P 1 P_1 P1 ~ P 4 P_4 P4 的设备文件名分别为 /dev/sda1 ~ /dev/sda4
        磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第3张图片
      • 如果想要划分出四个以上的分区,就要用到扩展分区扩展分区本身并不能被格式化,而是 利用额外的扇区来记录更多的分区信息,然后我们可以通过扩展分区所指向的那个区块继续作分区的记录得到 逻辑分区
      • 操作系统规定 扩展分区最多只能有 1 个
        • 如下图所示, P 1 P_1 P1 为主要分区 (/dev/sda1), P 2 P_2 P2 为扩展分区 (/dev/sda2), L 1 L_1 L1 ~ L 5 L_5 L5 为逻辑分区 (/dev/sda5 ~ /dev/sda9) (前四个号码都是保留给主要分区或扩展分区用的)
          磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第4张图片

实际上扩展分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记载分区信息;上图将其简化了

  • 要注意,逻辑分区的信息都记录在扩展分区里,因此如果扩展分区被破坏,所有逻辑分区会被删除;例如,下图中我们想要将两个蓝色的分区整合为一个新的分区,上面的两个逻辑分区的整合是比较容易的,只要删除这两个分区在重建一个新的就行了;但下面逻辑分区和主要分区就无法整合,除非将扩展分区破坏掉再重新划分,但如此一来就要删除所有的逻辑分区
    磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第5张图片

MBR 分区表的限制

  • MBR 分区表总共 64 字节,分为四组记录区,因此每组分区表只有 16 字节;而这 16 字节中有 4 字节用来存储该分区的总扇区数;因此一个分区最多 2 32 2^{32} 232 个扇区,每个扇区 512 字节,即一个分区的最大容量为 2 T B 2TB 2TB
  • MBR 仅有一个区块,若被破坏后,经常无法或很难恢复
  • MBR 内的存放启动引导程序的区块仅 446Bytes,无法容纳较多的程序代码

GPT (GUID partition table) 磁盘分区表

逻辑区块地址(Logical Block Address, LBA

  • 目前已经有 4K 的扇区设计出现,为了兼容所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的 逻辑区块地址 来处理
  • GPT 将磁盘所有区块以 LBA(默认为 512Bytes来规划,第一个 LBA 称为 LBA0 (从 0 开始编号)

GPT

磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第6张图片

  • GPT 使用了 34 个 LBA 区块来记录分区信息。同时除了前面 34 个
    LBA 之外,整个磁盘的最后 34 个 LBA 也拿来作为另一个备份
  • LBA0MBR 兼容区块
    • 与 MBR 模式相似,这个兼容区块也分为两个部分,一个就是跟之前 446 Bytes 相似的区块,储存了第一阶段的启动引导程序;而在原本的分区表的记录区内,这个兼容模式仅放入一个特殊标志符,用来表示此磁盘为 GPT 格式。而不懂 GPT 分区表的磁盘管理程序, 就不会识别该磁盘,进一步保护了磁盘
  • LBA1GPT 表头记录
    • 这个部分记录了分区表本身的位置与大小,同时记录了备份用的 GPT 分区 (最后 34 个 LBA 区块) 的位置, 同时放置了分区表的校验码(CRC32),操作系统可以根据这个校验码来判断 GPT 是否正确。若有错误,还可以通过这个记录区来取得备份的 GPT来恢复 GPT 的正常运行
  • LBA2 ~ 33实际记录分区信息处
    • 从 LBA2 区块开始,每个 LBA 都可以记录 4 组分区记录,所以在默认的情况下,总共可以有 4 × 32 = 128 4\times32 = \boldsymbol {128} 4×32=128 组分区记录。因为每个 LBA 有 512Bytes,因此每组记录用到 128Bytes 的空间,除了每组记录所需要的标识符与相关的记录之外,GPT 在每组记录中分别提供了 64bits 来记载开始/结束的扇区号码 (64 位寻址),因此,GPT 分区表对单一分区来说,最大容量限制就为 2 64 × 512 2^{64}\times512 264×512 Bytes = 8 ZB
  • 此外,GPT 分区已经没有所谓的主、扩展、逻辑分区的概念,既然每组记录都可以独立存在, 当然每个都可以视为是主要分区,每一个分区都
    可以拿来格式化使用

BIOS 与 UEFI 启动检测程序

  • 操作系统也是软件,那么我的计算机又是如何认识这个操作系统软件并且执行它的呢?这就得要牵涉到计算机的启动程序了

BIOS 搭配 MBR / GPT 的启动流程

  • 如果磁盘大小小于 2 T B 2TB 2TB,系统会默认使用 MBR 分区
  • 如果磁盘大小大于 2 T B 2TB 2TB,系统会默认使用 GPT 分区

BIOS 搭配 MBR

BIOS & CMOS

  • 我们知道,CMOS记录各项硬件参数且嵌入在主板上面的存储器BIOS 则是一个写入到主板上的一个固件。这个 BIOS 就是在启动的时候,计算机系统会主动执行的第一个程序
  • 接下来 BIOS 会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS 会依据用户的设置去取得能够启动的硬盘, 并且到该硬盘里面去读取第一个扇区的 MBR 位置。 MBR 这个仅有 446Bytes 的硬盘容量里面会放置最基本的启动引导程序, 此时 BIOS 就功成圆满,而接下来就是 MBR 内的启动引导程序的工作了

BIOS 搭配 GPT

  • BIOS 其实不懂 GPT,还得要通过 GPT 提供兼容模式才能够读写这个磁盘设备,但 BIOS 也能够从 LBA0 的 MBR 兼容区块读取第一阶段的启动引导程序
    • 如果你的启动引导程序能够支持 GPT (grub2以及之后的版本) 的话,那么使用 BIOS 同样可以读取到正确的操作系统内核
    • 如果使用类似 grub 的不支持 GPT 的启动引导程序的话,就得额外分区出一个 BIOS boot 分区, 这个分区才能够放置其他开机过程所需的程序。在 CentOS 当中,这个分区通常占用 2MB 左右

BIOS 的 1024 柱面问题

  • BIOS 使用 3 个字节来表示磁盘地址,10 位表示柱面,6 位表示头,8 位表示扇区。如果一个扇区 512 字节,那么能表示的磁盘地址为 2 10 × 2 6 × 2 8 × 512 B = 8.4 G B 2^{10}\times 2^6\times2^8\times512B=8.4GB 210×26×28×512B=8.4GB
  • 因此,启动引导程序只能放在分区的前 8.4 G B 8.4GB 8.4GB 的位置

UEFI BIOS 搭配 GPT 启动的流程

本节部分内容参考 详解 UEFI 模式下安装 Linux,如果安装时有其他问题也可以再参考一下这个网页

  • BIOS 其实不懂 GPT,还得要通过 GPT 提供兼容模式才能够读写这个磁盘设备;而且 BIOS 仅为 16 位的程序,在与新的操作系统接轨方面有点弱
  • 为了解决这个问题,因此就有了 统一可扩展固件接口 UEFI (Unified Extensible Firmware Interface);UEFI 主要是想取代 BIOS 这个固件接口,因此我们也称 UEFI 为 UEFI BIOS
    • UEFI 使用 C 语言 编写,比起使用汇编语言的传统 BIOS 要更容易开发,因此如果开发者够厉害,甚至可以在 UEFI 启动阶段就让该系统了解 TCP/IP 而直接上网,根本不需要进入操作系统。这让小型系统的开发充满各式各样的可能性
    • 与传统的 BIOS 不同,UEFI 简直就像是一个低级的操作系统;甚至连主板上面的硬件资源的管理, 也跟操作系统相当类似,只需要加载驱动程序即可控制操作。同时由于功能特性,一般来说,使用 UEFI 的主机,在开机的速度上要比 BIOS 快许多

UEFI 对分区的要求

  • 与 BIOS 模式相比,虽然 UEFI 可以直接取得 GPT 的分区表,不过最好依旧拥有 BIOS boot 的分区支持,这样更加灵活,因为你可以安装 BIOS 模式下的 grub,然后以任意模式 (UEFI / BIOS) 进行启动引导
  • 同时,为了与 Windows 兼容,并且提供其他第三方厂商所使用的 UEFI 应用程序存储的空间,你必须要格式化一个 FAT 格式的 ESP 分区, 大约提供 512MB 到 1GB 的大小
    • 不同发行版的安装程序以不同的方式辨识 ESP 分区。比如,Debian 和 Ubuntu 的某些版本把 ESP 分区称为 “EFI boot partition”,而且不会明确显示它的挂载点(尽管它会在后台挂载)
    • 但是有些发行版,需要你去手动挂载。在 Linux 中最标准的 ESP 分区挂载点是 /boot/efi
    • 除非 ESP 分区没有,否则不要为其新建文件系统 — 如果已经安装 Windows 或其它操作系统,它们的引导文件都在 ESP 分区里,新建文件系统会销毁这些文件
  • 由于 UEFI 已经克服了 BIOS 的 1024 柱面问题,因此启动引导程序与内核可以放置在磁盘开始的前 2TB 位置。加上 BIOS boot 以及 UEFI 支持的分区,基本上存放启动引导程序以及系统内核文件的 /boot 目录几乎都是 /dev/sda3 之后的号码了

由于过去 cracker 经常借由 BIOS 启动阶段来破坏系统,并取得系统的控制权,因此 UEFI 加入了一个所谓的安全启动 (secure boot) 机制, 开机的操作系统必须要被 UEFI 所验证,否则就无法顺利开机。 不过加入这个机制后,许多的操作系统,包括 Linux ,就很有可能无法顺利开机。所以,你可能得要将 UEFI 的 secure boot 功能关闭, 才能够顺利的进入 Linux

启动引导程序 (boot loader)

  • 启动引导程序是操作系统安装在 MBR 上的一个软件,由于 MBR 仅有 446 Bytes,因此这个启动引导程序非常小而高效,它主要提供以下功能:
    • 提供选项:用户可以选择不同的启动选项,这也是多重引导的重要功能
    • 转交其他启动引导程序:启动引导程序除了可以安装在 MBR 之外, 还可以安装在每个分区的启动扇区(boot sector),因此可以将启动管理功能转交给其他启动引导程序负责;这个特性才能造就多重引导
    • 加载内核文件:内核文件放置在一个分区中,该分区即为系统分区启动引导程序只会识别自己的系统分区内的可启动的内核文件启动操作系统

注意,启动引导程序只认识自己的系统分区内的可启动的内核文件以及其他启动引导程序,不能直接加载其他分区内的内核文件

多重引导

  • 下图为多重引导的示意图;MBR 的启动引导程序提供两个菜单,菜单一 M 1 M_1 M1)可以直接加载 Windows 的内核文件来开机; 菜单二( M 2 M_2 M2)则是将启动管理工作交给第二个分区的开机扇区。当使用者在开机的时候选择菜单二时, 那么整个开机管理工作就会交给第二分区的启动引导程序。 当第二个启动引导程序启动后,该启动引导程序内仅有一个开机菜单,因此就能够使用 Linux 的内核文件来启动
    磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)_第7张图片
  • 如果要安装多重启动, 最好先安装 Windows 再安装 Linux
    • 这是因为:Linux在安装的时候,你可以选择将启动引导程序安装在 MBR 或其他分区的启动扇区, 而且 Linux 的启动引导程序可以手动设置选项(就是上图的 M 1 , M 2 M_1, M_2 M1,M2…),所以你可以在 Linux 的 boot loader 里面加入Windows 开机的选项;
    • 而 Windows 在安装的时候,会主动覆盖 MBR 以及自己所在分区的启动扇区,你没有选择的机会, 而且它没有让我们自己选择选项的功能。因此,如果先安装 Linux 再安装 Windows 的话,那 MBR 的启动引导程序就只会有 Windows 的项目,而不会有 Linux 的项目 (因为原本在 MBR 内的 Linux 的启动引导程序就会被覆盖掉)。 此时可以利用 Linux 的恢复模式来修复 MBR

你可能感兴趣的:(Linux)