我试图更好地了解虚拟机管理程序的工作原理。我知道一次只有一个管理程序可以使用 CPU 的虚拟化支持。我还知道 Hyper-V 是一种 1 型虚拟机管理程序,因此当启用它时,它会先于 Windows 进行“启动”,然后将 Window 作为具有硬件特权访问权限的特殊 VM 运行。
Hyper-V 支持嵌套虚拟化,通过(以某种方式)向其来宾公开虚拟化扩展,但据我所知,它仅在来宾也使用 Hyper-V 时才有效。我想知道这个限制的原因,为什么另一个管理程序(例如 VirtualBox)不能使用公开的虚拟化扩展?
这个问题和我的很相似,但没有令人满意的答案。
编辑: 我认为它无法完成的原因(因此我问为什么)是:
- 它写在官方微软页面上:
Hyper-V 虚拟机不支持 Hyper-V 以外的虚拟化应用程序,并且很可能会失败。这包括任何需要硬件虚拟化扩展的软件。
公开虚拟化扩展的命令明确要求您将其指向 Hyper-V VM:Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
EDIT2: 抱歉,由于我缺乏理解,我无法清楚地表达这个问题。我会尽量说清楚。这就是我想做的:
引用微软页面:
Hyper-V 向其虚拟机公开硬件虚拟化扩展。启用嵌套后,来宾虚拟机可以安装自己的管理程序并运行自己的来宾 VM。
这一点,再加上Windows Root OS本身就是一个特殊的 VM 这一事实让我相信我应该能够向主要的Windows Root OS公开虚拟化扩展,并使用它们在其中运行另一个管理程序。
在搜索如何操作时,我遇到了这个命令:
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
它需要VMName。
- 我现在所了解的是,Hyper-V 让您可以将虚拟化扩展公开给您选择的其中一个 VM,但您不能选择Windows Root OS(为什么?)。在选定的 VM 中,您可以正式使用 Virt。分机。与另一个 Hyper-V 实例一起使用,但它也可能与其他管理程序一起使用。
- 当我第一次问这个问题时,我没有意识到您可以在Windows 根操作系统中打开的Hyper-V 管理工具在运行Windows 根操作系统本身的同一级别零 Hyper-V 上运行。我认为它在另一个 Hyper-V 实例上运行,加上需要 Hyper-V VM 名称的命令让我相信它只能通过两个 Hyper-V 管理程序来完成。
总而言之,我的问题实际上是一个两部分的问题:
- 您能否在支持 Hyper-V 的 VM 中嵌套非 Hyper-V 管理程序?答案是:它没有得到明确支持,但它应该/可能有效(请参阅已接受的答案)。
为什么不能将虚拟化扩展公开给Windows 根操作系统?答案是:
[@harrymc] 虚拟化扩展始终对根操作系统可见,因为它们是 CPU 的一部分,并且所有硬件始终传递给该操作系统,没有任何内容是虚拟化的。Set-VMProcessor 不适用,因为它不是真正的 VM,或者您可能会说它是一种特殊且微不足道的半 VM。
[我] 所以 root 操作系统已经可以看到 virt.ext。“直接”(因为它可以看到所有其他硬件)但它不能将它们用于(比方说)VirtualBox,因为它们已经被 Hyper-V 使用。如果我用 virt.ext 创建一个“正常”的 Hyper-V VM。启用然后在其中我应该能够运行另一个管理程序,对吗?
[@harrymc] 是的,这就是它的工作原理。
嵌套虚拟化 不需要您运行相同的管理程序,因为它只意味着通过 Intel VT-x 或 AMD-V CPU 扩展。尽管可能,但这并不意味着嵌套不同的管理程序很容易,因为相关公司并未正式支持这一点。
使用不同的虚拟机管理程序,您将遇到硬件支持问题,因为每个虚拟机管理程序都会创建不同的虚拟设备,这些虚拟设备可能不受支持,或者在其他虚拟机管理程序或目标 VM 上有驱动程序。
例如,Hyper-V 将网络适配器作为绑定到 Hyper-V 虚拟网络交换机的虚拟网络适配器向虚拟机公开。这意味着无论服务器中实际安装了何种类型的网络适配器,嵌套的管理程序都需要 Microsoft Hyper-V 网络适配器或 Microsoft 旧版网络适配器的驱动程序,VMware 可能不支持这些驱动程序。即使存在正确的驱动程序,通过多个仿真层传递设备仿真作为多个设备相互伪装肯定不会有助于提高性能。
这些仿真和性能问题的一种解决方案是使用离散设备分配,即硬件直通。Windows Server 2016 中引入了离散设备分配,因此对于嵌套虚拟化,例如,基于 PCIe 的网络适配器可以直接映射到运行虚拟化管理程序的 VM。这样可以省去虚拟设备驱动程序,让设备厂商的设备驱动程序在来宾虚拟机内部正常安装。
虽然离散设备分配解决了一些问题,但它们也产生了新的问题和限制。例如,在 Hyper-V 中,分配了此类设备的虚拟机可能不支持保存/恢复、实时迁移或动态内存的使用,也无法添加到故障转移群集。(这些限制在未来可能会消失,因为这个领域仍在发展。)
还有报道称,一些多供应商嵌套管理程序环境需要为在嵌套管理程序内运行的任何虚拟机启用嵌套。这意味着嵌套的管理程序运行没有问题,但虚拟机将无法启动,直到在 VM 级别安装管理程序。
由于上述考虑因素以及我未列出的其他因素,让相互竞争的虚拟机管理程序协同工作并非易事。即使在安装了嵌套管理程序之后,您也可能需要大量试验和错误才能使虚拟机以可靠和高性能的方式运行。
最后,为了支持我关于不同的管理程序可以嵌套的断言,这里有一些文章说明了如何做(尽管我没有测试过其中任何一个):