UEFI安全启动签名部署与内核引导配置 - 第2节
2.1 UEFI 启动流程概述
UEFI(统一可扩展固件接口)取代了传统 BIOS,定义了从系统上电到操作系统启动之间的标准化接口。理解 UEFI 启动流程是掌握安全启动与内核参数传递的基础。
核心概念:UEFI 启动流程分为七个阶段,从 SEC(安全验证)到 BDS(启动设备选择),最终由 Boot Manager 加载操作系统引导程序。
2.1.1 UEFI 启动七阶段
| 阶段 | 全称 | 主要职责 | 安全启动相关性 |
|---|---|---|---|
| SEC | Security | CPU 初始化、Cache as RAM、安全验证 | 验证固件根信任 |
| PEI | Pre-EFI Initialization | 内存初始化、S3 恢复、PEIM 调度 | 验证 PEI 模块签名 |
| DXE | Driver Execution Environment | 驱动加载、协议安装、系统表构建 | 验证 DXE 驱动签名 |
| BDS | Boot Device Selection | Boot Manager 运行、Boot Option 遍历 | 验证 Boot Manager 签名 |
| TSL | Transient System Load | OS Loader 加载、引导参数传递 | 验证 OS Loader 签名 |
| RT | Runtime | OS 接管、Runtime 服务 | 退出 Boot Services |
| AL | After Life | 系统复位/关机清理 | — |
实践要点:内核参数签名与传递发生在 BDS 阶段末期和 TSL 阶段初期。Boot Manager 在 BDS 阶段读取 Boot Option 中的参数,OS Loader 在 TSL 阶段验证参数签名后传递给内核。
2.2 固件引导管理器
固件引导管理器(Firmware Boot Manager)是 UEFI 固件内置的组件,负责管理启动选项、执行启动策略、维护全局变量。它运行在 BDS 阶段,是连接固件与操作系统的桥梁。
2.2.1 引导管理器的核心职责
- Boot Option 管理:维护启动选项列表,包括设备路径、描述字符串、加载选项参数
- 启动策略执行:按优先级遍历 Boot Option,尝试加载引导程序
- 全局变量维护:管理
BootOrder、Boot####、Timeout等 UEFI 变量 - 安全启动集成:调用安全启动协议验证引导程序签名
- 用户交互:提供启动菜单、超时等待、手动选择设备
2.2.2 引导管理器与 UEFI 变量
引导管理器通过 UEFI 非易失性变量(NVRAM)持久化存储启动配置。这些变量在系统重启后仍然保留,是 Boot Manager 工作的数据基础。
| 变量名称 | GUID | 类型 | 说明 |
|---|---|---|---|
BootOrder |
8BE4DF61-93CA-11D2-AA0D-00E098032B8C |
UINT16 数组 | 启动选项优先级顺序 |
Boot#### |
8BE4DF61-93CA-11D2-AA0D-00E098032B8C |
LOAD_OPTION | 单个启动选项(#### 为 0000-FFFF) |
Timeout |
8BE4DF61-93CA-11D2-AA0D-00E098032B8C |
UINT16 | 启动菜单超时秒数 |
SecureBoot |
8BE4DF61-93CA-11D2-AA0D-00E098032B8C |
UINT8 | 安全启动状态(0=关闭,1=开启) |
SetupMode |
8BE4DF61-93CA-11D2-AA0D-00E098032B8C |
UINT8 | 设置模式(1=可安装密钥) |
安全提示:UEFI 变量存储在 SPI Flash 中,具有写保护属性。内核参数签名信息通常存储在
Boot#### 变量的 OptionalData 字段中,该字段在安全启动开启时会被签名验证保护。
2.3 Boot Manager 与 Boot Option
Boot Manager 是 UEFI 固件的核心组件,Boot Option 是它管理的启动条目。每个 Boot Option 描述了一个可引导设备或引导程序,包含设备路径、描述字符串、加载选项参数等关键信息。
2.3.1 Boot Option 数据结构
每个 Boot Option 对应一个 LOAD_OPTION 结构体,定义在 UEFI 规范中:
typedef struct _LOAD_OPTION {
UINT32 Attributes; // 属性标志
UINT16 FilePathListLength; // 设备路径列表长度
// CHAR16 Description[]; // 描述字符串(变长)
// EFI_DEVICE_PATH_PROTOCOL FilePathList[]; // 设备路径列表(变长)
// UINT8 OptionalData[]; // 可选数据(变长,内核参数存放位置)
} LOAD_OPTION;
| 字段 | 偏移 | 说明 | 内核参数相关性 |
|---|---|---|---|
Attributes |
0x00 | 启动选项属性(LOAD_OPTION_ACTIVE 等) | 决定选项是否启用 |
FilePathListLength |
0x04 | 设备路径列表的字节长度 | 用于定位 OptionalData |
Description |
0x08 | 以 NULL 结尾的 Unicode 描述字符串 | 显示在启动菜单中 |
FilePathList |
变长 | 设备路径协议实例列表 | 指向引导程序位置 |
OptionalData |
变长 | 可选数据,紧跟在 FilePathList 之后 | 内核参数签名存放位置 |
2.3.2 Boot Manager 启动流程
2.3.3 Boot Option 管理命令
在 UEFI Shell 环境中,可以使用 bcfg 命令管理 Boot Option:
# 显示当前所有 Boot Option
Shell> bcfg boot dump
# 添加一个新的 Boot Option(ID=0004,描述="Linux",设备路径=fs0:\EFI\linux\vmlinuz.efi)
Shell> bcfg boot add 0004 fs0:\EFI\linux\vmlinuz.efi "Linux"
# 修改 Boot Option 的 OptionalData(传递内核参数)
Shell> bcfg boot opt 0004 "console=ttyS0,115200 root=/dev/sda1 quiet"
# 设置启动顺序(先启动 ID=0004,再启动 ID=0001)
Shell> bcfg boot order 0004 0001
# 删除 Boot Option
Shell> bcfg boot rm 0004
内核参数签名实践:在安全启动环境下,
bcfg boot opt 设置的 OptionalData 会被固件自动签名验证。如果修改了内核参数但未重新签名,固件会拒绝加载该 Boot Option,从而防止未授权的内核参数篡改。
2.3.4 Boot Option 与内核参数传递
内核参数通过 Boot Option 的 OptionalData 字段传递。当引导程序(如 GRUB、systemd-boot)被加载时,固件将 OptionalData 作为参数传递给引导程序,引导程序再将其解析为内核命令行参数。
| 组件 | 角色 | 参数传递方式 | 签名验证点 |
|---|---|---|---|
| UEFI 固件 | 存储 Boot Option | NVRAM 变量 Boot#### |
固件验证 OptionalData 签名 |
| Boot Manager | 选择并加载引导程序 | 通过 LoadImage() 传递 | 验证引导程序签名 |
| 引导程序 | 解析 OptionalData | 读取 LoadedImage 协议 | 可选二次验证 |
| Linux 内核 | 接收命令行参数 | boot_params 结构体 | 内核验证引导程序签名 |