运行时环境
cargo xtask <os> qemu/uboot/board 在构建基础上增加运行环节。运行过程的核心是将编译好的 OS 产物部署到目标环境(QEMU 虚拟机、U-Boot 引导或物理板卡)中执行,并收集运行输出。AppContext 封装了五个执行方法,将底层编译和运行委托给 ostool::Tool。
运行阶段与构建阶段共享同一个 AppContext 实例。当用户执行 cargo xtask <os> qemu 时,系统会先完成完整的构建流程(见 构建),然后将编译产物配置到目标运行环境中。三个运行目标(QEMU、U-Boot、Board)的差异主要体现在配置获取方式和运行时环境准备上。
执行方法
AppContext 提供五个方法覆盖构建到运行的各种组合:
| 方法 | 功能 | ostool 调用 |
|---|---|---|
build() | 纯编译 | Tool::cargo_build() |
qemu() | 编译 + QEMU 运行 | Tool::cargo_run(Qemu) |
run_qemu() | 仅 QEMU 运行(已构建) | Tool::run_qemu() |
uboot() | 编译 + U-Boot 运行 | Tool::cargo_run(Uboot) |
board() | 编译 + 板卡运行 | Tool::cargo_run_board() |
五个方法中,build() 仅编译不运行;qemu()、uboot() 和 board() 先编译再运行;run_qemu() 仅运行已编译好的产物,用于测试场景中每组构建后逐 case 运行。
QEMU 运行
QEMU 运行是三个运行目标中最复杂的,需要准备完整的虚拟机环境。流程分为四个阶段:配置获取(从显式路径或自动发现得到 QEMU 配置)、环境准备(子系统特有的 rootfs、网络、磁盘等准备)、子系统补丁(将子系统特定的运行时参数注入 QEMU 配置)、执行(通过 ostool 启动 QEMU 并等待运行完成)。
整体流程
QEMU 配置获取
- 显式指定:
--qemu-config <path>→Tool::read_qemu_config_from_path_for_cargo() - 子系统默认模板:Axvisor 使用
os/axvisor/configs/qemu/qemu-{arch}.toml,StarryOS 使用os/StarryOS/configs/qemu/qemu-{arch}.toml - ostool 自动发现:ArceOS 未指定时由 ostool 根据包名和 target 自动查找 →
Tool::ensure_qemu_config_for_cargo()
显式指定用于测试场景(每个测试用例有自己的 qemu-{arch}.toml)。Axvisor 和 StarryOS 在各自的 configs/qemu/ 目录下预置了各架构的 QEMU 配置模板,未显式指定时自动使用对应模板。ArceOS 依赖 ostool 的标准路径搜索机制。
LoongArch 特殊处理
Axvisor 的 loongarch64 target 需要带 LVZ 扩展的定制 QEMU。AppContext::scoped_qemu_path() 自动搜索:
龙芯架构的虚拟化需要 LVZ(Loongson Virtualization Extension)支持的 QEMU,而标准发行版的 QEMU 不包含此扩展。axbuild 通过 scoped_qemu_path() 自动定位 LVZ 版 QEMU,搜索优先级如下:
AXBUILD_QEMU_SYSTEM_LOONGARCH64环境变量指向的 QEMU 可执行文件所在目录AXBUILD_QEMU_DIR环境变量指向的目录$HOME/QEMU-LVZ/build和$HOME/qemu-lvz/build(默认安装路径)- workspace 根目录及其所有祖先目录下的
QEMU-LVZ/build和qemu-lvz/build
搜索时检查目录中是否存在 qemu-system-loongarch64 可执行文件。找到后通过 PathRestoreGuard 临时将该目录添加到 PATH 最前面(使用 RAII 模式确保运行完成后恢复原始 PATH)。
ArceOS 运行时资产准备
ArceOS 某些包在运行前需要额外的宿主端资产准备(ensure_package_runtime_assets):
| 包名 | 准备内容 |
|---|---|
arceos-fs-shell | 自动生成 64M FAT32 磁盘镜像 test-suit/arceos/rust/fs/shell/disk.img(通过 truncate + mkfs.fat) |
| 其他 | 无额外准备 |
资产准备在构建和运行之前执行,仅在文件不存在时触发创建,已有文件直接复用。
U-Boot 运行
编译后通过 U-Boot 运行,调用 Tool::cargo_run(Uboot)。U-Boot 配置通过 --uboot-config 指定,否则由 ostool 自动检测。
U-Boot 运行模式用于需要通过 U-Boot 引导加载器的场景(如物理板卡的网络启动)。与 QEMU 运行相比,U-Boot 运行需要额外的引导配置(TFTP 服务器地址、内核加载地址等),这些参数在 U-Boot 配置文件中定义。
板卡运行
编译后在远程板卡运行,通过 ostool-server 交互。接收 BoardRunConfig 和 RunBoardOptions(含 server、port、board_type)。
板卡运行是三个运行目标中最接近真实硬件的。ostool-server 运行在连接物理板卡的宿主机上,提供板卡分配、固件部署和串口交互的 API。axbuild 将编译产物和运行配置发送给 ostool-server,后者负责将固件刷写到板卡并收集串口输出。
板卡管理命令:
| 子命令 | 说明 |
|---|---|
cargo xtask board ls | 列出可用远程板卡类型 |
cargo xtask board connect -b <type> | 分配板卡并连接串口 |
cargo xtask board config | 编辑板卡服务器配置 |
下载基础设施
scripts/axbuild/src/support/download.rs 为 rootfs 镜像和 Axvisor guest 镜像提供统一的文件下载能力。所有网络下载都经过此模块,具备断点续传、并发锁保护和进度条显示。
HTTP 客户端
http_client() 创建一个配置了以下超时的 reqwest::Client:
| 参数 | 值 |
|---|---|
| 连接超时 | 30 秒 |
| 总超时 | 30 分钟 |
fetch_text() 用于拉取小文本资源(如 Axvisor 镜像注册表),download_file() 用于下载大文件(如 rootfs 压缩包)。