BIOS / UEFI
检测当前固件类型
检测路径 /sys/firmware/efi 是否存在:
- 如果存在,则使用 UEFI
- 如果不存在,则使用 BIOS
bash
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"BIOS
Basic Input/Output System,基本输入输出系统。是 PC 上最早的固件标准。
工作流程
- 上电后 CPU 从固定地址(
0xFFFF0)执行 BIOS 代码 - 执行 POST(Power-On Self Test,开机自检),检验 CPU、内存、外设
- 按 Boot Order 查找可引导设备(读取设备第一个扇区的 MBR)
- 将 MBR 中的引导代码(446 字节)加载到内存
0x7C00并执行 - 引导代码加载第二阶段引导程序(如 GRUB),再加载内核
MBR(Master Boot Record)
位于磁盘第一个扇区(512 字节):
| 偏移 | 大小 | 内容 |
|---|---|---|
| 0 | 446 B | 引导代码 |
| 446 | 64 B | 分区表(4 项,每项 16 B) |
| 510 | 2 B | 魔数 0x55AA |
BIOS 局限性
- 只支持 MBR 分区表,最大磁盘 2 TB,最多 4 个主分区
- 引导代码空间极小(446 字节),需要多级引导
- 16 位实模式,初始化速度慢
- 无法安全启动(Secure Boot)
UEFI
Unified Extensible Firmware Interface,统一可扩展固件接口,是 BIOS 的现代替代方案。
工作流程
- 上电后执行 SEC(安全阶段)和 PEI(预 EFI 初始化)
- 执行 POST 自检
- 加载 DXE(驱动执行环境),初始化各类驱动
- 通过 BDS(引导设备选择)查找 EFI 系统分区(ESP)
- 从 ESP 中加载 EFI 引导程序(如
EFI/ubuntu/grubx64.efi) - 引导程序加载内核
EFI 系统分区(ESP)
- FAT32 格式的专用分区,挂载于
/boot/efi - 存储各系统的 EFI 引导文件
bash
# 查看 ESP
ls /boot/efi/EFI/
# 查看 EFI 启动项
efibootmgr -vUEFI 优势
| 特性 | BIOS | UEFI |
|---|---|---|
| 分区表 | MBR(最大 2 TB) | GPT(最大 18 EB) |
| 最大分区数 | 4 个主分区 | 128 个分区 |
| 启动模式 | 16 位实模式 | 32/64 位保护模式 |
| 启动速度 | 慢 | 快(并行初始化) |
| 安全启动 | 不支持 | 支持 Secure Boot |
| 图形界面 | 无 | 支持(鼠标操作) |
| 网络引导 | 有限 | 原生支持 PXE |
Secure Boot(安全启动)
UEFI 安全启动通过验证引导程序的数字签名,防止恶意代码在启动时加载。
bash
# 查看 Secure Boot 状态
mokutil --sb-state
# 或
bootctl status | grep "Secure Boot"GRUB
GNU GRUB(Grand Unified Bootloader)是 Linux 最常用的引导程序,支持 BIOS 和 UEFI。
bash
# 查看 GRUB 配置
cat /boot/grub/grub.cfg # BIOS
cat /boot/efi/EFI/*/grub.cfg # UEFI
# 重新生成 GRUB 配置
update-grub # Debian/Ubuntu
grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
# 重新安装 GRUB(BIOS)
grub-install /dev/sda
# 重新安装 GRUB(UEFI)
grub-install --target=x86_64-efi --efi-directory=/boot/efi常用诊断命令
bash
# 确认固件类型
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
# 查看 EFI 启动条目
efibootmgr -v
# 查看 EFI 变量
ls /sys/firmware/efi/efivars/
# 查看引导日志
dmesg | grep -i "efi\|bios\|uefi\|secure"
journalctl -b | grep -i "efi\|bios"
# 查看内核引导参数
cat /proc/cmdline