支持的目标平台
所有 Qualcomm® Linux 开发套件都支持基于 KVM 的虚拟化。每个目标平台的默认启动模式为 KVM 或 Gunyah 两者之一。 表:各目标平台的虚拟化支持情况请参阅发行说明,了解平台能力以及对 hypervisor 方案的支持情况。
前提条件和 Kconfig
在主机内核配置中启用以下选项:在 EL2 启动内核
在支持的平台上将 KVM 配置为默认启动模式。请参阅发行说明以确定各平台的虚拟化能力并识别任何例外情况。 启动模式由烧写到目标平台的平台专用 DTB 或 XBL 配置镜像选择。请参阅下表,确定包含 UEFI 设备树节点的镜像,以及用于选择 KVM 或 Gunyah 启动的文件。
对于 CQ2390M/CQ2390S 和 IQ10/Nord,
xbl_config.elf 仅包含 XBL 专用的 DT
节点。UEFI 专用的 DT 节点位于 uefi_dtbs.elf 或 uefi_dtbs_kvm.elf 中。
对于 Hamoa/IQ-X7181 和 Purwa/IQ-X5121,xbl_config.elf 仅包含 XBL 专用的
DT 节点。UEFI 专用的 DT 节点位于压缩的 uefi_dtbs.xz 或 uefi_dtbs_kvm.xz
镜像中。在这些平台上请使用压缩的 .xz 镜像。
对于 IQ9/IQ-9075/Lemans、IQ8/IQ-8275/Monaco 和 IQ6/IQ615/Talos,
xbl_config.elf 同时包含 XBL 和 UEFI 的 DT 节点。
在使用
uefi_dtbs.elf、uefi_dtbs.xz、uefi_dtbs_kvm.elf 或
uefi_dtbs_kvm.xz 的目标平台上,在 KVM 和 Gunyah 之间切换时无需更新
VendorDtbOverlays EFI 变量。在这些目标平台上,启动模式通过烧写匹配的
UEFI DTB 镜像来选择。build/tmp/deploy/images/<machine-name> 下。
将 <machine-name> 替换为实际的 Yocto machine 配置名称,例如 iq-9075-evk。
切换到 KVM
如果平台启动进入 Gunyah 而不是 KVM,请使用以下步骤切换到 KVM。请按顺序完成各步骤:-
重启进入 fastboot 模式。在设备 shell 上运行以下命令:
-
从主机烧写 KVM 启动文件。
对于 CQ2390M/CQ2390S 和 IQ10/Nord:
对于 Hamoa/IQ-X7181 和 Purwa/IQ-X5121:对于 IQ9/IQ-9075/Lemans、IQ8/IQ-8275/Monaco、IQ6/IQ615/Talos、 QCS6490/Kodiak/RB3Gen2 和 QCS5430/Kodiak/RB3Gen2Lite:
-
重启设备:
默认配置为启动进入 KVM 的平台无需执行这些步骤,除非您在启动进入 Gunyah 后需要切换回 KVM。
切换到 Gunyah
请使用以下步骤:-
重启进入 fastboot 模式。在设备 shell 上运行以下命令:
-
从主机烧写 Gunyah 启动文件。
对于 CQ2390M/CQ2390S 和 IQ10/Nord:
对于 Hamoa/IQ-X7181 和 Purwa/IQ-X5121:对于 IQ9/IQ-9075/Lemans、IQ8/IQ-8275/Monaco、IQ6/IQ615/Talos、 QCS6490/Kodiak/RB3Gen2 和 QCS5430/Kodiak/RB3Gen2Lite:
-
重启设备:
构建客户机 VM 产物
在启动客户机 VM 之前,请先构建客户机内核镜像和客户机根文件系统。主机镜像不包含这两个组件。构建客户机内核
客户机运行在 EL1,不需要 Qualcomm 开发板设备树或 EL2 配置。请使用上游 arm64 defconfig 构建客户机内核。使用与主机相同的内核源码树:-
使用独立的
kmake工作流构建内核。有关主机环境设置,请参阅 不使用 Yocto 构建内核。 -
添加客户机所需的 virtio 前端驱动。上游
defconfig已启用常用驱动;请确认并通过配置片段补充缺失的驱动:有关按设备划分的完整 virtio Kconfig 符号列表,请参阅 Virtio 设备支持。
../kobj-guest/arch/arm64/boot/Image。
构建客户机根文件系统
使用 Yocto 构建一个最小的客户机根文件系统。同一个 recipe 会同时生成 CPIO ramdisk 和 ext4 磁盘镜像。-
在您的工作区中打开 kas shell:
-
将所需的镜像类型添加到
build/conf/local.conf,使构建同时生成 ramdisk 和磁盘镜像: -
构建 console 镜像,这是受支持的最小镜像,作为客户机已足够:
-
从 deploy 目录收集产物:
您可以使用任何 arm64 根文件系统作为客户机。如果不需要 Yocto 构建的客户机镜像,可以改用 aarch64 发行版云镜像,配合 -drive 选项使用,替代 rootfs.ext4。
将产物部署到设备
将客户机内核和根文件系统复制到主机设备,并放入以下示例所使用的目录中:启动客户机 VM
在启动客户机 VM 之前,请确保客户机内核镜像(Image)、根文件系统 CPIO(rootfs.cpio.gz)和根文件系统镜像(rootfs.ext4)位于主机的 /mnt/overlay/guest/ 目录中。有关如何生成这些文件,请参阅构建客户机 VM 产物。
使用 QEMU
使用 ramdisk 启动:验证客户机 shell 访问
使用-nographic 启动 QEMU 时,客户机串口控制台会连接到当前终端。启动日志应在同一终端中输出,并最终进入自动打开的客户机 shell 或登录提示符。
预期的客户机控制台流程:
root 用户名。
客户机 shell 通过(PASS)标准:
在客户机 shell 中运行一条基本命令:
验证主机稳定性
在客户机 VM 运行期间,打开另一个主机 shell 并检查主机系统运行状况:
当客户机进入交互式 shell,且主机保持响应、未出现新的虚拟化相关内核错误时,客户机虚拟化验证即为通过。
使用 libvirt
Libvirt 通过virsh 命令行实用程序和 libvirtd 守护进程管理 VM。从 XML 域文件定义一个 VM,然后使用以下命令进行控制:
表:常用 virsh VM 管理命令
替换以下内容:
<xml-file>替换为 libvirt XML 域定义文件的路径。<domain>替换为 XML<name>元素中定义的 VM 域名称。
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 设备:lsusb 中的供应商和产品 ID 将 USB 直通添加到 QEMU 调用中:
lspci 中的 domain、bus、slot 和 function 添加 PCI 直通:
<vid>和<pid>替换为十六进制的 USB 供应商和产品 ID,例如0x0781和0x5567。<bus>、<slot>、<function>替换为lspci输出中的 PCI 地址组成部分。
chardev 后端,并将其作为 virtserialport 暴露给客户机。
可观测性和维护
KVM 跟踪
通过 tracefs 启用 KVM 事件跟踪:看门狗
QEMU 模拟一个 I6300 ESB 看门狗设备,以标准看门狗字符设备的形式暴露给客户机。在客户机内核中启用它:action 属性控制超时时的行为:reset 重启客户机,poweroff 关闭客户机。有关详细信息,请参阅 libvirt watchdog documentation。
远程命令执行
QEMU 客户机代理(qemu-ga)允许在没有网络连接的情况下从主机在客户机 VM 上运行命令。在客户机操作系统用户空间中启用 qemu-ga,并通过 virtio-serial 接口对其进行配置。
使用 virsh qemu-agent-command 配合 guest-exec 子命令远程执行命令:
<domain>替换为 VM 域名称。

