Skip to main content
Qualcomm® Linux 通过 KVM(基于内核的虚拟机)支持硬件辅助虚拟化。KVM 直接集成到 Linux 内核中,以接近原生的性能运行客户机操作系统。在实现 Armv8.1 或更高版本的 Qualcomm SoC 上,虚拟主机扩展(VHE)默认启用,允许主机内核在 EL2 运行,而客户机内核和用户空间在 EL1 和 EL0 运行。

支持的目标平台

所有 Qualcomm® Linux 开发套件都支持基于 KVM 的虚拟化。每个目标平台的默认启动模式为 KVM 或 Gunyah 两者之一。 表:各目标平台的虚拟化支持情况
请参阅发行说明,了解平台能力以及对 hypervisor 方案的支持情况。

前提条件和 Kconfig

在主机内核配置中启用以下选项:
KVM 要求内核在异常级别 2(EL2)启动。启动后在设备上验证 KVM 是否可用:

在 EL2 启动内核

如果目标平台的默认启动模式为 KVM(请参阅支持的目标平台),主机会在 EL2 启动,请跳过本节。 如果目标平台的默认启动模式为 Gunyah,请按照以下说明切换到 KVM。请按给定顺序完成各步骤。
  1. 使用默认镜像启动。
  2. 更新 EFI 变量以选择 KVM 设备树 overlay:
  3. 重启进入 fastboot 模式。在设备 shell 上运行以下命令:
  4. 从主机烧写 KVM XBL 配置镜像:
    xbl_config_kvm.elf 文件位于 Yocto 构建输出的 build/tmp/deploy/images/<machine-name> 下。 替换以下内容:
    • <machine-name> 替换为实际的 Yocto machine 配置名称,例如 iq-9075-evk。
  5. 重启设备。

构建客户机 VM 产物

在启动客户机 VM 之前,请先构建客户机内核镜像和客户机根文件系统。主机镜像不包含这两个组件。

构建客户机内核

客户机运行在 EL1,不需要 Qualcomm 开发板设备树或 EL2 配置。请使用上游 arm64 defconfig 构建客户机内核。使用与主机相同的内核源码树:
  1. 使用独立的 kmake 工作流构建内核。有关主机环境设置,请参阅 不使用 Yocto 构建内核。
  2. 添加客户机所需的 virtio 前端驱动。上游 defconfig 已启用常用驱动;请确认并通过配置片段补充缺失的驱动:
    有关按设备划分的完整 virtio Kconfig 符号列表,请参阅 Virtio 设备支持。
构建过程会将客户机内核镜像写入 ../kobj-guest/arch/arm64/boot/Image。

构建客户机根文件系统

使用 Yocto 构建一个最小的客户机根文件系统。同一个 recipe 会同时生成 CPIO ramdisk 和 ext4 磁盘镜像。
  1. 在您的工作区中打开 kas shell:
  2. 将所需的镜像类型添加到 build/conf/local.conf,使构建同时生成 ramdisk 和磁盘镜像:
  3. 构建 console 镜像,这是受支持的最小镜像,作为客户机已足够:
  4. 从 deploy 目录收集产物:
您可以使用任何 arm64 根文件系统作为客户机。如果不需要 Yocto 构建的客户机镜像,可以改用 aarch64 发行版云镜像,配合 -drive 选项使用,替代 rootfs.ext4。

将产物部署到设备

将客户机内核和根文件系统复制到主机设备,并放入以下示例所使用的目录中:
确认客户机内核是 QEMU 所需的原始镜像格式:

启动客户机 VM

在启动客户机 VM 之前,请确保客户机内核镜像(Image)、根文件系统 CPIO(rootfs.cpio.gz)和根文件系统镜像(rootfs.ext4)位于主机的 /mnt/overlay/guest/ 目录中。有关如何生成这些文件,请参阅构建客户机 VM 产物。

使用 QEMU

使用 ramdisk 启动:
使用根文件系统镜像启动:

使用 libvirt

Libvirt 通过 virsh 命令行实用程序和 libvirtd 守护进程管理 VM。从 XML 域文件定义一个 VM,然后使用以下命令进行控制: 表:常用 virsh VM 管理命令 替换以下内容:
  • <xml-file> 替换为 libvirt XML 域定义文件的路径。
  • <domain> 替换为 XML <name> 元素中定义的 VM 域名称。
有关 libvirt XML 域定义示例,请参阅 libvirt domain format documentation。

Virtio 设备支持

Virtio 提供了一个半虚拟化 I/O 框架,用于客户机 VM 与主机之间的高性能设备模拟。前端驱动在客户机操作系统中运行;后端驱动在 QEMU 或内核中运行。通信使用 virtqueue(环形缓冲区),以最大限度地减少客户机到主机的切换。 表:支持的 virtio 设备

主机到客户机的文件共享(virtio-9p)

使用 9P 文件系统将主机目录传递给客户机 VM:
在客户机内部挂载共享目录:
替换以下内容:
  • <mount-point> 替换为客户机内部用于挂载共享文件夹的目录。

虚拟套接字(VSOCK)

VSOCK 使用上下文标识符(CID)在客户机 VM 与主机之间实现套接字通信。主机 CID 始终为 2;客户机 CID 从 3 开始。 表:保留的 CID 值 将 VSOCK 添加到 QEMU 调用中:
替换以下内容:
  • <cid> 替换为要分配给客户机 VM 的 CID,例如 73。

设备直通

可以使用 VFIO(PCI)、libusb(USB)或 chardev 后端(UART)将物理设备直通给客户机 VM。 在主机上识别 USB 设备:
在主机上识别 PCI 设备:
使用 lsusb 中的供应商和产品 ID 将 USB 直通添加到 QEMU 调用中:
使用 lspci 中的 domain、bus、slot 和 function 添加 PCI 直通:
替换以下内容:
  • <vid> 和 <pid> 替换为十六进制的 USB 供应商和产品 ID,例如 0x0781 和 0x5567。
  • <bus>、<slot>、<function> 替换为 lspci 输出中的 PCI 地址组成部分。
对于 UART 直通,请配置一个指向主机 TTY 设备的 chardev 后端,并将其作为 virtserialport 暴露给客户机。

可观测性和维护

KVM 跟踪

通过 tracefs 启用 KVM 事件跟踪:
QEMU 跟踪事件可以重定向到内核 ftrace 缓冲区。要启动一个启用了 virtio 跟踪的客户机 VM:

看门狗

QEMU 模拟一个 I6300 ESB 看门狗设备,以标准看门狗字符设备的形式暴露给客户机。在客户机内核中启用它:
将看门狗添加到 libvirt 域 XML 中:
action 属性控制超时时的行为:reset 重启客户机,poweroff 关闭客户机。有关详细信息,请参阅 libvirt watchdog documentation。

远程命令执行

QEMU 客户机代理(qemu-ga)允许在没有网络连接的情况下从主机在客户机 VM 上运行命令。在客户机操作系统用户空间中启用 qemu-ga,并通过 virtio-serial 接口对其进行配置。 使用 virsh qemu-agent-command 配合 guest-exec 子命令远程执行命令:
替换以下内容:
  • <domain> 替换为 VM 域名称。
有关更多信息,请参阅 QEMU Guest Agent。