今年早些时候,微软宣布 Hyper-V 将开始支持嵌套虚拟化,以让大家可以在 Hyper-V 虚拟机中运行 Hyper-V 容器,而在刚发布的 Windows 10 Build 10565 中微软已经开始提供嵌套虚拟化功能的早期预览。之所以说是”早期预览”表明目前已经有许多已知问题,而且功能还并没有完善,只提供给专业人士提前了解功能。
什么是嵌套虚拟化?
之前我们曾提到过 Hyper-V 需要依靠硬件虚拟化支持(Intel VT-x 或 AMD-V)来运行虚拟机,而不允许在虚拟机中再安装 Hyper-V 进行嵌套。而使用嵌套虚拟化技术则可以将硬件虚拟化层暴露给 Guest OS,这就使得我们可以在 Hyper-V 的 Guest OS 再安装 Hyper-V 来跑虚拟机。
在下图中,我们可以看到目前 Windows 10 Build 10565 Hyper-V 中的 Guest OS 中已可再安装 Hyper-V 嵌套虚拟化出来一个 Windows 10。
原理示意
通常情况下 Hyper-V 的 hypervisor 层会完全控制虚拟化扩展,不会暴露给 Guest OS。
而在启用嵌套虚拟化之后,Hyper-V 的已经配置虚拟化扩展可直接暴露给 Guest VM,而 Guest VM 可使用这个特性安装自己的虚拟机管理程序来跑 Guest OS。
已知问题
就像前面所说,该功能是只一个预览功能,不应当在生产环境中进行使用,以下列出已知问题列表:
- 要使用嵌套虚拟化,Hyper-V 及 hypervisors 层必需都是最新版本,也就是说目前还不支持 Build 10565 之前的 Hyper-V
- 启用嵌套虚拟化功能的 VM (目前)不能再启用:动态内存、内存热插、实时迁移、保存和恢复及快照功能
- 目前嵌套虚拟化功能与 Virtualization Based Security (VBS) 功能有冲突,启用前必需先禁用 VBS
- 目前只支持 Intel 的硬件虚拟化技术,因此 CPU 必需支持 Intel VT-x (AMD CPU 悲催了)
- 嵌套虚拟化需要大内存支持,想必这个不说大家都应该能够明白
启用Hyper-V嵌套虚拟化
1 创建一个虚拟机
2 运行启用脚本
该脚本会自动检测当前 Hyper-V 配置,对不满足条件的配置进行更改(例如禁用动态内存),再启用虚拟机的嵌套虚拟化功能。
Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/master/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile ~/Enable-NestedVm.ps1 ~/Enable-NestedVm.ps1 -VmName
注意:虚拟机必需为关闭状态
3 在 Guest VM 中再安装 Hyper-V
4 启用网络(可选)
一旦启用 Guest VM 嵌套虚拟化,则必需启用 MAC spoofing 功能之后 Guest VM 里面的 Guest OS 网络才能正常工作。
Set-VMNetworkAdapter -VMName -MacAddressSpoofing on
5 最后我们就可以创建嵌套的 Guest OS 啦。