我的设置是:
- L0:KVM,Ubuntu
- L1:Windows 10
- L2:Virtualbox(ubuntu)或 Bluestacks(Android 模拟器)
症状:
- Bluestacks 抱怨 Hyper-V 已启用但无法启动,即使它不在 Windows 的“附加功能”中。
- 一旦我运行新的虚拟机,Virtualbox 将重新启动整个 Windows 客户机。我尝试更改我能找到的基本上所有设置。
我确实启用了嵌套:
$ systool -m kvm_intel -v | grep nested
nested = "Y"
$ cat /sys/module/kvm_intel/parameters/nested
Y
在我的虚拟机配置中 ('virsh edit')
<features>
<acpi/>
<apic/>
<vmport state='off'/>
</features>
<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>Haswell</model>
<feature policy='require' name='vmx'/>
</cpu>
L1 客户机中的 systeminfo 显示:
Hyper-V Requirements: A hypervisor has been detected. Features required for Hyper-V will not be displayed.
知道为什么我无法使用 Windows 主机在 L2 上实现嵌套虚拟化吗?
答案1
要使 Hyper-V 在 KVM 虚拟机中工作,您需要按原样传递主机 CPU 模型,并禁用虚拟机管理程序 CPU 功能(虚拟 CPU 的)。您的虚拟机 XML 应显示如下:
<cpu mode='host-model' check='partial'>
<model fallback='allow'/>
<feature policy='disable' name='hypervisor'/>
</cpu>
此外,您应该使用 Q35 芯片组(而不是 i440fx)创建虚拟机。理想情况下,客户机应该使用 UEFI 启动。如果您使用 BIOS 启动,则需要 SeaBIOS 1.10(我想,已经有一段时间了)或更高版本。对于 Ubuntu,这意味着 Ubuntu 18.04 LTS 或更高版本。
答案2
在花了很长时间解决这个特定问题后,我找到了解决方案。我也遇到了在 Windows Server 2019 VM Guest 上运行嵌套虚拟化的问题。安装 HyperV 后,我的 VM 无法再启动。
在这种特殊情况下,我运行 Linux 并使用 KVM/Qemu 作为我的 L0 虚拟机管理程序,并运行需要在其上运行 docker 的 Windows Server 2019 VM。我们的一位客户有一组 PowerShell 脚本,他们使用这些脚本来设置 docker dev 环境(非常以 Windows 为中心,我非常不喜欢)。
首先,我确认我的kvm-intel
内核模型已启用嵌套虚拟化支持:
cat /sys/module/kvm_intel/parameters/nested
所以这不是问题,但值得一提的是,这对于支持 KVM/Qemu 设置的嵌套虚拟化是必需的。
实际的解决方案是将 Virt Manager 中的 CPU 配置从(默认)更改为
<cpu mode="host-model" check="partial"/>
到:
<cpu mode="custom" match="exact" check="partial">
<model fallback="allow">Skylake-Client-noTSX-IBRS</model>
<feature policy="disable" name="hypervisor"/>
<feature policy="require" name="vmx"/>
</cpu>
这会强制我的 CPU 型号改为Skylake-Client-noTSX-IBRS
(Skylake-Client-IBRS
默认型号)。出于某种原因,TSX 给我带来了严重的问题。
<feature policy="disable" name="hypervisor" />
让 Windows“认为”它没有作为虚拟机运行。
<feature policy="require" name="vmx" />
强制vmx
CPU 功能允许 Windows Server 2019 VM 本身能够运行其他 VM。
如果您查看 Windows 任务管理器(从 VM 内部),您会发现 Windows 认为处理器是裸机处理器(而不是虚拟处理器),同时具有虚拟化支持。此时,II 可以安装适用于 Windows 的 Docker 并开始使用它。设置如下:
- L0:Linux(KVM/Qemu)
- L1:Windows Server 2019 (HyperV)
- L2:Docker
我希望这可以帮助其他在 KVM 中运行的 Windows 客户机上遇到嵌套虚拟化问题的人。诚然,这只是一个极端情况,但我看到其他人也遇到了同样的挑战。