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习惯。
二、方法流程:六类命令的使用顺序
在脚本中,这六类命令通常按“先定位、再准备、后诊断”的顺序使用。第一步用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%等判断命令执行结果,而不是假设命令一定成功。尤其在驱动加载和文件复制场景中,失败处理是脚本健壮性的关键。