Skip to content

重构 axvisor 客户机管理方案 #224

@bullhh

Description

@bullhh

背景与问题分析

当前Axvisor启动客户机需同时提供设备树文件(如linux_qemu.dtb)和客户机配置文件(如linux_qemu_aarch64.toml),存在以下问题:

  • 配置冗余:设备树与配置文件中的物理CPU映射(phys_cpu_ids)、内存区域(memory_regions)、直通设备地址等参数需手动同步,使用复杂。

  • 部署低效:修改客户机配置后需重新编译和下载Axvisor,无法动态更新。

优化目标

本次优化设计主要致力于实现以下两个核心目标:

  • 减少启动配置复杂度:通过自动从主机设备树解析参数,减少了启动 Axvisor 所需的手动配置项和参数数量。这降低了用户的配置负担,减少了因手动输入错误导致启动失败的可能性,提升了使用便捷性。
  • 增强工程实用性与灵活性:优化使 Axvisor 更能适应实际工程项目的需求。用户可以更方便地根据需要修改客户机配置参数,例如控制台选择客户机配置和不重新编译下更换客户机,增强了系统在不同场景下的适用性和可维护性。

具体实现方案

整个重构方案主要分为三个阶段:

阶段 核心目标 关键收益
阶段1 简化配置)动态生成客户机设备树 不再使用客户机设备树文件,并减少客户机配置项
阶段2 工程应用)从文件系统中读取客户机配置文件 修改客户机配置无需重新编译Axvisor
阶段3 工程应用)控制台动态配置 axvisor启动时动态加载/修改客户机配置

阶段一

一、设备树自动生成机制

1. 设备树来源

  • 主机设备树:Axvisor启动时加载的硬件描述树(.dtb)。

2. 生成逻辑

Image

关键步骤说明:

  1. 直通设备处理passthrough_devices):
    • 根据设备节点名(如uart@2800d000)自动获取物理地址、长度、中断号。
    • 级联父节点:直通设备时自动包含其父总线/控制器节点,确保硬件拓扑完整。
  2. 内存映射memory_regions):
    • 根据配置文件生成客户机设备树memory节点。
  3. CPU映射phys_cpu_ids):
    • 自动生成客户机CPU节点,移除冗余的phys_cpu_sets字段。

3. 具体实现

  1. 直通设备处理passthrough_devices):

    如下设备树节点中,可以通过reg读取出基地址为0x2800d000, 大小为0x1000,读出相关数据后可使用vm_cfg.add_pass_through_device(pt_dev)函数将相关节点信息添加到config文件中供后续使用。

    uart@2800d000 {
        compatible = "arm,pl011\0arm,primecell";
        reg = <0x00 0x2800d000 0x00 0x1000>;
        interrupts = <0x00 0x54 0x04>;
        clocks = <0x0c 0x0c>;
        clock-names = "uartclk\0apb_pclk";
        status = "okay";
    };
    

    修改前后对比:

    passthrough_devices = [
        ["intc@8000000", 0x800_0000, 0x800_0000, 0x50_000, 0x1], #[name, base_gpa, base_hpa, length, irq_id]
        ["pl011@9000000", 0x900_0000, 0x900_0000, 0x1000, 0x1],
        ["pl031@9010000", 0x901_0000, 0x901_0000, 0x1000, 0x1],
    ]
    
    passthrough_devices = [
        "intc@8000000",   
        "pl011@9000000",
        "pl031@9010000"
    ]
    
  2. 内存映射memory_regions):

    使用fdt-parser仓库可实现主机设备树文件的读取,使用vm-fdt仓库可实现客户机设备树文件的生成。

  3. CPU映射phys_cpu_ids):

    与处理直通设备相同,读取phys_cpu_ids在设备树中顺序,自动填充phys_cpu_sets字段。

    phytium-pi e2000开发板为例,配置文件中:

    cpu_num = 3
    phys_cpu_ids = [0x200, 0x201, 0x100]     # cpu逻辑ID
    phys_cpu_sets = [1, 2, 8]                # 物理CPU掩码位
    

    axvisor的cpu节点如下,通过phys_cpu_ids和设备树节点可以推断出phys_cpu_sets

     cpu@0 {
             device_type = "cpu";
             compatible = "phytium,ftc310\0arm,armv8";
             reg = <0x00 0x200>;
             ...
     };
     cpu@1 {
             device_type = "cpu";
             compatible = "phytium,ftc310\0arm,armv8";
             reg = <0x00 0x201>;
             ...
     };
     cpu@100 {
             device_type = "cpu";
             compatible = "phytium,ftc664\0arm,armv8";
             reg = <0x00 0x00>;
        		...
     };
     cpu@101 {
             device_type = "cpu";
             compatible = "phytium,ftc664\0arm,armv8";
             reg = <0x00 0x100>;
             ...
     };
    

