Skip to content

BIOS / UEFI ​

检测当前固件类型 ​

检测路径 /sys/firmware/efi 是否存在:

  • 如果存在,则使用 UEFI
  • 如果不存在,则使用 BIOS
bash
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"

BIOS ​

Basic Input/Output System,基本输入输出系统。是 PC 上最早的固件标准。

工作流程 ​

  1. 上电后 CPU 从固定地址(0xFFFF0)执行 BIOS 代码
  2. 执行 POST(Power-On Self Test,开机自检),检验 CPU、内存、外设
  3. 按 Boot Order 查找可引导设备(读取设备第一个扇区的 MBR)
  4. 将 MBR 中的引导代码(446 字节)加载到内存 0x7C00 并执行
  5. 引导代码加载第二阶段引导程序(如 GRUB),再加载内核

MBR(Master Boot Record) ​

位于磁盘第一个扇区(512 字节):

偏移大小内容
0446 B引导代码
44664 B分区表(4 项,每项 16 B)
5102 B魔数 0x55AA

BIOS 局限性 ​

  • 只支持 MBR 分区表,最大磁盘 2 TB,最多 4 个主分区
  • 引导代码空间极小(446 字节),需要多级引导
  • 16 位实模式,初始化速度慢
  • 无法安全启动(Secure Boot)

UEFI ​

Unified Extensible Firmware Interface,统一可扩展固件接口,是 BIOS 的现代替代方案。

工作流程 ​

  1. 上电后执行 SEC(安全阶段)和 PEI(预 EFI 初始化)
  2. 执行 POST 自检
  3. 加载 DXE(驱动执行环境),初始化各类驱动
  4. 通过 BDS(引导设备选择)查找 EFI 系统分区(ESP)
  5. 从 ESP 中加载 EFI 引导程序(如 EFI/ubuntu/grubx64.efi)
  6. 引导程序加载内核

EFI 系统分区(ESP) ​

  • FAT32 格式的专用分区,挂载于 /boot/efi
  • 存储各系统的 EFI 引导文件
bash
# 查看 ESP
ls /boot/efi/EFI/

# 查看 EFI 启动项
efibootmgr -v

UEFI 优势 ​

特性BIOSUEFI
分区表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