由于Hyper-V的特殊性,为了实现嵌套虚拟化,必须虚拟机也使用Windows+Hyper-V。

由于微软留下的大坑:

Virtualization applications other than Hyper-V are not supported in
Hyper-V virtual machines, and are likely to fail. This includes any
software that requires hardware virtualization extensions.

无法在Hyper-V的虚拟机内使用vmware/solusvm等其他虚拟化软件,之前在这里纠结了半天,明明实体机/vmware上的centos正常运行,在虚拟机内就行不通了。
因此我需要使用Windows+Hyper-V来实现嵌套虚拟化。其效果如下:
嵌套虚拟机

以下是实现的流程

开启嵌套虚拟化

在第一层母鸡创建虚拟机,然后以管理员身份运行:

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true

使用:

Get-VMProcessor -VMName test | fl

查看
ExposeVirtualizationExtensions 显示为True即可。

然后在小鸡的Windows里开hyper-v虚拟机正常的话,说明嵌套虚拟化开启成功。
在小鸡的linux内使用lsmode查看是否有kvm来确认是否开启了嵌套虚拟化。只不过hyper-v只能嵌套hyper-v,而hyper-v只能在Windows上使用,所以linux开嵌套虚拟化没有意义。

nat交换机

因为我只有一个公网ip,因此需要Hyper-V+nat交换机,才能正常上网。
微软官方文档中有介绍Hyper-V配置NAT网络的详细步骤:
打开设备管理器,选择添加过时硬件——选择“安装我手动从列表选择的硬件”,在“常见硬件类型”中选择“网络适配器”——厂商选择“Microsoft”,型号选择“Microsoft KM-TEST回环适配器”,单击下一步,按照所给出的提示Windows将自动安装这个设备。
Microsoft KM-TEST回环适配器
打开Hyper-v ——点击——虚拟机交换机管理器选项,选择——外部——虚拟交换机,再点击创建虚拟交换机——指定虚拟交换机名称——“外网交换机”——使用“Microsoft KM-TEST回环适配器”,就可以在使用虚拟机时使宿主机和虚拟机在同一个虚拟的局域网内,并且由宿主机模拟出的交换机访问外网。
新增虚拟交换机
打开“网络和共享中心”,——“更改适配器选项”。选择你现在能连接网络的网卡(也就是装Hyper-V之前的网卡),右键“属性”——“共享”一栏,勾选上“允许其他网络用户通过此计算机的Internet连接来连接”。家庭网络连接——选择刚才新建的那个“外网交换机”。我的Windows server 2019已经没有家庭网络连接这个选项了。可以不用。
Internet连接共享

到时候可以直接创建虚拟机的时候选择这个网卡,类似VMware的nat网络。

端口映射

虽然netsh是可以端口映射,但为了开机自启可用,还是使用Windows防火墙吧,Windows防火墙也是可以实现端口映射的,配合端口映射+hyper-v开的小鸡是可以实现开nat小鸡的目标。
Windows server2019的防火墙已经删掉这个功能了,最少我没找到。
幸好我找到一个国人写的工具,感觉不错。(我不用netsh就是因为没法可视化)

https://github.com/zmjack/PortProxyGUI

下载,打开用就行。
监听本地端口 - 虚拟机内系统的ip即可,例如192.168.137.49,二层Windows虚拟机应该能ping通nat网卡下的三层ip.
最后效果如下所示:
外部访问嵌套后的nat小鸡


参考:
Run Hyper-V in a Virtual Machine with Nested Virtualization
借助嵌套虚拟化在虚拟机中运行 Hyper-V
Hyper-v 开启嵌套虚拟化的方法
Hyper-V桥接方法和NAT网络地址转换配置方法
Set up a NAT network

最后修改:2020 年 09 月 17 日 08 : 41 PM