2. 基于Hypervisor的虚拟化环境搭建

任务目标

在QNX Hypervisor(QHV)环境中创建一个Android Guest VM,并为其分配指定的CPU核心数、内存容量及虚拟存储设备。本案例聚焦于QHV启动配置的最小可运行实现,不涉及Android系统内部定制。

环境与依赖

  • 宿主机:QNX SDP 7.1或更高版本,已安装QNX Hypervisor(qvm)组件
  • 目标硬件:支持ARMv8虚拟化扩展(如i.MX8QM)的开发板
  • Android镜像:已生成的Android系统镜像(含kernel、ramdisk、system.img)
  • 构建工具:QNX Momentics IDE或命令行qcc交叉编译工具链

核心实现

QNX Hypervisor使用QVM配置文件(.conf)描述虚拟机资源。以下配置创建名为android_guest的VM,分配2个专用CPU核心、1GB内存,并挂载虚拟存储设备。

# android_guest.conf
vm(
    name := "android_guest"
    # 内存分配:1GB
    mem(
        size := 1G
        type := normal
    )
    # CPU分配:2个专用核心(物理核心2和3)
    vcpu(
        num := 2
        affinity := 0x0C    # 二进制1100,对应核心2和3
        type := dedicated
    )
    # 虚拟存储设备:virtio-blk,映射到宿主机上的Android镜像
    virtio(
        device := blk
        path := /data/android/system.img
        devno := 0
    )
    # 串口输出重定向到宿主机控制台
    channel(
        type := io
        dir := inout
        devname := /dev/ser0
    )
    # Android内核启动参数
    cmdline := "console=ttyAMA0 root=/dev/vda rw androidboot.hardware=qvh"
)

将上述配置保存为android_guest.conf后,通过QVM启动命令加载该配置。启动前需确认Android镜像文件路径正确,且宿主机对/data/android/目录有读写权限。

运行与验证

# 启动Android虚拟机
qvm -P android_guest.conf

# 查看虚拟机状态(确认已创建并运行)
qvm -l

验证步骤与通过条件:

  1. qvm -l输出中能看到android_guest处于running状态;
  2. 宿主机串口终端出现Android内核启动日志(包含Freeing unused kernel memory等标志);
  3. 在Android启动完成后,通过串口执行cat /proc/meminfo,确认MemTotal约为1GB(允许少量内核占用偏差);
  4. 执行cat /proc/cpuinfo,确认仅显示2个CPU核心(对应物理核心2和3)。

常见问题

  • 内存不足:若启动失败并提示内存分配错误,检查宿主机可用内存是否大于1GB,并确认无其他VM占用冲突。
  • CPU亲和性无效:确认硬件平台支持核心隔离,且物理核心编号与affinity掩码对应关系正确(可通过qvm -i查看宿主机CPU拓扑)。
  • 存储设备无法识别:确保path指向的镜像文件格式为QHV支持的raw或qcow2,且文件权限为宿主机用户可读。