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 工具准备。