U-Boot 命令行与常用命令
本章将系统学习 U-Boot 命令行:查找命令、阅读帮助、编辑环境变量、检查返回值,并用 Hush Shell 编写最小脚本。掌握这些基础后,你才能可靠地操作内存、存储设备和 Linux 启动流程。
本教程以 Mainline U-Boot v2026.07、
qemu_arm64_defconfig和 QEMU ARM64virt为基准。除特别标注外,本章命令都在=>后执行,代码块中的[U-Boot]不是命令的一部分。
学习目标
阅读本章后,你将能够:
- 看懂命令帮助中的参数表示,并用
help、补全和行编辑提高效率 - 使用常见的只读查询命令了解当前系统
- 查看、创建、引用和删除环境变量,并区分默认 / 当前 / 持久化环境
- 用
$?、;、&&、||和run控制命令执行流程 - 使用 Hush Shell 编写简单的判断与循环
- 识别写入、擦除或跳转类命令的风险
前置知识
请先完成运行 U-Boot的验收,确保能稳定进入 =>。Host Shell、U-Boot Console 与 QEMU Monitor 的区分见上一章,本章不再展开。
1. 进入实验环境
在 Host Shell 中运行上一章创建的脚本:
# [Host]
"$HOME/uboot-lab/scripts/run-uboot.sh"
在自动启动倒计时结束前按空格键,确认提示符为 => 后再开始实验。若误入 (qemu),按 Ctrl+A,松开后再按 c 切 回 U-Boot Console。
2. U-Boot 命令行是什么
U-Boot 命令行是 Bootloader 提供的交互界面。你可以通过它:
- 查看 CPU、内存和设备信息
- 检查或修改环境变量
- 初始化存储和网络设备
- 把文件加载到内存
- 检查或修改内存
- 执行启动脚本
- 启动 Linux、EFI Application 或其他 Payload
- 排查启动故障
它看起来像 Linux Shell,但不是 Bash,也不是 Linux 用户空间。
| 对比项 | U-Boot 命令行 | Linux Shell |
|---|---|---|
| 运行阶段 | Linux 启动前 | Linux Kernel 和用户空间启动后 |
| 常见提示符 | => | $ 或 # |
| 主要任务 | 初始化硬件、加载并启动 Payload | 文件管理、进程管理和应用运行 |
| 命令来源 | 编译进 U-Boot 的命令与 Shell Built-in | Shell Built-in 和文件系统中的程序 |
| 文件系统 | 只提供配置中启用的有限支持 | 由 Kernel 和用户空间完整管理 |
| 多任务与进程 | 通常没有进程模型 | 支持进程、线程和 Job Control |
U-Boot proper 默认可以提供命令行,而 SPL、TPL 等早期阶段通常不包含完整命令行。如果启动日志停在 SPL 阶段,不能想当然地等待 => 出现。
3. 命令从哪里来
U-Boot 不是把所有命令都编译进每一个镜像。具体有哪些命令,由以下因素共同决定:
- U-Boot 版本
- CPU Architecture
- Board 配置
- Kconfig 选项
- Driver 与 Subsystem 是否启用
- 镜像大小限制
因此,两块开发板上的 U-Boot 即使版本相同,help 输出也可能不同。判断一个命令是否可用,应以当前镜像的帮助系统和构建配置为准。
本教程的基准配置启用了 CONFIG_BOOTSTD_FULL。它会带入完整 Standard Boot 功能和 U-Boot Script Boot Method,而后者需要 Hush Parser。因此,在本章基准构建中可以使用 if、for、&& 和 || 等 Shell 结构。换用其他 defconfig 时,请以本机 .config 的检查结果为准,不要默认所有镜像都具备相同能力。
你也可以在 Host Shell 中检查实际构建配置:
# [Host]
grep -E \
'^CONFIG_(HUSH_PARSER|CMDLINE_EDITING|AUTO_COMPLETE|SYS_LONGHELP)=' \
"$HOME/uboot-lab/build/qemu-arm64/.config"
基准构建应包含:
CONFIG_HUSH_PARSER=y
CONFIG_CMDLINE_EDITING=y
CONFIG_AUTO_COMPLETE=y
CONFIG_SYS_LONGHELP=y
如果某个功能在其他开发板上不可用,应先检查配置,而不是直接判断 U-Boot 版本有问题。
4. 看懂命令语法
一条 U-Boot 命令通常由命令名、Subcommand、Option 和 Argument 组成:
command [subcommand] [options] <required-argument> [optional-argument]
例如:
env print bootdelay
可以拆分为:
| 部分 | 内容 | 作用 |
|---|---|---|
| Command | env | 环境变量管理命令 |
| Subcommand | print | 输出变量 |
| Argument | bootdelay | 要输出的变量名 |
帮助文档常使用下面的记号:
| 记号 | 含义 |
|---|---|
<name> | 必填参数;输入实际值时不要保留尖括号 |
[name] | 可选参数;不要输入方括号 |
a | b | 从多个选项中选择一个 |
name ... | 参数可以重复 |
-a、-f | Option,具体含义由当前命令定义 |
例如帮助中出现:
env print [-a | name ...]
表示可以输出全部变量,也可以给出一个或多个变量名。下面都是实际命令:
# [U-Boot]
=> env print -a
=> env print bootdelay
=> env print bootdelay bootcmd
命令名和变量名通常区分大小写。教程统一使用小写命令,并在参数之间保留至少一个空格。
5. 首先学会使用帮助
面对陌生命令时,不要先在网上复制参数,而应先查看当前 U-Boot 镜像提供的帮助。
5.1 列出所有命令
# [U-Boot]
=> help
help 会输出当前镜像中可用的命令和简短说明。列表很长,而且会随配置变化。
? 是 help 的简写:
# [U-Boot]
=> ?
5.2 查看某个命令
# [U-Boot]
=> help env
=> help bdinfo
=> help echo
典型帮助包含命令说明、Usage 和参数列表:
env - environment handling commands
Usage:
env print [-a | name ...]
env set [-f] name [value]
...
如果只看到简短 Usage,而没有详细说明,可能是构建时关闭了 CONFIG_SYS_LONGHELP。
5.3 识别常见错误
输入不存在的命令:
# [U-Boot]
=> not_a_command
Unknown command 'not_a_command' - try 'help'
输入已存在的命令但参数不正确时,U-Boot 通常会输出 Usage:
# [U-Boot]
=> env
env - environment handling commands
Usage:
env ...
两种情况的排查方向不同:
Unknown command:检查拼写、执行环境和 Kconfig- 显示 Usage:检查参数数量、顺序和格式
6. 提高输入效率
6.1 行编辑
基准配置启用了 CONFIG_CMDLINE_EDITING,可以使用:
- 左右方向键移动 Cursor
Backspace删除前一个字符- 上下方向键浏览历史输入
Ctrl+C取消当前输入,或尝试中断支持取消的命令
并非所有驱动或长时间操作都能立即响应 Ctrl+C。涉及擦除、烧录和 Fuse 的命令更不能把中断当作可靠的撤销机制。
在 -nographic 模式下,Ctrl+C 会发送给 U-Boot Guest,不是退出 QEMU。退出 QEMU 仍然使用 Ctrl+A,松开后再按 x。
6.2 Tab 补全
基准配置启用了 CONFIG_AUTO_COMPLETE。输入命令前缀后按 Tab:
# [U-Boot]
=> pri<Tab>
如果前缀唯一,U-Boot 会补全命令;如果存在多个候选,再按一次 Tab 可以显示候选列表。补全结果取决于当前镜像包含哪些命令。