UEFI安全启动签名部署与内核引导配置 - 第2节

2.1 UEFI 启动流程概述

UEFI(统一可扩展固件接口)取代了传统 BIOS,定义了从系统上电到操作系统启动之间的标准化接口。理解 UEFI 启动流程是掌握安全启动与内核参数传递的基础。

核心概念:UEFI 启动流程分为七个阶段,从 SEC(安全验证)到 BDS(启动设备选择),最终由 Boot Manager 加载操作系统引导程序。

2.1.1 UEFI 启动七阶段

UEFI 启动七阶段流程 SEC PEI DXE BDS TSL RT AL 安全验证 CPU 初始化 Cache as RAM PEI 核心 内存初始化 S3 恢复 DXE 调度器 驱动加载 协议安装 启动管理器 Boot Option 设备选择 临时系统 OS Loader 引导加载 运行时 OS 接管 Runtime 服务 AL 阶段 最终清理 退出 Boot 安全启动关键阶段 SEC 阶段验证固件完整性 → PEI 阶段验证 PEI 模块 → DXE 阶段验证驱动签名 → BDS 阶段验证 Boot Manager TSL 阶段验证 OS Loader 签名 → 内核参数签名验证在 BDS/TSL 交界处完成
阶段 全称 主要职责 安全启动相关性
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 变量
  • 安全启动集成:调用安全启动协议验证引导程序签名
  • 用户交互:提供启动菜单、超时等待、手动选择设备
固件引导管理器架构 Boot Manager Boot Option 列表 启动策略引擎 UEFI 变量服务 安全启动协议 Boot Manager 通过 UEFI 变量 BootOrder 确定启动顺序,遍历 Boot#### 变量加载引导程序 安全启动启用时,每个引导程序加载前都会调用 Secure Boot 协议验证签名

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 启动流程

Boot Manager 启动流程 BDS 阶段开始 读取 BootOrder 遍历 Boot#### 解析 LOAD_OPTION 安全启动验证 加载引导程序 关键说明 • BootOrder 变量存储 启动选项 ID 数组 • 按 BootOrder 顺序 读取 Boot#### 变量 • 解析 LOAD_OPTION 提取设备路径和参数 • 安全启动验证 检查引导程序签名 • 验证通过后 加载并执行引导程序 • 验证失败则 尝试下一个 Boot Option • 全部失败则 显示启动失败提示

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 结构体 内核验证引导程序签名
内核参数传递链路 Boot#### 变量 LoadImage() 引导程序 Linux 内核 OptionalData 参数传递 解析命令行 boot_params 签名验证链:固件验证 Boot#### → 固件验证引导程序 → 引导程序可选验证内核 → 内核验证引导程序