最权威的判断方式是检查/sys/firmware/efi目录是否存在:存在则为uefi启动,不存在则为legacy bios启动,因该目录由内核在uefi启动时自动创建,不可伪造且不依赖外部工具。

直接看 /sys/firmware/efi 目录是否存在
这是最权威、最轻量的判断方式,不依赖外部工具,也不受用户手动挂载干扰。内核只在真正以 UEFI 模式启动时才会创建该目录,Legacy BIOS 下它根本不会出现。
-
ls /sys/firmware/efi:如果返回类似config_table/ efivars/ runtime-map/等内容 → UEFI 启动 - 如果报错
No such file or directory→ Legacy BIOS 启动 - 脚本中可直接用:
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS - 注意:只要目录存在就足够确认 UEFI,哪怕
efivars子目录为空或权限拒绝读取,也不影响判断
efibootmgr 能运行 ≠ UEFI 启动
efibootmgr 是用户空间工具,它依赖 /sys/firmware/efi/efivars 接口通信。它的输出只能辅助验证,不能单独作为依据。
- 执行
sudo efibootmgr显示BootCurrent和带*的启动项(如Boot0001* ubuntu)→ 大概率是 UEFI - 报错
EFI variables are not supported on this system.→ 基本可判定为 Legacy BIOS - 但某些 BIOS 系统也能安装
efibootmgr,命令能运行却必然报错;别因为“命令没崩”就误判
dmesg | grep -i efi 看内核启动日志
这是启动瞬间的原始记录,不受后续操作影响,适合刚开机后快速验证。
- 看到类似
[0.000000] EFI v2.80 by AMI或efi: EFI v2.xx→ UEFI 启动 - 只看到
BIOS-e820:、BIOS-provided physical RAM map且无任何 EFI 字样 → Legacy BIOS - 注意:
dmesg缓冲区可能被刷掉,建议启动后尽快执行;若日志滚动太快,可用dmesg -T | head -30查前 30 行带时间戳的内容
别信 /boot/efi 或 GPT 分区表
这两个是常见误判来源,可靠性低,容易得出错误结论。
-
/boot/efi只是 ESP(EFI System Partition)的常见挂载点,可以被手动挂载/卸载,甚至完全不挂载;目录存在 ≠ UEFI 启动(比如有人把 ESP 挂到/mnt/efi做备份) - GPT 分区表只是 UEFI 的常见配套,但 UEFI 规范允许从 MBR 启动(虽少见);反过来,GPT 硬盘在 CSM/Legacy 模式下仍可 BIOS 启动
- 主板支持 UEFI ≠ 当前以 UEFI 模式启动——CSM 开关一开,照样走 BIOS 流程
真实启动模式只取决于当前内核加载时与固件的交互方式,/sys/firmware/efi 是否存在,就是这个交互留下的唯一不可伪造痕迹。其他方法要么是间接推断,要么依赖可被人为改动的状态。











