Axvisor 客户机配置架构
客户机 TOML 是 VM 需求的持久化格式。axvmconfig 定义 schema,负责反序列化和配置内校验;os/axvisor 把它转换成 AxVMConfigParams,再由 AxVM 的 boot prepare 和设备 prepare 阶段补齐运行时事实。配置只表达客户机身份、启动输入、内存和设备选择,不允许用户填写设备地址、IRQ、MSI 或 LPI 等框架资源。
平台固定资源和分配算法见 Machine 与资源规划架构,设备图之后的注册与中断路径见 设备运行时与中断架构。model 的实现、注册和资源声明见 Axvisor 模拟设备框架。
1. 代码组成与运行阶段
客户机 TOML 从读取到变成设备图要经过四个阶段:axvmconfig 负责解析和校验,Axvisor 应用层完成参数转换,boot prepare 补齐启动资源,device prepare 把虚拟设备请求实例化为图节点。下表列出各阶段的代码位置与职责;修改配置行为时应先确定改动属于哪个阶 段,再定位对应的模块。
| 位置 | 主要类型或入口 | 职责 | 运行阶段 |
|---|---|---|---|
virtualization/axvmconfig/src/lib.rs | GuestConfig、VMBaseConfig、VMKernelConfig、GuestDevices、VirtualDeviceRequest | 定义持久化 schema,完成 Serde 解析、boot/device 校验和兼容字段读取 | 配置读取 |
virtualization/axvmconfig/src/error.rs | AxVmConfigError | 区分 TOML 形状错误、启动组合错误和设备选择错误 | 配置读取与校验 |
os/axvisor/src/config.rs:183 | build_axvm_config | 把配置字段转换为 AxVM 参数,注入应用拥有的串口后端,并在默认 catalog 上注册 virtio-blk、virtio-net | 应用层转换 |
virtualization/axvm/src/config.rs:115 | AxVMConfigParams、AxVMConfig | 承接 CPU、镜像、地址空间策略、内存、物理设备 selector、虚拟设备请求和 catalog | VM 创建前 |
virtualization/axvm/src/boot/prepared.rs:45 | prepare_guest_boot、PreparedGuestBoot | 按架构处理 DTB、固件和启动资源,返回准备后的 GuestConfig 与客户机 DTB | boot prepare |
os/axvisor/src/config.rs:132-134 | sync_axvm_config_from_crate_config、set_boot_policy | 把准备阶段新增的内存区域同步到 draft AxVMConfig,并设置 boot policy | 应用层同步 |
virtualization/axvm/src/configured.rs:184 | ConfiguredDeviceCatalog、instantiate_node | 按 model 查找构造器,把 VirtualDeviceRequest 的 model/options 转成 DeviceNodeSpec | device prepare |
virtualization/axvm/src/configured/append.rs:13 | append_configured_devices | 合并默认串口请求和用户请求,逐项调用 catalog,加入待规划设备图 | device prepare |
scripts/axbuild/src/axvisor/mod.rs:320 | jkconfig::run::<GuestConfig> | 通过 schemars::JsonSchema 生成 menuconfig 所需 schema 并编辑 TOML | 构建工具运行期 |
axvmconfig 不依赖具体 Machine,也不分配硬件资源。ConfiguredDeviceCatalog 是请求进入设备图的转换点;catalog 的内置 model 和应用扩展项不是持久化 schema 的枚举。
2. 从 TOML 到设备图
GuestConfig::from_toml() 的顺序固定在 axvmconfig/src/lib.rs:691:先调用 toml::from_str,再执行 validate_boot_config() 和 GuestDevices::validate(),最后记录用户提供的 memory_regions 数量。这个计数不序列化,用于 boot prepare 区分用户内存和准备阶段追加的区域。
应用层转换本身主要是类型与所有权边界转换:
guest_type转为AddressSpacePolicy;passthrough、disabled转为尚未解析的平台 selector。entry_point、镜像加载地址、CPU 参数和memory_regions写入AxVMConfigParams。devices.virtual原样保留为请求,catalog 由 AxVM 内置注册项与 Axvisor 的virtio-blk、virtio-net注册项组成。- 若
guest_type = "passthrough"、用户没有填写devices.passthrough,且 Machine 提供default_passthrough_device_path,build_axvm_config()会注入一个内部 selector。当前 AArch64、RISC-V 和 LoongArch Machine 使用/作为发现根;x86_64 不注入。 prepare_guest_boot()可以根据 host 固件和架构启动方式补充 DTB 或保留内存,返回持有准备后GuestConfig与客户机 DTB 的PreparedGuestBoot。随后应用层在os/axvisor/src/config.rs:132-134调用sync_axvm_config_from_crate_config(),把新增memory_regions写回 draftAxVMConfig,再设置 boot policy。设备 prepare 在这之后才把请求实例化为图节点。
Machine 负责选择固定串口、中断控制器与地址池,规划器负责解析图节点的资源。配置层只保留用户请求。相关算法见 Machine 与资源规划架构。
3. 持久化 schema
顶层只有 base、kernel、devices 三个表。三者都使用 #[serde(default, deny_unknown_fields)];PhysicalDeviceRef 也拒绝未知字段。这里的 deny_unknown_fields 只适用于固定形状结构。VirtualDeviceRequest.options 是开放的 TOML 表,由具体 model 在装配时解释。