十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

QEMU s390x Protected Virtualization(受保护虚拟机)实战指南:Ultravisor、PVM 启动流程与 KVM 实现解析

QEMU s390x Protected Virtualization(受保护虚拟机)实战指南:Ultravisor、PVM 启动流程与 KVM 实现解析 虚拟化硬件仿真【免费下载链接】qemuOfficial QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are disabled. Please only use release tarballs from the QEMU website.项目地址https://gitcode.com/gh_mirrors/qe/qemu点击查看免费下载导读本文围绕 QEMU 官方文档 docs/system/s390x/protvirt.rst 展开系统讲解如何在 IBM Zs390x平台上运行受保护虚拟机Protected Virtual MachinePVM从 Ultravisor 固件与 KVM 能力前提到-object s390-pv-guest与confidential-guest-support的完整命令行配置再到两种安全镜像启动路径磁盘引导与-kernel命令行引导的底层实现。读完本文你将掌握 PVM 的搭建方法、diag308子码 8/10 的加密过渡机制并能结合本仓库源码target/s390x/kvm/pv.c、target/s390x/diag.c理解 QEMU 与 KVM 的完整协作链路。一、受保护虚拟化PVM是什么在传统的虚拟化环境中hypervisor 拥有对客户机内存和寄存器状态的完全访问权因而天然具备VM 内省VM introspection能力——管理员可以看到客户机内核、内存中的明文数据。s390x 的 Protected Virtualization 通过引入一个独立于 hypervisor 的固件实体Ultravisor改变这一局面。根据 docs/system/s390x/protvirt.rst 的定义受保护虚拟机PVM的内存和大部分寄存器对 hypervisor 而言是加密的或不可访问的从而在虚拟机运行时有效禁止 VM 内省。在静止At rest状态下PVM 是加密的只能由特定 IBM Z 机器上名为 Ultravisor 的固件实体解密。这意味着 PVM 的完整生命周期分为两个层面运行时Runtimehypervisor 无法读取客户机内存与寄存器即使宿主被攻破也无法直接窥探客户机内部静态At rest安全镜像本身是加密的只有目标机器上的 Ultravisor 持有相应密钥才能解封unpack执行。需要特别说明的是PVM 并不等同于不可入侵的绝对安全它的安全边界是信任 Ultravisor 固件与硬件本身而对 hypervisorKVM/QEMU持不信任态度。这与 x86 平台的 SEV/SEV-SNP、TDX 属于同一类机密计算Confidential Computing范畴但 s390x 的实现路径固件实体 加密解封流程具有明显的平台特色。二、运行 PVM 的前提条件文档明确列出了三层前提缺一不可。本仓库源码中也对其中部分条件做了硬性校验见下文源码级剖析一节。2.1 硬件与固件Ultravisor Call facilitystfle bit 158运行 PVM 的机器必须具有Protected Virtualization 特性该特性由Ultravisor Call facilitystfle bit 158指示。stfleStore Facility List Extended是 s390x 架构的 CPU 特性查询指令bit 158 置位表示该机器硬件与固件支持调用 Ultravisor 服务。2.2 宿主机内核参数prot_virt1Ultravisor 需要在宿主机引导时完成初始化方法是在宿主机内核命令行上设置prot_virt1只有 Ultravisor 完成初始化KVM 才能将虚拟机转入受保护模式。2.3 必须使用 KVM 虚拟化运行 PVM必须使用 KVM hypervisor即 QEMU 需以-accel kvm运行。在 QEMU 源码中这一约束被硬编码校验s390_pv_kvm_init()会在未启用 KVM 时直接报错 Protected Virtualization requires KVM见 target/s390x/kvm/pv.c。2.4 能力探测KVM_CAP_S390_PROTECTED当上述条件全部满足时KVM 会通过能力位KVM_CAP_S390_PROTECTED指示该 LPAR逻辑分区上支持 PVM。QEMU 在初始化时通过kvm_check_extension()探测该能力探测代码见 target/s390x/kvm/kvm.c结果保存在静态变量cap_protected当cap_protected为真时QEMU 会自动把Unpack facilityS390_FEAT_UNPACK注入默认 CPU 模型的能力位图见 target/s390x/kvm/kvm.c 中set_bit(S390_FEAT_UNPACK, model-features)的逻辑。三、运行一个受保护虚拟机命令行配置3.1 核心命令片段根据文档运行 PVM 需要选择包含Unpack facility的 CPU 模型并在 QEMU 命令行中加入以下两个选项qemu-system-s390x \ -cpu 支持 unpack 的型号 \ -object s390-pv-guest,idpv0 \ -machine confidential-guest-supportpv0 ...其中-object s390-pv-guest,idpv0创建一个类型为s390-pv-guest的 QOM 对象。它本质上是一个标记对象源码注释中明确写道basically a dummy used to tell the confidential guest support system to use s390s PV mechanism见 target/s390x/kvm/pv.c作用是告知 QEMU 的机密客户机支持框架本虚拟机采用 s390 的 PV 机制-machine confidential-guest-supportpv0将上述对象挂接到机器类型上触发后续的 PV 初始化流程。3.2 添加这些选项会发生什么文档明确说明添加上述选项后会依次产生三个效果确保unpackfacility 可用即确保 CPU 模型具备unpack特性对应S390_FEAT_UNPACKstfle bit 161这是后续安全镜像解封的基础默认对所有 I/O 设备启用 IOMMUPVM 场景下客户机内存对 hypervisor 不可见DMA 必须经过 IOMMU 翻译与保护因此 QEMU 默认开启 IOMMU初始化 PV 机制调用 KVM 的 PV 命令KVM_PV_ENABLE等完成虚拟机级受保护状态建立。3.3 CPU 模型选择与 unpack facilityunpack特性在 QEMU 特性定义表中的全貌如下见 target/s390x/cpu_features_def.h.incDEF_FEAT(UNPACK, unpack, STFL, 161, Unpack facility)也就是说unpack是一个由 stfle 位 161 指示的 CPU 特性。你可以在命令行用-cpu max、-cpu host或任何包含该特性的具体型号。注意文档同时提示当-machine confidential-guest-supportpv0生效时QEMU 的 KVM 初始化会强制校验S390_FEAT_UNPACK缺失时直接拒绝启动CPU model does not support Protected Virtualization见 target/s390x/kvm/pv.c所以不必担心漏配 CPU 特性导致静默失败。3.4 相关对象在 QMP 中的注册s390-pv-guest对象在 QMP 的ObjectOptions枚举中有正式注册属于用户可创建user-creatable对象可通过 QMP 的object-add动态创建见 qapi/qom.json。这为脚本化/动态管理 PVM 提供了与命令行等价的能力。四、源码级剖析QEMU 如何初始化 PVM4.1 启动校验链s390_pv_kvm_init()当confidential-guest-support挂接对象后QEMU 调用 target/s390x/kvm/pv.c 中的s390_pv_kvm_init()其校验顺序为确认对象类型是s390-pv-guest否则直接返回 0不干预KVM 检查kvm_enabled()为假则报错退出CPU 特性检查S390_FEAT_UNPACK缺失则报错退出CPU 数量检查调用s390_pv_guest_check()→s390_pv_check_cpus()验证smp.max_cpus不超过 PV 上限全部通过后置cgs-ready true。4.2 PVM 的 CPU 上限从何而来受保护模式下客户机通过 Read SCP Info 服务调用能获取的信息被限制在一页4 KiB内因此可表示的 CPU 条目数量有上限。s390_pv_get_max_cpus()见 target/s390x/kvm/pv.c据此计算return (TARGET_PAGE_SIZE - offset_cpu) / sizeof(CPUEntry);其中offset_cpu取决于是否启用 Extended-Length SCCBELS特性。超出上限时 QEMU 会报错 Protected VMs support a maximum of %d CPUs。从源码结构看这一限制是 PV 模式下 SCLP 通信页容量约束的直接体现。4.3 机器级保护流程s390_machine_protect()真正执行进入受保护模式的是 hw/s390x/s390-virtio-ccw.c 中的保护流程其步骤清晰对应文档描述禁止内存丢弃ram_block_discard_disable(true)——PVM 内存页需要显式的共享/取消共享语义virtio-balloon 等内存回收机制在 PV 模式下无法正常工作添加迁移阻止器源码直接给出结论 protected VMs are currently not migratable当前 PVM 不可迁移通过migrate_add_blocker阻止迁移操作创建 SE VMs390_pv_vm_enable()向 KVM 发送KVM_PV_ENABLE命令见 target/s390x/kvm/pv.c这是初始化 PV 机制在 KVM 层的落地查询 PV 信息s390_pv_query_info()通过KVM_PV_INFO获取 dump 相关参数非关键路径失败不致命设置安全参数s390_ipl_prepare_pv_header()见 hw/s390x/ipl.c从 IPL 参数块中读取加密镜像的头部pv_header_addr/pv_header_len调用s390_pv_set_sec_parms()下发KVM_PV_SET_SEC_PARMS命令——若返回码为UV_RC_SSC_INVAL_HOSTKEY0x0108还会提示检查镜像是否为此宿主正确加密见 target/s390x/kvm/pv.c解封镜像s390_ipl_pv_unpack()见 hw/s390x/ipl.c遍历 IPL 参数块中列出的每个组件逐一调用s390_pv_unpack()下发KVM_PV_UNPACK命令完成解密完整性校验s390_pv_verify()下发KVM_PV_VERIFY验证镜像完整性。上述所有 KVM 命令均通过kvm_vm_ioctl(kvm_state, KVM_S390_PV_COMMAND, pv_cmd)发送见 target/s390x/kvm/pv.c失败时打印KVM PV command %d (%s) failed并附上 KVM 返回的rc/rrc码。五、PVM 的启动过程Boot Process文档将 PVM 的安全镜像启动分为两种方式从磁盘引导与从 QEMU 命令行提供的镜像引导。两者最终都通过diag308的新子码触发进入安全模式的过渡。5.1 方式一从磁盘引导s390-ccw BIOS 路径这种方式使用未修改的 s390-ccw BIOS流程如下BIOS 解释引导映射bootmap将多个组件读入内存并把控制权交给其中一个组件——zipl stage3Stage3 做若干修正fixups再将控制权交给驻留在客户机内存中的某个程序通常就是操作系统内核安全镜像在头部额外预置了一个组件stage3a它使用新的diag308子码8 和 10来触发进入安全模式的过渡。在 QEMU 源码中diag308Diagnose 0x308IPL 控制指令的子码定义位于 include/hw/s390x/ipl/diag308.h#define DIAG308_SET 5 #define DIAG308_STORE 6 #define DIAG308_PV_SET 8 #define DIAG308_PV_STORE 9 #define DIAG308_PV_START 10子码 8DIAG308_PV_SET设置 PV 模式的 IPL 参数块IPL Parameter BlockIPIB在 target/s390x/diag.c 中与普通DIAG308_SET共用处理路径但使用iplb_valid_pv()校验子码 9DIAG308_PV_STORE读取 PV IPIB子码 10DIAG308_PV_START正式请求启动 PV 复位S390_RESET_PV见 target/s390x/diag.c。该路径还会检查若宿主机为 PVM 启用了大页kvm_s390_get_hpage()则直接返回DIAG_308_RC_INVAL_FOR_PV并报告 Protected VMs can currently not be backed with huge pages。此外handle_diag_308()在入口处会先校验只要子码大于等于DIAG308_PV_SET8就必须具备S390_FEAT_UNPACK特性否则抛出规格异常Specification Exception中断见 target/s390x/diag.c。5.2 方式二命令行镜像引导-kernel 路径如果镜像文件通过-kernel提供给 QEMU则要求该文件具有与磁盘引导相同的内存布局包括加密的组件内核 kernel、initrd、命令行 cmdlinestage3a 加载器元数据。关键限制使用这种引导方式时-initrd和-cmdline选项无效因为镜像内部已经打包了相应的加密载荷外部无法以明文方式注入。PVM 镜像的制备由 s390-tools 软件包中的genprotimg工具完成。5.3 与 Secure IPL 的关系需要区分两个概念Protected Virtualization本文主题关注内存与寄存器对 hypervisor 不可见而Secure IPL安全引导关注引导时验证内核完整性。二者是互补但独立的机制。QEMU 的 s390 Secure IPL 通过secure-boot与boot-certs机器参数实现Normal/Audit/Secure 三种模式相关用法可进一步参考仓库中的 docs/system/s390x/secure-ipl.rst。六、限制与注意事项文档明确列出了 PVM 当前的两类限制源码中也给出了对应依据6.1 不支持 vfio 直通设备Passthroughvfio设备目前不受支持。原因从架构上不难理解直通设备需要将宿主机物理设备直接映射给客户机其 DMA 会绕过 QEMU 的 IOMMU 保护层这与 PVM 强制所有 I/O 经过 IOMMU的安全模型冲突。PVM 场景应使用 virtio 设备virtio-blk/virtio-net 等。6.2 宿主机大页Huge Page不支持宿主机大页后备host huge page backing不受支持这一约束同样硬编码在DIAG308_PV_START路径中见上文 5.1 节target/s390x/diag.c。但需要注意文档的补充说明客户机内部可以按自身 facility 使用大页。即限制的是宿主机用大页给 PVM 提供内存后备而非客户机内核使用大页。6.3 其他源自源码的已知约束不可迁移PVM 启动时注册了迁移阻止器迁移会明确失败hw/s390x/s390-virtio-ccw.c内存丢弃被禁用balloon 等依赖内存回收的机制在 PV 模式下受限hw/s390x/s390-virtio-ccw.cCPU 数量上限受 SCLP 单页信息容量约束见 4.2 节。七、快速上手检查清单综合全文搭建一个 PVM 环境的完整检查清单如下硬件确认机器具备 Ultravisor Call facilitystfle bit 158宿主内核在/etc/default/grub或等效引导配置的内核命令行中加入prot_virt1并重新引导确认 KVM 能力宿主上确认 KVM 已加载且KVM_CAP_S390_PROTECTED可用QEMU 会据此自动注入unpack特性准备安全镜像使用 s390-tools 的genprotimg生成符合要求的 PVM 镜像或准备含 stage3a 的磁盘引导镜像启动命令qemu-system-s390x -machine s390-ccw-virtio \ -accel kvm \ -cpu max \ -object s390-pv-guest,idpv0 \ -machine confidential-guest-supportpv0 \ -kernel protimg 生成的镜像 \ ...注意限制避免使用 vfio 直通、避免宿主大页、不依赖迁移与 balloon。八、延伸阅读本文主文档docs/system/s390x/protvirt.rstSecure IPL安全引导使用指南docs/system/s390x/secure-ipl.rstPV 核心实现KVM 命令封装与 S390PVGuest 对象target/s390x/kvm/pv.cdiag308 的 PV 子码处理target/s390x/diag.c、include/hw/s390x/ipl/diag308.h机器级 PV 初始化与复位hw/s390x/s390-virtio-ccw.cunpack特性定义target/s390x/cpu_features_def.h.incs390-pv-guest的 QMP 对象注册qapi/qom.json说明受保护虚拟化是硬件、固件Ultravisor、宿主机内核KVM与 QEMU 四方协同的能力本文涉及的 QEMU 侧行为均以当前仓库源码与文档为准Ultravisor 内部的加密细节属于平台固件范畴不在 QEMU 源码仓库中体现。赞分享虚拟化硬件仿真【免费下载链接】qemuOfficial QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are disabled. Please only use release tarballs from the QEMU website.项目地址https://gitcode.com/gh_mirrors/qe/qemu点击查看免费下载相关推荐Cube Sandbox PVM 部署指南在无 /dev/kvm 的普通云服务器上启用 KVM 虚拟化Cube Sandbox PVM 部署指南在无 /dev/kvm 的普通云服务器上启用 KVM 虚拟化 适用场景云服务器上 /dev/kvm 不可用云服务Agent 沙箱虚拟化云原生人工智能后端容器运行时高性能权限系统laravel-permission千万级用户权限管理终极指南高性能权限系统laravel permission千万级用户权限管理终极指南 laravel permission是一款专为Laravel框架设计的高性能权限虚拟化硬件仿真突破虚拟化瓶颈ZeroTier One KVM/QEMU性能调优实战指南突破虚拟化瓶颈ZeroTier One KVM/QEMU性能调优实战指南 你是否在KVM/QEMU虚拟机中遇到ZeroTier One网络延迟高、吞吐量不足的网络通信后端上一篇bootstrap-wysihtml5完全指南打造简单美观的富文本编辑器下一篇Farfalle警告组件Alert提示组件深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表