内容纲要

本文来自《Linux》专栏系列


「引导」(booting)」是「启动计算机」的标准说法。它是「bootstrapping」一词的缩写,之所以使用这个词是因为计算机必须「自己把自己启动起来」(pull itself up by own bootstraps)。

引导过程包括如下几个粗略的任务:

  • 查找、载入并执行引导代码;
  • 查找、载入并执行操作系统内核;
  • 运行启动脚本和系统守护进程;
  • 维护进程卫生(process hygiene),管理系统状态变化。

最后一项任务涉及到的各种活动会一直持续到系统关闭,因此引导过程和政策操作之间的界限不免就有点模糊了。

系统固件

当机器通电后 CPU 会固定执行存储在 ROM 中的引导代码。(在虚拟系统中这个「ROM」未必存在)。

系统固件通常知晓主板上安装的所有设备并进行配置,另外还可以选择是将设备呈现给操作系统或将其禁用并隐藏。

大多数系统固件都提供了用户界面,不同的制造商的设定不同,一般会在机器通电后出现的第一个界面(一般是品牌 logo)屏幕的某个角落提示按下特定的键(如 F2Del 等)以进入用户界面。

在正常的引导过程中系统固件会侦测硬件和磁盘,执行简单的健康检查后查找下一阶段的引导代码,可以在固件的用户界面指定引导设备,如从 USB、硬盘、网络等,可以按优先级顺序执行。

BIOS

传统电脑上的系统固件为 BIOS(Basic Input/Output System)。传统 BIOS 认为引导设备是以主引导记录(Master Boot Record,简称 MBR)作为起始。

MBR 包括第一阶段的引导装载程序和一个原始的磁盘分区表,而引导装载程序和 BIOS 都没有复杂到能够读取任意类型的标准文件系统,所以第二阶段的引导装载程序必须放在一个容易找到的地方,即引导装载程序从 MBR 中读取分区信息,识别出标记为活动(active)的磁盘分区,也就是通常所说的「活动分区」。然后读取并执行位于该分区起始位置上(第二阶段)引导装载程序,分区上的这个区域被称为卷引导记录(volume boot record)。

也可以将第二阶段引导装载程序放在 MBR 与第一个磁盘分区之间的闲置区,GRUB 就是采用的这种方案。

UEFI

目前 BIOS 已被更为正式和现代的标准所替代,那就是「统一可扩展固件接口」(Unified Extensible Firmware Interface),UEFI 是早先标准 EFI 的修订版所以在一些比较旧的文档或标准术语中仍会出现 EFI 的说法,可以视为同义。

UEFI 规范中包含了一个叫作 GUID 分区表(globally unique identifier,全局唯一标志符)的现代磁盘分区方案。

UEFI 能够理解简单且有效 FAT 文件系统,这些特性结合在一起形成了一个新的概念:EFI 系统分区(EFI system partition,ESP),在引导时固件会通过查询 GPT 来识别 ESP,然后从 ESP 中的文件直接读取并执行配置好的目标应用(the configured target application)。也因为 ESP 只是一个普通的 FAT 文件系统,所以它可以由任何操作系统挂载、读取、写入及维护,磁盘上不再需要有任何隐匿的引导块。

UEFI 仍就得在每个磁盘的起始位置维护一个兼容的 MBR,即 PMBR。以此实现与 BIOS 系统的互操作性,PMBR 的存在是为了避免旧版的磁盘工具在处理 GPT 磁盘时出现误操作。

就技术上而言可以完全不实用引导装载程序,UEFI 的引导目标可以在经过配置后直接载入 UNIX 或 Linux 内核,从而实现无装载程序引导,但在实际中大多数系统为了更容易和传统 BIOS 保持兼容性而使用引导装载程序。

UEFI 是将 ESP 中的载入路径保存为配置参数,如在现代 Intel 系统中 UEFI 会默认查找 /efi/boot/bootx64.efi

UEFI 定义了访问系统硬件的标准 API(很像微型的自主操作系统),甚至包括了 UEFI 层面的扩展设备驱动程序,操作系统可以利用 UEFI 的接口或者直接控制硬件,因此可以在操作系统中检查、修改 UEFI 变量,包括引导菜单选项

例如使用 efibootmgr 显示引导选项的汇总信息。

efibootmgr -v

efibootmgr 可以创建、删除引导项,以及修改引导顺序、选择下一个已配置的引导选项等操作。

引导装载程序

引导装载程序的主要任务是识别并载入相应的操作系统内核。大多数引导装载程序会在引导期间提供一个界面,让用户在多个内核或操作系统中进行选择。除此之外引导装载程序还处理内核配置参数。

GRUB

由 GNU 项目开发的 GRUB(GNU GRand Unified Bootloader)是大多数 Linux 发行版默认的引导装载程序,目前主要分为两个版本,传统的 GRUB Legacy 和全新的 GRUB 2,后者也是目前的标准。

通过 GRUB 可以指定各种参数,如内核引导参数和引导完成后进入的操作模式。

延伸