UEFI 系统简介
UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)是现代计算机的固件标准,用于取代沿用数十年的传统 BIOS。
目录
1. 什么是 UEFI
UEFI 是一种固件规范,定义了操作系统与平台固件之间的软件接口。它存储在主板上的 SPI Flash 芯片中,是计算机上电后最先运行的程序,负责:
- 进行 POST(Power-On Self Test,上电自检)
UEFI 最初由 Intel 开发(前身为 EFI,用于 Itanium 架构),2005 年移交给 UEFI Forum 维护。目前最新规范为 UEFI 2.10(2022 年发布)。
2. UEFI 与 BIOS 的区别
3. UEFI 的核心组成
3.1 固件核心(PI 阶段)
UEFI 规范中,固件启动分为以下阶段:
SEC(安全验证)→ PEI(预 EFI 初始化)→ DXE(驱动执行环境)→ BDS(启动设备选择)→ TSL/RT(系统加载 / 运行时服务)
| | |
|---|
| | |
| | |
| Driver Execution Environment | |
| | |
| | |
3.2 UEFI 服务
UEFI 向操作系统暴露两类服务:
- Boot Services(引导服务):内存分配、协议接口、事件模型等,操作系统接管后失效。
- Runtime Services(运行时服务):时间读写、NVRAM 变量访问、系统重置等,操作系统运行期间持续可用。
3.3 NVRAM 变量
UEFI 使用 NVRAM(非易失性内存) 存储启动配置,包括:
- Secure Boot 密钥数据库(
db、dbx、PK、KEK)
在 Linux 中通过 efibootmgr 命令读写这些变量。
4. UEFI 启动流程
上电 │ ▼SEC 阶段:CPU 微代码加载,缓存初始化 │ ▼PEI 阶段:内存初始化,芯片组配置 │ ▼DXE 阶段:加载 UEFI 驱动(磁盘、网卡、显卡等) │ ▼BDS 阶段:读取 NVRAM 启动项 → 定位 EFI 系统分区(ESP) │ ▼加载 .efi 引导文件(如 \EFI\debian\grubx64.efi) │ ▼引导程序加载操作系统内核 │ ▼操作系统接管(Boot Services 终止,Runtime Services 保留)
5. Secure Boot 安全启动
5.1 原理
Secure Boot 通过 公钥基础设施(PKI) 验证每一个被加载的引导组件,防止未签名或被篡改的代码在启动链中执行。
5.2 密钥层级
PK(平台密钥,主板厂商持有) └── KEK(密钥交换密钥,OS 厂商注册) ├── db(允许数据库,存放可信签名) └── dbx(拒绝数据库,存放黑名单哈希)
| | |
|---|
| | |
| | |
| | |
| dbx(Forbidden Signatures) | | |
5.3 Linux 与 Secure Boot
- Ubuntu / Fedora:预装 shim 引导程序,已由微软签名,可在 Secure Boot 下直接启动。
- Debian:同样提供
shim-signed 包,安装后支持 Secure Boot。 - Arch Linux / Gentoo:需手动注册自己的密钥或关闭 Secure Boot。
5.4 关闭 Secure Boot
进入 UEFI 固件界面(开机按 F2 / Del / F10),找到 Security → Secure Boot 选项,将其设置为 Disabled 并保存退出。
6. UEFI Shell
UEFI Shell 是固件内置的命令行环境,可在操作系统之外执行诊断和管理操作。
6.1 常用命令
# 列出所有文件系统设备map -r# 切换到第一个 EFI 分区fs0:# 列出目录ls EFI\# 运行引导程序\EFI\debian\grubx64.efi# 查看 NVRAM 启动变量bcfg boot dump# 添加启动项bcfg boot add 0 fs0:\EFI\debian\grubx64.efi "Debian"# 删除启动项(编号 0)bcfg boot rm 0# 重启reset
6.2 进入 UEFI Shell
- 部分主板固件直接内置 Shell,在启动菜单中可选。
- 也可将
BOOTX64.EFI(来自 edk2 或 UEFI Shell 项目)放入 U 盘 \EFI\Boot\ 目录,从 U 盘启动进入。
7. UEFI 与操作系统的交互
7.1 Linux 中管理 UEFI
# 查看当前启动项efibootmgr -v# 添加启动项sudo efibootmgr --create \ --disk /dev/sda \ --part 1 \ --label "Debian" \ --loader '\EFI\debian\grubx64.efi'# 删除启动项(Boot0003)sudo efibootmgr -b 0003 -B# 修改启动顺序sudo efibootmgr -o 0001,0002,0003# 查看 EFI 变量ls /sys/firmware/efi/efivars/# 读取具体变量efivar --list
7.2 检查当前是否以 UEFI 模式启动
# 若目录存在,则为 UEFI 模式启动ls /sys/firmware/efi# 或使用[ -d /sys/firmware/efi ] && echo "UEFI mode" || echo "Legacy BIOS mode"
8. 常见 UEFI 设置项说明
| | |
|---|
| | |
| | |
| | |
| | |
| | |
| Virtualization(VT-x / AMD-V) | | |
| | |
9. 常见问题与排查
| | |
|---|
| | sudo os-prober && sudo update-grub |
| | 安装 shim-signed 或关闭 Secure Boot |
| | 进入 UEFI Shell,手动运行 .efi 文件 |
| | 关闭 Fast Boot,或在 Windows 中选「高级启动」 |
| | 重新注册 EFI 启动项(efibootmgr --create) |