uefi shell(建议收藏)

什么是 UEFI Shell?初学者也能看懂的系统启动入口

你有没有想过,电脑按下电源键后,到底发生了什么?从按下按钮的那一刻起,系统就开始了一段“神秘旅程”——BIOS 会先运行,接着是 UEFI 固件,最后才轮到操作系统启动。而在这个关键的“过渡地带”,有一个非常强大的工具,叫做 UEFI Shell。

UEFI Shell 是一个运行在 UEFI 固件环境中的命令行界面。它不是操作系统,也不是应用软件,而是一个底层的调试和诊断工具。它让你可以在系统真正加载 Windows 或 Linux 之前,直接与硬件和固件交互。

你可以把它想象成一台汽车的“发动机舱检查口”——当你遇到启动问题时,正常仪表盘无法显示问题,但如果你能打开引擎盖,直接用工具检测电瓶电压、燃油压力、传感器信号,就能快速定位故障。UEFI Shell 就是这个“检查口”。

它支持执行脚本、运行可执行文件(.efi)、查看系统信息、管理启动项、调试驱动程序等。对于开发者、系统管理员、甚至硬件工程师来说,它是深入理解电脑启动机制的必经之路。

UEFI Shell 的基本使用:从进入到执行命令

要进入 UEFI Shell,通常需要在开机时按特定键(如 F2、F12、Del 等,取决于主板厂商)。进入后,你会看到一个类似终端的界面,提示符可能是 Shell>>

下面是几个常用命令的示例:

ls

dmpstore -l

注释:dmpstore -l 命令用于列出 UEFI 变量存储中的所有条目。这些变量是 UEFI 固件用来保存启动配置、安全设置等信息的“记忆库”。

bcfg boot dump

driver -l

注释:bcfg boot dump 会列出所有启动项的编号、名称和路径。例如,编号 0001 的启动项可能是 Windows Boot Manager。如果你想修改启动顺序,可以通过 bcfg boot order 来调整。

常用命令速查表

命令 功能说明
ls 列出当前目录内容
cd 切换目录(如:cd \EFI\BOOT)
pwd 显示当前工作路径
bcfg boot dump 查看所有启动项
driver -l 显示已加载的驱动
dmpstore -l 查看 UEFI 变量存储内容

这些命令是进入 UEFI Shell 后最常使用的“基础工具”。掌握它们,你就有了在系统底层“自由行走”的能力。

如何在 UEFI Shell 中运行 .efi 程序?

UEFI Shell 最强大的功能之一,就是支持直接运行 .efi 格式的可执行文件。这些文件是为 UEFI 环境编译的原生程序,不依赖操作系统。

假设你有一个名为 test.efi 的程序,它位于 U盘的根目录下。你可以这样运行它:

ls

\test.efi

注释:在 UEFI Shell 中,路径使用反斜杠 \ 作为分隔符。运行 .efi 文件时,必须确保该文件是为 UEFI 架构编译的(如 x64 或 Arm64),否则会提示“Invalid executable format”。

实际案例:编写并运行一个简单的 UEFI Shell 程序

我们来写一个最基础的 UEFI 程序,它只做一件事:打印一行“Hello from UEFI Shell!”。

使用 EDK2(Extensible Firmware Interface Development Kit)开发环境,创建一个 C 文件:

#include <Uefi.h>
#include <Library/UefiLib.h>

// 程序入口点
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  // 使用 Print 函数输出字符串
  Print(L"Hello from UEFI Shell!\n");

  // 返回成功状态
  return EFI_SUCCESS;
}

注释:UefiMain 是 UEFI 程序的入口函数,与传统 C 程序的 main 函数类似。Print 是 UEFI 提供的输出函数,参数是宽字符串(以 L 开头),表示 Unicode 字符。\n 表示换行。

编译后生成 Hello.efi,将其拷贝到 U盘根目录,插入电脑,在 UEFI Shell 中运行:

\Hello.efi

如果一切正常,屏幕上将输出:

Hello from UEFI Shell!

这个例子说明,UEFI Shell 不仅能执行系统工具,还能运行你自己的定制程序,是开发和调试固件的理想平台。

UEFI Shell 中的变量管理与启动配置

UEFI Shell 的另一个核心能力是管理 UEFI 变量。这些变量存储了系统启动、安全策略、硬件配置等关键信息。它们类似于操作系统中的注册表,但更底层。

查看与修改启动顺序

假设你想让电脑从 U盘启动,而不是硬盘,可以使用以下命令:

bcfg boot dump

bcfg boot order 0003 0001 0002

注释:bcfg boot order 命令用于设置启动顺序。参数是启动项的编号,按从左到右的顺序排列。例如,0003 0001 0002 表示优先从编号 0003 的启动项启动。

安全启动(Secure Boot)设置

Secure Boot 是 UEFI 提供的一项安全功能,防止加载未签名的驱动或操作系统。你可以通过 UEFI Shell 查看其状态:

dmpstore -l | findstr "SecureBoot"

注释:findstr 是 UEFI Shell 中的搜索命令,用于在输出中查找关键词。如果输出中包含 SecureBoot=Enabled,说明安全启动已开启。

如果你想临时禁用 Secure Boot(仅用于调试),可以修改变量:

dmpstore -s -n "SecureBoot" -v 0

注释:-s 表示设置变量,-n 指定变量名,-v 指定值。此操作需谨慎,可能影响系统安全性。

UEFI Shell 的调试价值:从开发到故障排查

UEFI Shell 不只是“工具”,更是“诊断仪”。当系统无法启动、蓝屏、或者启动项丢失时,它往往是最后的救命稻草。

例如,当你遇到“No bootable device found”错误时,UEFI Shell 可以帮你确认:

  • 是否有正确的启动文件(如 BOOTx64.EFI)存在于 EFI 系统分区;
  • 启动项是否被正确注册;
  • U盘是否被识别。

你可以通过 ls 命令检查 U盘是否挂载,通过 bcfg boot dump 查看启动项是否存在。

一个真实案例:修复 Windows 启动失败

某用户报告:电脑开机后黑屏,提示“Boot device not found”。进入 UEFI Shell 后,执行:

ls \EFI\Microsoft\Boot\

发现目录下没有 BOOTx64.EFI 文件。于是从另一台正常电脑复制该文件,放入 U盘,再执行:

copy \EFI\Microsoft\Boot\BOOTx64.EFI \EFI\BOOT\BOOTx64.EFI

重启后,系统恢复正常启动。

这个案例说明,UEFI Shell 是系统恢复的“最后一道防线”。它不依赖操作系统,不受系统崩溃影响,能直接访问硬件和固件。

总结:UEFI Shell 是通往底层的钥匙

UEFI Shell 虽然不常被普通用户接触,但对开发者、系统工程师、安全研究者来说,却是不可或缺的工具。它让你在操作系统尚未加载之前,就能与硬件和固件对话。

无论是调试启动问题、运行自定义程序,还是管理启动项与安全策略,UEFI Shell 都提供了强大而灵活的能力。它就像一台“系统急救车”,在关键时刻能帮你恢复系统。

对于编程初学者,掌握 UEFI Shell 不仅能提升对计算机启动机制的理解,还能为未来学习操作系统、嵌入式开发打下坚实基础。对于中级开发者,它更是调试固件、开发 UEFI 应用的必备技能。

别再忽视这个“藏在后台”的工具了。下次你遇到启动问题,不妨试试进入 UEFI Shell,它可能就是你解决问题的关键。