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
验证步骤与通过条件:
qvm -l输出中能看到android_guest处于running状态;- 宿主机串口终端出现Android内核启动日志(包含
Freeing unused kernel memory等标志); - 在Android启动完成后,通过串口执行
cat /proc/meminfo,确认MemTotal约为1GB(允许少量内核占用偏差); - 执行
cat /proc/cpuinfo,确认仅显示2个CPU核心(对应物理核心2和3)。
常见问题
- 内存不足:若启动失败并提示内存分配错误,检查宿主机可用内存是否大于1GB,并确认无其他VM占用冲突。
- CPU亲和性无效:确认硬件平台支持核心隔离,且物理核心编号与
affinity掩码对应关系正确(可通过qvm -i查看宿主机CPU拓扑)。 - 存储设备无法识别:确保
path指向的镜像文件格式为QHV支持的raw或qcow2,且文件权限为宿主机用户可读。