4. UEFI Shell常用命令

在UEFI Shell脚本开发中,命令是脚本的“词汇”。没有对常用命令的准确掌握,脚本就只能停留在简单回显层面。本节围绕六类高频命令展开:文件操作、设备映射、驱动加载、内存查看、变量操作与系统信息查询。它们分别对应脚本开发中的资源定位、环境准备、状态诊断与信息采集四类任务,是后续自动化脚本的基础工具箱。

一、核心原理:Shell命令是固件服务的“命令行外壳”

UEFI Shell本身是一个运行在UEFI环境下的应用程序,它通过调用UEFI Boot Services、Runtime Services以及Protocol接口完成操作。Shell命令并不是操作系统命令,而是对固件能力的封装。例如,fs0: 代表一个已挂载的文件系统映射,map 展示的是设备路径到文件系统句柄的映射关系,load 则调用LoadImage与StartImage服务加载驱动。

理解这一点非常关键:Shell中的“盘符”不是物理磁盘,而是设备路径的别名;Shell中的“变量”不是普通环境变量,而是UEFI运行时变量,具有属性、GUID和持久化特征。脚本开发时,必须按固件语义使用命令,而不能套用Linux或Windows习惯。

UEFI Shell 六类常用命令与固件服务关系图 UEFI Shell 命令行接口 脚本通过命令调用固件能力,命令输出可被解析、判断与记录 文件操作 ls / cd / cp / rm 设备映射 map / mount / fs0: 驱动加载 load / unload / drivers 内存查看 memmap / dmem / mm 变量操作 set / setvar / dmpstore 系统信息 ver / smbiosview Shell 命令层:解析参数、调用协议、格式化输出 脚本可对输出做字符串匹配、条件判断与日志记录 UEFI 固件服务与协议 Simple File System / Loaded Image / Runtime Services / Boot Services / SMBIOS 硬件与平台:磁盘、PCI设备、内存、NVRAM、固件版本 命令输出最终反映平台真实状态,是脚本判断的依据

二、方法流程:六类命令的使用顺序

在脚本中,这六类命令通常按“先定位、再准备、后诊断”的顺序使用。第一步用map确认设备映射,找到可用的fs0:或fs1:;第二步用ls、cd进入目标目录,确认脚本和驱动文件存在;第三步用load加载必要驱动;第四步用memmap、dmpstore、ver等采集环境信息;最后用set或setvar写入运行时变量,供后续阶段使用。

# 典型脚本片段:定位设备并加载驱动
map -r
fs0:
ls fs0:\efi\boot
load fs0:\drivers\network.efi
drivers
memmap | more
ver
set -v my_flag 1

注意map -r会重新扫描并刷新映射,适合在热插拔或设备状态变化后使用。load加载驱动后,建议用drivers确认驱动是否已绑定到设备。若驱动加载失败,应检查驱动文件路径、依赖协议以及固件安全策略。

三、案例场景:用命令组合完成一次环境巡检

假设需要编写一个启动前巡检脚本,检查文件系统、驱动、内存和固件版本。可以按以下方式组合命令:

@echo -off
map -r
if exist fs0:\efi\tools\inspect.efi then
  echo Found inspect tool
  fs0:
  load fs0:\efi\tools\inspect.efi
else
  echo Missing inspect tool
endif
memmap > fs0:\log\memmap.txt
dmpstore -all > fs0:\log\vars.txt
ver > fs0:\log\version.txt

这个案例体现了Shell脚本的核心思路:命令负责采集,脚本负责判断与记录。输出重定向>可以把命令结果写入文件,便于后续分析。对于变量操作,set用于查看或设置Shell环境变量,setvar用于操作UEFI运行时变量,两者语义不同,不能混用。

四、常用命令速查清单

类别 常用命令 典型用途 脚本注意点
文件操作 ls、cd、cp、rm、mkdir、type 浏览目录、复制脚本、查看文本 路径需带fs0:前缀,注意大小写与反斜杠
设备映射 map、mount、fs0:、blk0: 查看设备路径与文件系统映射 设备变化后先执行map -r
驱动加载 load、unload、drivers、devices 加载EFI驱动、查看驱动绑定 加载后确认驱动状态,失败时检查依赖
内存查看 memmap、dmem、mm、mem 查看内存映射、读写内存 写内存需谨慎,避免破坏固件运行区
变量操作 set、setvar、dmpstore 设置Shell变量、读写UEFI变量 区分Shell变量与运行时变量,注意属性
系统信息 ver、smbiosview、date、time 查询固件版本、SMBIOS信息、时间 输出可用于日志与兼容性判断

五、误区与复盘

常见误区一:把Shell盘符当物理磁盘。 fs0:只是当前映射结果,换一台机器或重新插拔后可能变化。脚本中应先用map确认,再使用盘符,必要时通过设备路径匹配目标设备。

常见误区二:混淆set与setvar。 set操作的是Shell进程内的环境变量,退出Shell即失效;setvar操作的是UEFI运行时变量,可持久化到NVRAM,但受属性与权限限制。

常见误区三:忽略命令返回值。 脚本中应使用if exist、if %lasterror%等判断命令执行结果,而不是假设命令一定成功。尤其在驱动加载和文件复制场景中,失败处理是脚本健壮性的关键。