构建系统说明
本文档系统说明 TGOSKits 当前的 cargo xtask 构建入口,覆盖以下内容:
- 总体架构与调用链路
- 根命令总表(test / clippy / board / arceos / starry / axvisor)
- Snapshot 快照机制
--arch/--target映射关系- Build Info 生成与加载
- 常用命令速查
- 命令入口选择建议
1. 总体架构
1.1 调用链路
整个构建系统从用户在终端输入 cargo xtask(或其别名)开始,经过多层委托和解析,最终由 ostool 库完成实际的编译、镜像生成或模拟器启动。下图展示了从 CLI 输入到最终执行的完整调用路径,以及各层之间的职责划分。
cargo xtask / cargo arceos / cargo starry / cargo axvisor / cargo board
│
▼ (.cargo/config.toml aliases)
cargo run -p tg-xtask -- <args>
│
▼ (xtask/src/main.rs → tokio::main)
axbuild::run()
│
▼ (scripts/axbuild/src/lib.rs → Cli::parse)
┌─────────────────────────────────────────────────┐
│ Commands::Test → test_std::run_std_test │
│ Commands::Clippy → clippy::run_workspace_... │
│ Commands::Board → board::execute │
│ Commands::ArceOS → ArceOS::new()?.execute() │
│ Commands::Starry → Starry::new()?.execute() │
│ Commands::Axvisor → Axvisor::new()?.execute() │
└─────────────────────────────────────────────────┘
│
▼ (各子系统内部)
command_flow::resolve_request() → 解析 arch/target/snapshot → 生成 ResolvedXxxRequest
command_flow::run_build/qemu/uboot() → 加载 Cargo config → 调用 ostool Tool API
1.2 根目录别名(.cargo/config.toml)
为了提升日常使用效率,仓库在 .cargo/config.toml 中定义了一组命令别名,使得用户可以用更简短的命令触发完整的构建流程。下表列出了所有可用别名及其对应的实际 cargo 命令展开形式。
| 别名命令 | 实际展开 |
|---|---|
cargo xtask ... | cargo run -p tg-xtask -- ... |
cargo arceos ... | cargo run -p tg-xtask -- arceos ... |
cargo starry ... | cargo run -p tg-xtask -- starry ... |
cargo axvisor ... | cargo run -p tg-xtask -- axvisor ... |
cargo board ... | cargo run -p tg-xtask -- board ... |
等价关系:cargo xtask arceos qemu ≡ cargo arceos qemu,以此类推。
1.3 源码模块映射
构建系统的实现分布在 xtask/ 和 scripts/axbuild/ 两个目录中,按职责划分为多个独立模块。下表梳理了每个源码模块的文件路径和核心职责,便于在需要定位或修改特定功能时快速找到对应代码。
| 层级 | 路径 | 职责 |
|---|---|---|
| 入口 | xtask/src/main.rs | Tokio async main,委托 axbuild::run() |
| CLI 定义 + 分发 | scripts/axbuild/src/lib.rs | Cli / Commands enum,match 分发 |
| ArceOS 子系统 | scripts/axbuild/src/arceos/mod.rs | build / qemu / test / uboot |
| StarryOS 子系统 | scripts/axbuild/src/starry/mod.rs | build / qemu / test / rootfs / uboot |
| Axvisor 子系统 | scripts/axbuild/src/axvisor/mod.rs | build / qemu / board / test / image / defconfig / config |
| 公共流程 | scripts/axbuild/src/command_flow.rs | snapshot 持久化策略、build/qemu/uboot 统一执行 |
| 上下文与类型 | scripts/axbuild/src/context/ | arch/target 映射、snapshot 文 件、请求类型定义 |
| 下载工具 | scripts/axbuild/src/download.rs | HTTP 客户端、带进度条的文件下载 |
| Std 测试 | scripts/axbuild/src/test_std.rs | CSV 白名单读取、cargo test -p 执行 |
| Clippy | scripts/axbuild/src/clippy.rs | workspace 包+feature 组合枚举与检查 |
| QEMU 测试框架 | scripts/axbuild/src/test_qemu.rs | 测试包列表、目标解析、shell 自动化配置 |
| 板卡管理(公共) | scripts/axbuild/src/board.rs | ls / connect / config(通过 ostool-server) |
2. 根命令总表
cargo xtask 下所有命令都是平级的顶层入口,通过 .cargo/config.toml 别名均可直接以 cargo <cmd> 形式调用。本章按命令类别分组,逐一说明每个命令的功能、参数和执行流程。
2.1 cargo xtask test — Host Std 测试
该命令用于在宿主机上运行 workspace 中白名单所列包的标准库测试,是验证核心组件(如 ax-feat、axhal 等)是否正确编译和通过单元测试的统一入口。它不涉及 QEMU 模拟器或交叉编译,完全在开发机原生环境中执行。
功能:对 workspace 中白名单内的包逐个执 行 cargo test -p <package>。
执行流程:
test_std::run_std_test_command()
├── MetadataCommand::new().no_deps().exec() ← 加载 cargo metadata
├── 读取 scripts/test/std_crates.csv ← 解析白名单(header: "package")
│ └── 校验每个 package 名是否在 workspace_members 中
└── 对每个 package 执行:
cargo test -p <package> ← 在 workspace_root 下执行
白名单文件格式 (scripts/test/std_crates.csv):
package
ax-feat
axhal
starry-process
...
要点:
- 纯 host 测试,不涉及 QEMU 或交叉编译
- 重复 package 名或未知 package 名会报错退出
- 全部通过输出
all std tests passed,否则列出失败包并返回错误
2.2 cargo xtask clippy — Workspace 静态检查
该命令对 workspace 中每个包执行 Rust lint 静态分析,覆盖所有命名 feature 的独立组合以及 docs.rs 中声明的目标平台。它是保障代码质量的基础设施,任何 clippy 警告都会被视为错误(-D warnings),确保合并到主分支的代码符合项目的 lint 规范。
功能:枚举 workspace 中每个包的 base + 每个 named feature,对所有 (package, feature, target) 组合执行 cargo clippy -D warnings。
执行流程:
clippy::run_workspace_clippy_command()
├── MetadataCommand::new().no_deps().exec()
├── workspace_packages() ← 过滤 workspace_members
├── expand_clippy_checks() ← 展开 ClippyCheck 列表
│ 对每个 package:
│ ├── 读取 docs.rs metadata → targets(可选)
│ ├── 生成 Base check: clippy -p <pkg> [-D warnings]
│ └── 对每个非 default feature:
│ 生成 Feature check: clippy -p <pkg> --no-default-features --features <feat> [-D warnings]
└── 逐条执行:
cargo <clippy_args> ← 失败立即 bail!("clippy failed for ...")
ClippyCheck 展开规则:
- 如果
Cargo.toml的[metadata.docs.rs]中定义了targets,则对每个 target 额外加--target <target> - 否则使用
target = None(单次检查) - feature 名为
"default"的条目被跳过
2.3 cargo xtask board — 远程开发板管理(公共入口)
该命令提供了与远程 ostool-server 交互的能力,用于发现实验室中可用的物理开发板、分配指定类型的板卡并建立串口连接。它是一个独立于各操作系统的公共工具入口,适用于需要在实际硬件上验证的场景。
功能:通过 ostool-server 进行远程物理板卡的发现、分配和串口连接。
子命令:
| 子命令 | 参数 | 说明 |
|---|---|---|
ls | --server, --port | 列出远端服务器上可用的板卡类型 |
connect | -b <type>, --server, --port | 分配指定类型的板卡并连接串口终端 |
config | (无) | 编辑全局板卡服务器配置 |
执行流程(以 ls 为例):
board::execute(Command::Ls(server))
├── board::load_board_global_config_with_notice() ← 加载全局 ostool board 配置
├── global_config.resolve_server(server, port) ← 解析 server:port(支持默认值)
└── board::fetch_board_types(&server, port) ← HTTP 调用 ostool-server API
└── board::render_board_table(&boards) ← 格式化输出表格
注意:这是顶层公共的 board 命令,与 Axvisor 的 axvisor board 子命令不同。后者是构建+部署到远端板卡。
2.4 ArceOS 命令一览
ArceOS 子系统提供了从构建、运行到测试的完整命令集,覆盖了 QEMU 模拟器和 U-Boot 真机两种执行环境。下表列出了所有可用的子命令及其用途说明。
cargo xtask arceos <subcommand>
| 子命令 | 说明 |
|---|---|
build [...args] | 构建 ArceOS 应用 |
qemu [...args] | 构建并在 QEMU 中运行 |
test qemu [...args] | 运行 ArceOS QEMU 测试套件(Rust + C) |
test uboot | 预留入口,当前未实现(直接报 unsupported) |
uboot [...args] | 构建并通过 U-Boot 运行 |
2.5 ArceOS 通用参数
ArceOS 的各子命令共享一组通用参数,用于控制构建目标、运行时配置和平台行为。这些参数的值可以来自命令行显式输入、上次命令保存的快照,或系统默认值。下表详细说明了每个参数的含义及其默认值来源。
| 参数 | 短选项 | 说明 | 默认值来源 |
|---|---|---|---|
--package <pkg> | -p | 指定应用包名 | snapshot (.arceos.toml) |
--arch <arch> | 架构别名 | snapshot → DEFAULT_ARCEOS_ARCH (= aarch64) | |
--target <tgt> | -t | 完整 target triple | snapshot → 由 arch 推导 |
--config <path> | -c | 显式 build info 路径 | 自动推导 |
--plat-dyn | 启用动态平台链接 | snapshot / target 默认值 | |
--qemu-config <path> | (仅 qemu)覆盖 QEMU 配置 | snapshot | |
--uboot-config <path> | (仅 uboot)覆盖 U-Boot 配置 | snapshot |
2.6 arceos build — 执行流程
build 命令是 ArceOS 构建流程的核心入口。它首先解析命令行参数和快照信息,确定目标架构、包名和构建配置,然后根据需要自动准备运行时资源(如文件系统镜像),最终调用 ostool 执行实际的 Cargo 编译。下图展示了完整的执行流程。
ArceOS::build(args)
├── prepare_request(cli, None, None, Store) ← 解析请求 + 存储 snapshot
│ ├── ArceosCommandSnapshot::load(".arceos.toml") ← 加载上次命令快照
│ ├── resolve_arceos_arch_and_target(arch, target) ← arch↔target 双向推导
│ ├── resolve_build_info_path(package, target, config) ← 生成 build-info 路径
│ └── store snapshot → .arceos.toml ← 持久化本次参数
├── ensure_package_runtime_assets(&package) ← 准备运行时资源
└── run_build_request(request)
└── command_flow::run_build()
├── load_cargo_config(&request) ← 读取 build-info → Cargo 结构
└── app.build(cargo, build_info_path)
└── tool.cargo_build(&cargo) ← 调用 ostool 执行构建
ensure_package_runtime_assets — 运行时资源准备:
- 仅
arceos-fs-shell包需要:自动生成test-suit/arceos/rust/fs/shell/disk.img(64M FAT32) - 使用
truncate -s 64M+mkfs.fat -F 32创建 - 若文件已存在则跳过
resolve_build_info_path — Build Info 路径推导:
- 若
--config显式指定 → 直接使用 - 否则查找
<package_dir>/targetinfo/<target>.toml - 再 fallback 到
<package_dir>/targetinfo/default.toml
Build Info 内容(ArceosBuildInfo):
[env] # 环境变量(如 AX_IP, AX_GW)
features = [] # Cargo features
log = "Info" # 日志级别
max_cpu_num = 4 # 最大 CPU 数(影响 SMP feature)
plat_dyn = true # 动态平台链接
2.7 arceos qemu — 执行流程
qemu 命令在 build 的基础上增加了 QEMU 模拟器启动环节。它与构建流程共享相同的参数解析和快照逻辑,额外接收一个 QEMU 配置文件路径用于自定义模拟器行为(如 CPU 类型、内存大小、设备参数等)。下图展示了从参数解析到模拟器启动的完整链路。
与 build 流程基本一致,额外携带 qemu_config:
ArceOS::qemu(args)
├── prepare_request(cli, args.qemu_config, None, Store)
├── ensure_package_runtime_assets(&package)
└── run_qemu_request(request)
└── command_flow::run_qemu()
├── load_cargo_config(&request)
├── load_qemu(request) ← QemuRunConfig
└── app.qemu(cargo, build_info_path, qemu_run_config)
└── tool.cargo_run(&cargo, QemuRunnerKind::Qemu{...})
QEMU 配置查找优先级:
- 命令行
--qemu-config <path> - snapshot 中保存的
qemu.qemu_config - (无默认值,不指定则使用 ostool 内置默认)
2.8 arceos test qemu — 测试执行流程
test qemu 命令是 ArceOS 的自动化回归测试入口。它不是简单地运行单个应用,而是 按照预定义的测试包列表,在 QEMU 中逐一执行每个测试用例(包括 Rust 测试和 C 测试),通过正则匹配输出结果来判定 pass/fail,最终汇总报告。用户可以通过 --only-rust 或 --only-c 选择只运行其中一类测试。
ArceOS::test(ArgsTest { command: TestCommand::Qemu(args) })
├── planned_qemu_test_flows(&args) ← 根据 --only-rust/--only-c 决定
│ 默认: [Rust, C] ← 两者都跑
│ --only-rust: [Rust]
│ --only-c: [C]
│
├── [Rust flow] → test_rust_qemu(args):
│ ├── parse_arceos_test_target(&args.target) ← 解析 arch + target
│ └── 对 ARCEOS_TEST_PACKAGES 中的 15 个包逐一执行:
│ ├── ensure_package_runtime_assets(package)
│ ├── resolve_test_qemu_config(package, target)
│ │ └── 查找 <package_dir>/qemu-{arch}.toml
│ ├── prepare_request(..., SnapshotPersistence::Discard) ← 不存 snapshot
│ └── run_qemu_request(request)
│ └── 匹配 success/fail 正则判断结果
│
└── [C flow] → test_c_qemu(args):
├── discover_c_tests("test-suit/arceos/c/") ← 发现 C 测试目录
│ 预定义列表:
│ helloworld, memtest, httpclient,
│ pthread/{basic,parallel,pipe,sleep}
├── prepare_c_test_cargo_config(...) ← 生成临时 .cargo/config.toml
└── 对每个 C 测试:
├── 编译(通过生成的 cargo config)
└── 在 QEMU 中运行 + 结果匹配
Rust 测试包列表(ARCEOS_TEST_PACKAGES,共 15 个):
arceos-memtest, arceos-exception, arceos-affinity,
arceos-net-echoserver, arceos-net-httpclient, arceos-net-httpserver,
arceos-irq, arceos-parallel, arceos-priority,
arceos-fs-shell, arceos-sleep, arceos-tls,
arceos-net-udpserver, arceos-wait-queue, arceos-yield
C 测试列表(C_TEST_NAMES,共 7 个):
helloworld, memtest, httpclient,
pthread/basic, pthread/parallel, pthread/pipe, pthread/sleep
支持的测试目标:
| Arch | Target Triple |
|---|---|
x86_64 | x86_64-unknown-none |
aarch64 | aarch64-unknown-none-softfloat |
riscv64 | riscv64gc-unknown-none-elf |
loongarch64 | loongarch64-unknown-none-softfloat |
测试结果判定:每个包的 QEMU 输出通过正则匹配判断 pass/fail,最终汇总报告。
2.9 arceos uboot — 执行流程
uboot 命令用于将 ArceOS 应用通过 U-Boot 引导加载器部署到真实硬件上运行。它在构建流程的基础上,将执行后端从 QEMU 模拟器切换为 ostool 的 U-Boot runner,适用于需要在物理开发板上验证的场景。
与 qemu 类似,但使用 command_flow::run_uboot() 调用 ostool 的 U-Boot runner:
ArceOS::uboot(args)
├── prepare_request(cli, None, args.uboot_config, Store)
├── ensure_package_runtime_assets(&package)
└── run_uboot_request(request)
└── tool.cargo_run(&cargo, CargoRunnerKind::Uboot { uboot_config })
2.10 StarryOS 命令一览
StarryOS 子系统在 ArceOS 的基础上增加了 rootfs 镜像管理能力,因为 StarryOS 作为完整操作系统需要文件系统镜像才能正常运行。下表列出了所有可用的子命令,其中 rootfs 是 StarryOS 特有的独立命令。
cargo xtask starry <subcommand>
| 子命令 | 说明 |
|---|---|
build [...args] | 构建 StarryOS |
qemu [...args] | 构建并在 QEMU 中运行 |
rootfs [--arch <arch>] | 下载并准备 rootfs 镜像到 target 目录 |
test qemu [...args] | 运行 StarryOS QEMU 测试 |
test uboot | 预留入口,未实现 |
uboot [...args] | 构建并通过 U-Boot 运行 |
2.11 StarryOS 通用参数
StarryOS 的参数体系与 ArceOS 基本一致,但不支持 --package(因为 StarryOS 始终构建固定的 starryos 包)。下表列出了所有可用参数及其默认值来源。
| 参数 | 说明 | 默认值 |
|---|---|---|
--arch <arch> | 架构别名 | DEFAULT_STARRY_ARCH (= riscv64) |
--target <tgt> | 完整 target triple | 由 arch 推导 |
--config <path> | build info 路径 | 自动推导 |
--qemu-config <path> | (仅 qemu)QEMU 配置覆盖 | 无 |
--uboot-config <path> | (仅 uboot)U-Boot 配置覆盖 | 无 |
2.12 starry build / qemu / uboot — 执行流程
StarryOS 的构建和运行流程与 ArceOS 结构相似,但有三个关键差异:始终构建固定的 starryos 包、使用独立的 .starry.toml 快照文件、以及在 QEMU 运行时自动确保 rootfs 镜像可用。下图展示了 qemu 命令的完整执行路径,其中 rootfs 准备是 StarryOS 特有的步骤。
与 ArceOS 结构类似,核心差异:
- 固定包名:StarryOS 始终构建
starryos包(STARRY_PACKAGE) - Snapshot 文件:
.starry.toml(而非.arceos.toml) - qemu 额外步骤:自动确保 rootfs 镜像存在(见下文 4.5 节)
Starry::qemu(args)
├── prepare_request((&args.build).into(), ...)
├── default_qemu_args(workspace_root, &request) ← ★ 自动准备 rootfs
│ └── ensure_rootfs_in_target_dir(...) ← 下载/解压 rootfs(见 4.5)
│ └── qemu_args_for_disk_image(disk_img) ← 生成 virtio-blk/net QEMU 参数
└── run_qemu_request_with_args(request, qemu_args)
default QEMU 参数(附加到 QEMU 命令行):
-device virtio-blk-pci,drive=disk0
-drive id=disk0,if=none,format=raw,file=<rootfs.img>
-device virtio-net-pci,netdev=net0
-netdev user,id=net0
2.13 starry rootfs — Rootfs 下载流程
rootfs 是 StarryOS 特有的独立命令,负责从远程服务器下载预构建的文件系统镜像到本地 target/ 目录。该命令也可以被 qemu 和 test qemu 自动触发——当检测到本地缺少对应架构的 rootfs 时,会在运行前自动执行下载。下图展示了完整的下载和解压流程。
这是独立命令,也可被 qemu / test qemu 自动触发。
Starry::rootfs(args)
├── arch = args.arch.unwrap_or(DEFAULT_STARRY_ARCH) ← 默认 aarch64
├── target = starry_target_for_arch_checked(&arch) ← arch → target 映射
└── ensure_rootfs_in_target_dir(workspace_root, &arch, &target)
ensure_rootfs_in_target_dir 详细流程:
ensure_rootfs_in_target_dir(workspace_root, arch, target)
├── target_dir = workspace_root/target/<target>/ ← 如 target/aarch64-unknown-none-softfloat/
├── rootfs_name = "rootfs-{arch}.img" ← 如 rootfs-aarch64.img
├── rootfs_xz = "{target_dir}/{rootfs_name}.xz"
│
├── if rootfs_img 已存在 → 直接返回路径
│
└── else (需要下载):
url = "https://github.com/Starry-OS/rootfs/releases/download/20260214/{rootfs_name}.xz"
├── download_with_progress(url, &rootfs_xz) ← HTTP 下载(带进度条)
│ └── download_to_path_with_progress(client, url, output_path)
│ ├── reqwest::Client (connect_timeout=30s, total_timeout=30min)
│ └── indicatif ProgressBar 显示下载进度
└── decompress_xz_file(&rootfs_xz, &rootfs_img) ← xz2 解压
└── XzDecoder → 逐块写入 img 文件
下载源信息:
| 项目 | 值 |
|---|---|
| Base URL | https://github.com/Starry-OS/rootfs/releases/download/20260214 |
| 文件格式 | {rootfs-{arch}.img}.xz(xz 压缩的 raw disk image) |
| 存放位置 | {workspace}/target/{target}/rootfs-{arch}.img |
| 支持架构 | x86_64, aarch64, riscv64, loongarch64 |
2.14 starry test qemu — 测试执行流程
StarryOS 的 QEMU 测试直接构建 starryos,并从 test-suit/starryos/normal/<case>/qemu-<arch>.toml 或 test-suit/starryos/stress/<case>/qemu-<arch>.toml 发现测例。批量模式会扫描当前组下所有一级子目录,只执行存在 qemu-<arch>.toml 的 case;显式 -c/--test-case 则要求该目录和当前架构配置都存在,否则直接报错。${workspace} / ${workspaceFolder}、shell_init_cmd、success_regex、fail_regex、timeout 仍全部由 case 自己的 QEMU 配置文件决定。
Starry::test_qemu(args)
├── parse_test_target(&args.target) ← 解析 arch + target
├── choose test group ← 默认 normal, --stress 切到 stress
├── discover_qemu_cases(arch, args.test_case, group) ← 在当前组发现/筛选 case
├── write_default_qemu_defconfig_for_target(target)
├── prepare_request(test_build_args(arch), ...) ← package 固定是 starryos
├── ensure_rootfs_in_target_dir(...) ← 确保共享 rootfs 存在
├── load_cargo_config(request) ← 准备基础 Cargo 配置
├── for case in cases
│ ├── copy shared rootfs to per-case rootfs
│ ├── optional case `c/`
│ │ ├── extract staging rootfs
│ │ ├── optional `c/prebuild.sh`
│ │ ├── cmake --build
│ │ ├── cmake --install → overlay
│ │ └── inject overlay back into per-case rootfs
│ └── app.qemu(cargo, request.build_info_path, case.qemu_config_path)
│ └── ostool 直接读取 case qemu 配置并运行
└── finalize_qemu_case_run(...) ← 总是打印成功/失败/耗时汇总
test qemu 特有参数:
| 参数 | 说明 |
|---|---|
-t, --target <arch> | 目标架构(必填) |
-c, --test-case <case> | 只运行指定测例;不传则运行该架构下全部匹配测例,缺少当前架构配置的目录在批量模式下会被跳过 |
--stress | 切换到 stress 组;默认运行 normal 组 |
关键设计:测试把运行判据完全下沉到分组测例目录,并直接透传 case qemu-<arch>.toml 给 ostool;如果 case 提供 c/,则由 axbuild 统一负责 prebuild.sh、CMake 构建、install overlay 与 rootfs 回写,而不是在 axbuild 内对具体 case 名做构建特判。
2.15 starry test board — 远程板测执行流程
StarryOS 的远程板测同样从 test-suit/starryos/normal/<case>/ 发现测例,但只扫描 board-<name>.toml。每个 board-<name>.toml 只保存板测运行配置,构建配置并不复制到 test-suit,而是固定映射到 os/StarryOS/configs/board/<name>.toml。当前首个预置 group 是 smoke-orangepi-5-plus。
Starry::test_board(args)
├── ensure_board_test_args(args) ← 显式 config 必须配合 --test-group
├── discover_board_test_groups(args.test_group) ← 扫描 normal/*/board-*.toml
│ └── group 名 = <case>-<board>
│ └── build config = os/StarryOS/configs/board/<board>.toml
├── for group in groups
│ ├── prepare_request(config=group.build_config_path, target=group.target, ...)
│ ├── load_board_config(group.board_test_config_path)
│ └── app.board(cargo, build_info_path, board_config, RunBoardOptions { ... })
└── finalize_board_test_run(...) ← 按 group 汇总结果
test board 特有参数:
| 参数 | 说明 |
|---|---|
-t, --test-group <group> | 只运行指定板测组;不传则运行全部已发现组 |
--board-test-config <path> | 覆盖 group 自带的 board run config;要求同时传 --test-group |
-b, --board-type <type> | 覆盖 board 类型 |
--server <host> | 覆盖 ostool-server 地址 |
--port <num> | 覆盖 ostool-server 端口 |
关键设计:Starry 的板测把运行判据放在 test-suit/starryos,但继续复用 os/StarryOS/configs/board/*.toml 作为唯一的 build config 来源,这样 board-* 和 qemu-* 在 test-suit 中只负责“怎么测”,不负责“怎么构建”。
2.16 Axvisor 命令一览
Axvisor 是三个子系统中命令最丰富的,因为它不仅需要管理 hypervisor 自身的构建和运行,还需要处理 Guest 镜像管理、板级配置生成、远程板卡部署等额外职责。下表列出了所有可用的子命令。
cargo xtask axvisor <subcommand>
| 子命令 | 说明 |
|---|---|
build [...args] | 构建 Axvisor hypervisor |
qemu [...args] | 构建并在 QEMU 中运行 Axvisor |
board [...args] | 构建并部署到远程开发板运行 |
test qemu [...args] | 运行 Axvisor QEMU 测试 |
test uboot -b <board> [...] | 运行 Axvisor U-Boot 板测 |
test board -t <group> [...] | 运行 Axvisor 远程板卡测试组 |
uboot [...args] | 构建并通过 U-Boot 运行 |
defconfig <board> | 生成指定板级的默认配置 |
config ls | 列出所有可用板级配置名 |
image ls [--verbose] [pattern] | 列出可用 Guest 镜像 |
image pull <image> [--output-dir dir] [--no-extract] | 下载并解压 Guest 镜像 |
2.17 Axvisor 通用参数
Axvisor 在通用参数基础上增加了 --vmconfigs(VM 配置文件列表)和板卡相关参数(--board-type、--server、--port),以支持 hypervisor 管理多个虚拟机的场景。下表列出了所有参数及其默认值。
| 参数 | 说明 | 默认值 |
|---|---|---|
--arch <arch> | 架构别名 | DEFAULT_AXVISOR_ARCH (= aarch64) |
--target <tgt> | 完整 target triple | 由 arch 推导 |
--config <path> | board/build config 路径 | 自动推导 |
--plat-dyn | 动态平台链接 | target 默认值 |
--vmconfigs <path...> | VM 配置文件列表(可多个) | 空 |
--qemu-config <path> | (仅 qemu)QEMU 配置模板 | 自动推导 |
--uboot-config <path> | (仅 uboot)U-Boot 配置 | 无 |
--board-config <path> | (仅 board)板级运行配置 | 无 |
--board-type / -b <type> | (仅 board/test)板卡类型 | 无 |
--server <host> | (仅 board/test)ostool-server 地址 | 全局配置 |
--port <num> | (仅 board/test)ostool-server 端口 | 全局配置 |
2.18 axvisor build — 执行流程
build 命令负责编译 Axvisor hypervisor 二进制。与 ArceOS 不同,Axvisor 的构建配置来自板级配置文件(包含环境变量、feature 列表和 VM 配置列表),且需要通过 AxvisorContext 定位 axvisor 子包目录。下图展示了完整的构建请求解析和执行过程。
Axvisor::build(args)
├── prepare_request((&args).into(), None, None, Store)
│ ├── AxvisorContext::new() ← 初始化(定位 axvisor 目录)
│ ├── AxvisorCommandSnapshot::load(".axvisor.toml") ← 加载快照
│ ├── resolve_axvisor_arch_and_target(arch, target)
│ ├── resolve_build_info_path(axvisor_dir, target, config)
│ │ 优先: --config → os/axvisor/.build.toml → os/axvisor/targetinfo/{target}.toml
│ └── store snapshot → .axvisor.toml
│
└── run_build_request(request)
└── load_cargo_config(&request) ← 读取 AxvisorBoardConfig
├── env, features, log, max_cpu_num, plat_dyn
└── vm_configs (从 board config 合入)
Build Config 来源(优先级从高到低):
--config <path>显式指定os/axvisor/.build.toml(defconfig 生成或手动编辑)os/axvisor/targetinfo/{target}.toml(per-target 默认)
AxvisorBoardConfig 结构:
[arceos] # 复用 ArceosBuildInfo
env = { AX_IP = "..." }
features = ["fs", "rk3568-clk"]
log = "Info"
plat_dyn = true
max_cpu_num = 4
vm_configs = ["configs/vms/linux-aarch64-qemu-smp1.toml"] # VM 配置列表