在 Ubuntu 22.04 环境下,判断系统当前是运行在 UEFI 模式还是 Legacy(BIOS/CSM)模式,最准确且无需重启的方法是通过检查文件系统挂载点或查询内核参数。以下是几种常用且可靠的判断方式,按推荐程度排序:
方法一:检查 /sys/firmware/efi 目录(最推荐)
这是最直接、最可靠的方法。如果系统以 UEFI 模式启动,Linux 内核会在运行时挂载 EFI 变量文件系统到 /sys/firmware/efi。
操作命令:
ls -d /sys/firmware/efi
结果分析:
- 如果输出结果为
/sys/firmware/efi:说明该目录存在,系统正在以 UEFI 模式运行。 - 如果提示“No such file or directory”:说明该目录不存在,系统正在以 Legacy (BIOS) 模式运行。
原理说明:UEFI 固件会向操作系统暴露一个虚拟文件系统(efivarfs),用于存储和读取 NVRAM 中的变量。Legacy BIOS 没有此机制,因此该路径不会存在。
方法二:使用 mokutil 命令
mokutil 是 Machine Owner Key(机器所有者密钥)管理工具,通常与 Secure Boot 相关。它也能间接反映启动模式。
操作命令:
mokutil --sb-state
结果分析:
- 如果显示
SecureBoot enabled或SecureBoot disabled:说明系统是以 UEFI 模式启动的(因为 Secure Boot 是 UEFI 特性)。 - 如果报错
command not found或提示无法访问:可能未安装mokutil,或系统为 Legacy 模式。
注意:即使 Secure Boot 被禁用,只要系统是 UEFI 启动,
mokutil --sb-state仍应能返回状态信息。
方法三:检查 GRUB 配置中的 GRUB_TERMINAL 或 gfxmode
虽然不绝对,但许多 UEFI 系统在 GRUB 配置中会使用特定的图形模式或终端设置。不过此方法不如前两种可靠,仅作为辅助参考。
更可靠的是检查 /proc/cmdline 中是否有 quiet splash 之外的 UEFI 特定标志,但通常没有明确标识。因此,不建议依赖此方法。
方法四:通过 dmesg 查看内核启动日志
内核在启动时会记录硬件初始化信息,包括是否检测到 EFI 服务。
操作命令:
dmesg | grep -i efi
结果分析:
- 如果看到类似
EFI services will be accessed.或EFI Variable Support registered的行:表示系统以 UEFI 模式启动。 - 如果没有相关输出:可能是 Legacy 模式,或 EFI 支持未被启用。
方法五:检查 /boot/grub/grub.cfg 中的 efi 相关条目
在某些 UEFI 系统中,GRUB 配置文件中可能会包含与 EFI 相关的模块加载指令。
操作命令:
grep -i "efi" /boot/grub/grub.cfg
结果分析:
- 如果找到
load_video后跟insmod efi_gop或insmod efifb:表明系统使用 EFI 图形接口,即 UEFI 模式。 - 如果没有这些行:可能是 Legacy 模式。
注意:此方法依赖于 GRUB 的配置是否正确生成,不如直接检查文件系统可靠。
总结与建议
| 方法 | 命令 | 可靠性 | 说明 |
|---|---|---|---|
检查 /sys/firmware/efi |
ls -d /sys/firmware/efi |
⭐⭐⭐⭐⭐ | 最权威、最简单、无需额外工具 |
mokutil --sb-state |
mokutil --sb-state |
⭐⭐⭐⭐ | 需安装 mokutil,适用于有 Secure Boot 需求的场景 |
dmesg 日志 |
dmesg | grep -i efi |
⭐⭐⭐ | 需要解析日志,稍显复杂 |
| GRUB 配置检查 | grep -i "efi" /boot/grub/grub.cfg |
⭐⭐ | 依赖配置完整性,不够通用 |
最终结论:
请优先使用 方法一:
if [ -d /sys/firmware/efi ]; then
echo "System is running in UEFI mode."
else
echo "System is running in Legacy (BIOS) mode."
fi
此方法简洁、准确,且适用于所有基于 Linux 的系统,包括 Ubuntu 22.04。
云技术博客