s390x 上的受保护虚拟化

受保护虚拟机(PVM)的内存和大多数寄存器已加密,或无法被虚拟机监控器访问,因此在虚拟机运行时,实际上禁止了虚拟机内部状态检查。PVM 在静止状态下也保持加密,只有特定 IBM Z 机器中名为 Ultravisor 的固件实体才能解密。

前提条件

要运行 PVM,需要具备受保护虚拟化功能的机器,该功能由 Ultravisor Call 设施(stfle 位 158)指示。需要在主机内核命令行中设置 prot_virt=1,以在启动时初始化 Ultravisor。

运行 PVM 要求使用 KVM 虚拟机监控器。

如果满足这些要求,KVM_CAP_S390_PROTECTED 能力会指示 KVM 能够在该 LPAR 上支持 PVM。

运行受保护虚拟机

要运行 PVM,需要选择包含 Unpack facility 的 CPU 模型(stfle 位 161,对应功能 unpack/S390_FEAT_UNPACK),并在命令行中添加以下选项:

-object s390-pv-guest,id=pv0 \
-machine confidential-guest-support=pv0

添加这些选项将会:

  • 确保 unpack 设施可用

  • 默认对所有 I/O 设备启用 IOMMU

  • 初始化 PV 机制

目前不支持直通(vfio)设备。

不支持主机大页作为后备内存。但客户机可以按照其设施所指示的能力使用大页。

启动过程

安全客户机镜像可以从磁盘加载,也可以通过 QEMU 命令行提供。从磁盘启动由未经修改的 s390-ccw BIOS 执行:解释 bootmap,将多个组件读入内存,再将控制权交给其中一个组件(zipl stage3)。Stage3 进行一些修正,然后将控制权交给驻留在客户机内存中的某个程序,通常是操作系统内核。安全镜像前面还附加了另一个组件(stage3a),它使用新的 diag308 子码 8 和 10 触发向安全模式的转换。

从 QEMU 命令行提供的镜像启动时,通过 -kernel 传入的文件必须具有与磁盘启动所产生的相同内存布局。该布局包括加密组件(内核、initrd、cmdline)、stage3a 加载器和元数据。使用这种启动方式时,命令行选项 -initrd 和 -cmdline 不起作用。PVM 镜像通过 s390-tools 工具集中的 genprotimg 工具准备。