我很难在 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
:如果disable
Windows 启动并报告 Hyper-V 工作(systeminfo
报告 Hyper-V 要求可用,TaskManager 显示启用虚拟化等),但 Hyper-V 无法启动任何 VM,系统日志报告管理程序未运行. 将该功能设置为require
将我带入引导循环/引导到自动修复。
而且由于在这种情况下搜索此选项有点困难:
- 该
hypervisor
功能的具体作用是什么?它记录在哪里?
在我看来,Windows 虚拟机管理程序在启用该功能和禁用该功能的情况下在启动时崩溃,只是无法启动并继续启动过程。
我现在不知道我还能尝试什么,并且相信我已经检查了几乎所有关于该主题的搜索结果。但也许我错过了什么,所以请
- 任何人都可以报告这样的成功设置吗?如果是这样,共享来宾配置会很棒!
- 我应该尝试其他任何想法来完成这项工作吗?
谢谢!
PS:虚拟化本身运行得很好而且速度很快,所以我很确定硬件方面的一切都很好,但也许我也应该检查一些事情?!
几个月前,我使用 CentOS 8.1.1911 设置了两台 KVM 主机,并将 Hyper-V 虚拟机作为嵌套来宾,并且一切正常。
几个月后,我设置了第三台 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) 看看效果如何。
[编辑]
内核 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 版本)一起工作,我必须执行以下操作:
修改
/etc/yum.repos.d/CentOS-Linux-AppStream.repo
,添加exclude=qemu*
修改
/etc/yum.repos.d/CentOS-Linux-AppStream81.repo
为指向 CentOS 保管库然后重新安装qemu
这使得嵌套虚拟化成为可能,一旦使用的 CPU 按照 Redhat的建议设置为直通。
尽管如此,我还是遇到了很多稳定性问题,并且按照这里给出的建议,我修改了 CPU 以忽略 TSX。
在我的情况下,我
virsh edit myVM
到以下一旦设置了这个自定义 CPU 模型,我在 KVM 下的 Hyper-V 就稳定了。
测试机器是 Intel(R) Xeon(R) CPU E3-1275 v6 @ 3.80GHz skylake 处理器,微码 sig=0x906e9, pf=0x2, revision=0xde