Kvm 嵌套的 Virtualbox Windows 来宾

Joe*_*Joe 4 virtualbox ubuntu kvm-switch

我的设置是:

  • L0:KVM,ubuntu
  • L1:Windows 10
  • L2:Virtualbox (ubuntu) 或 Bluestacks (Android Emulator)

症状:

  • Bluestacks 抱怨 Hyper-V 已启用且无法启动,即使它不在 Windows 的“附加功能”中。
  • 一旦我运行一个新的 VM,Virtualbox 将重新启动整个 Windows 来宾。我试过基本上改变我能找到的每一个设置。

我确实启用了嵌套:

$ systool -m kvm_intel -v | grep nested
    nested              = "Y"
$ cat /sys/module/kvm_intel/parameters/nested
Y
Run Code Online (Sandbox Code Playgroud)

在我的 VM 配置中('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>
Run Code Online (Sandbox Code Playgroud)

L1 来宾中的 systeminfo 说:

Hyper-V Requirements: A hypervisor has been detected. Features required for Hyper-V will not be displayed.
Run Code Online (Sandbox Code Playgroud)

知道为什么我不能使用 Windows 主机在 L2 上实现嵌套虚拟化吗?

小智 5

在这个特定问题上花了太长时间后,我找到了一个解决方案。我也遇到了在 Windows Server 2019 VM 来宾上运行嵌套虚拟化的问题。安装 HyperV 后,我的 VM 将无法启动。

在这种特殊情况下,我使用 KVM/Qemu 作为我的 L0 管理程序运行 Linux,并运行我需要运行 docker 的 Windows Server 2019 VM。我们的一个客户有一组 PowerShell 脚本,用于设置 docker 开发环境(我非常不喜欢以 Windows 为中心的环境)。

首先,我确认我的kvm-intel内核模型启用了嵌套虚拟化支持:

cat /sys/module/kvm_intel/parameters/nested
Run Code Online (Sandbox Code Playgroud)

所以这不是问题,但值得一提的是,这是支持 KVM/Qemu 设置的嵌套虚拟化所必需的。

实际的解决方案是从(默认)更改我在 Virt Manager 中的 CPU 配置

<cpu mode="host-model" check="partial"/>
Run Code Online (Sandbox Code Playgroud)

到:

<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>
Run Code Online (Sandbox Code Playgroud)

这迫使我的 CPU 模型Skylake-Client-noTSX-IBRS代替Skylake-Client-IBRS(这是默认值)。出于某种原因,TSX 给我带来了严重的问题。

<feature policy="disable" name="hypervisor" /> 使 Windows “认为”它不是作为 VM 运行的。

<feature policy="require" name="vmx" />强制vmxCPU 功能允许 Windows Server 2019 VM 本身能够运行其他 VM。

如果您查看 Windows 任务管理器(从 VM 内部),您会看到 Windows 认为处理器是裸机处理器(与虚拟处理器相反),同时具有虚拟化支持。此时,II 可以为 Windows 安装 Docker 并开始使用它。设置是:

  • L0:Linux(KVM/Qemu)
  • L1:Windows Server 2019 (HyperV)
  • L2:码头工人

我希望这可以帮助其他人在 KVM 中运行的 Windows 来宾上遇到嵌套虚拟化问题。无可否认,这是一个边缘案例,但我可以看到其他人遇到了同样的挑战。


Mic*_*ton 2

要让 Hyper-V 在 KVM 虚拟机中工作,您需要按原样传递主机 CPU 模型,并禁用(虚拟 CPU 的)管理程序 CPU 功能。您的虚拟机 XML 应如下所示:

  <cpu mode='host-model' check='partial'>
    <model fallback='allow'/>
    <feature policy='disable' name='hypervisor'/>
  </cpu>
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用 Q35 芯片组创建 VM,而不是 i440fx。理想情况下,来宾应该使用 UEFI 启动。如果您使用 BIOS 启动,则需要 SeaBIOS 1.10(我想,已经有一段时间了)或更高版本。对于 Ubuntu,这意味着 Ubuntu 18.04 LTS 或更高版本。