二、配置文件精简

优化后的配置文件仅保留必要参数

# Vm base info configs
[base]
id = 1
name = "linux"
vm_type = 1
cpu_num = 4
phys_cpu_ids = [0x00, 0x100, 0x200, 0x300]

[kernel]
entry_point = 0x4000_0000
kernel_load_addr = 0x4000_0000
dtb_load_addr = 0x4008_0000
ramdisk_load_addr = 0x4020_0000
image_location = "memory"
kernel_path = "Image.bin"
ramdisk_path = "ramdisk.img"

[memory]
regions = [
    [0x4000_0000, 0x4000_0000, 0x7, 1] 
]

[devices]
passthrough_devices = [
    "intc@8000000",    # 自动解析地址
    "pl011@9000000",
    "pl031@9010000"
]
emu_devices = [ ]

移除的冗余项

  • dtb_path→ 不再需要,客户机设备树由主机设备树文件和客户机配置文件共同生成。

  • phys_cpu_sets→ 通过phys_cpu_ids动态计算位掩码。

  • passthrough_devices参数精简。

阶段二

三、 配置文件的存储与加载

1. 设计目标

  • 解耦配置与代码:将客户机配置文件(axvisor/configs/vms/xxxxx.toml)从Axvisor源码中剥离,避免因客户机配置更新触发Hypervisor重编译。

  • 动态加载能力: 支持初始化时从文件系统读取配置文件,客户机重启即可生效,无需重启Axvisor宿主机。

  • 兼容直通存储架构:利用设备直通特性,使Axvisor与客户机共享相同存储设备和相同文件系统格式(如EXT4),简化存储管理。

2. 存储架构设计

  • 配置文件存储位置

    配置模式 存储位置
    image_location="fs" 客户机文件系统固定路径(如 /guest/vms1/guest_config.toml
    image_location="memory" 编译时嵌入Axvisor二进制文件
  • 文件系统要求

Axvisor需挂载与客户机相同的文件系统(如EXT4/FAT32),确保直通设备可被双向识别。

  • 路径标准化

    在文件系统根目录创建guest文件夹,内部存放客户机配置文件和镜像

    /guest/                  # 根目录
    ├── vms1/                # 客户机1专属目录
    │   ├── vm_config.toml   # 客户机1配置文件(TOML格式)
    │   └── Image            # 客户机1系统镜像文件(如linux)
    └── vms2/                # 客户机2专属目录
        ├── vm_config.toml   # 客户机2配置文件(TOML格式)
        └── arceos.bin       # 客户机2系统镜像文件
    

3. 运行时加载流程

Image

阶段三

四、控制台动态配置客户机

1. 设计目标

  • 通过控制台交互界面实时生成/修改客户机配置文件(TOML格式)。
  • 支持配置模板选择、参数修改(CPU/内存/设备直通等)。

2. 配置客户机流程

Image

使用

本设计通过三个阶段的有序优化,对 Axvisor 的配置管理和启动流程进行了重要改进。这些优化旨在简化初始化配置、增强部署灵活性,并为未来交互式配置提供基础,从而整体提升系统的易用性和适应性。

优化后,原客户机配置文件中优化去掉的参数均通过读取主设备树获得,且写入axvisor内存中客户机配置结构体中,这些参数在后续使用时与优化前无区别

以下是各阶段优化重点及影响的汇总:

阶段 优化重点 主要变化与影响
阶段一 精简配置内容 客户机配置文件内容减少,自动从主机设备树解析参数。启动命令与部署方式保持不变
阶段二 配置文件存放位置变更 image_location="fs"时,客户机配置文件可与客户机镜像一样存放于文件系统中,简化了更换客户机及配置时部署流程,启动命令保持不变
阶段三 交互式配置能力(需后续实现控制台) 为实现控制台交互式重新配置客户机参数预留了设计空间,待控制台功能实现后再作详细设计,旨在提供动态调整能力。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

Status

处理中

Relationships

None yet

Development

No branches or pull requests

Issue actions