L0 KVM 和 Win10 L1 嵌套虚拟化不起作用(Windows 启动循环)

L0 KVM 和 Win10 L1 嵌套虚拟化不起作用(Windows 启动循环)

我很难让在 KVM 主机上运行的 Win10 Pro 客户机中的嵌套虚拟化正常工作。启用 Windows Hypervisorhypervisorlaunchtype auto会导致启动循环/启动到自动修复。

主持人:

CentOS Linux release 8.2.2004 (Core)

Intel(R) Xeon(R) E-2176G CPU @ 3.70GHz

# cat /sys/module/kvm_intel/parameters/nested
1

flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d

客人:

Microsoft Windows [Version 10.0.19041.508]

我尝试了多种配置,将我的 Windows 从 BIOS 迁移到 UEFI,尝试了干净的 Windows 安装,禁用/重新启动/启用/重新启动 Hypervisor 功能等,但都没有任何效果。

我当前的配置:

  <os>
    <type arch='x86_64' machine='pc-q35-rhel7.6.0'>hvm</type>
    <loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.secboot.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/win10_VARS.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic eoi='on'/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
    <smm state='on'/>
  </features>
  <cpu mode='host-passthrough' check='partial'>
    <topology sockets='1' cores='4' threads='2'/>
    <feature policy='require' name='ds'/>
    <feature policy='require' name='acpi'/>
    <feature policy='require' name='ss'/>
    <feature policy='require' name='ht'/>
    <feature policy='require' name='tm'/>
    <feature policy='require' name='pbe'/>
    <feature policy='require' name='dtes64'/>
    <feature policy='require' name='monitor'/>
    <feature policy='require' name='ds_cpl'/>
    <feature policy='require' name='vmx'/>
    <feature policy='require' name='smx'/>
    <feature policy='require' name='est'/>
    <feature policy='require' name='tm2'/>
    <feature policy='require' name='xtpr'/>
    <feature policy='require' name='pdcm'/>
    <feature policy='require' name='osxsave'/>
    <feature policy='require' name='tsc_adjust'/>
    <feature policy='require' name='clflushopt'/>
    <feature policy='require' name='intel-pt'/>
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='stibp'/>
    <feature policy='require' name='ssbd'/>
    <feature policy='require' name='xsaves'/>
    <feature policy='require' name='pdpe1gb'/>
    <feature policy='require' name='invtsc'/>
    <feature policy='disable' name='hypervisor'/>
  </cpu>

最后请注意feature hypervisor:如果disableWindows 启动并报告 Hyper-V 正常运行(systeminfo报告 Hyper-V 要求可用,TaskManager 显示虚拟化已启用等),但 Hyper-V 无法启动任何 VM,系统日志会报告虚拟机管理程序未运行。将功能设置为require将使我进入启动循环/启动至自动修复。

由于在这种情况下用 Google 搜索此选项有点困难:

  • 该功能具体有什么hypervisor用? 在哪里有记录?

在我看来,Windows 虚拟机管理程序在启用该功能的情况下启动时崩溃,而禁用该功能后无法启动并继续启动过程。

我现在不知道还能尝试什么,而且我相信我已经检查了关于这个主题的几乎所有搜索结果。但也许我漏掉了一些东西,所以请

  • 有人能报告这样的成功设置吗?如果可以,分享一下访客配置就太好了!
  • 我还应该尝试其他什么想法来实现这个目标吗?

谢谢!

附言:虚拟化本身运行良好且速度很快,所以我很确定硬件方面的一切都没问题,但也许我还应该检查一些东西?!

答案1

几个月前,我使用 CentOS 8.1.1911 设置了两个 KVM 主机,并以 Hyper-V VM 作为嵌套客户机,一切运行正常。

几个月后,我设置了第三台 KVM 主机,其硬件和软件配置几乎相同。唯一的区别是主板,它具有相同的芯片组,但采用技嘉品牌,而不是像前两台一样采用华硕品牌。我在 CentOS 8.2.2004 上设置了这台主机,并遇到了与您相同的情况 - 启动循环。我当时尝试了最新的 Fedora 版本,它也启动循环。由于此主机上的嵌套虚拟化不是必需的,所以我没有使用它,并假设技嘉主板有问题。

快进到今天,我决定将 8.1 主机升级到 8.2。升级完成后,我重新启动 - hyper-V 嵌套 VM 开始循环引导。

我使用 yum history undo 回滚到 8.1.1911,就这样,hyper-v 客户机又开始工作了。

TL;DR:可能是最新版本的 CentOS (8.2.2004) 存在问题。尝试安装 8.1 (8.1.1911),看看效果如何。

答案2

[编辑]

内核 4.18.0-259.el8.x86_64 解决了该问题,并与最新的 qemu 4.2.0-34.module_el8.3.0+613+9ec9f184.1.x86_64 兼容

因此不再需要将 qemu 软件包降级到 CentOS 8.1

[/编辑]

由于@grabueschel 给了我们一个有效的答案,我进一步深入挖掘了一下。

确实,CentOS 8.1 软件包适用于 kvm L0 虚拟化上的嵌套 Hyper-V L1,而 CentOS 8.2+ 软件包则不适用。我已提交完整的错误报告这里

不确定这是否有帮助。查看 RPM 变更日志,也许- Resolves: bz#1689270 (Nested KVM: limit VMX features according to CPU models - Slow Train)可能是罪魁祸首。

无论如何,为了使嵌套虚拟化与 Hyper-V(Win10 2009H2 版本)一起工作,我必须执行以下操作:

dnf remove qemu-kvm
cp /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-AppStream81.repo

修改/etc/yum.repos.d/CentOS-Linux-AppStream.repo、添加exclude=qemu*

修改/etc/yum.repos.d/CentOS-Linux-AppStream81.repo为指向CentOS保险库

[appstream81]
name=CentOS Linux 8.1 - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=http://vault.centos.org/8.1.1911/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
include=qemu*

然后重新安装 qemu

dnf install qemu-kvm

一旦将使用的 CPU 设置为 Redhat 建议的直通,就可以实现嵌套虚拟化这里

尽管如此,我还是遇到了很多稳定性问题,按照给出的建议这里,我修改了 CPU 以忽略 TSX。

就我而言,virsh edit myVM

  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Skylake-Client-noTSX-IBRS</model>
    <feature policy='require' name='hypervisor'/>
    <feature policy='require' name='vmx'/>
  </cpu>

一旦设置了这个自定义的 CPU 模型,我的 KVM 下的 Hyper-V 就变得稳定了。

测试机器是 Intel(R) Xeon(R) CPU E3-1275 v6 @ 3.80GHz skylake 处理器,微码 sig=0x906e9,pf=0x2,修订版=0xde

相关内容