参考资料

微软官方文档说明的已经很详细了,包括其中网络部分的设置

https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/user-guide/enable-nested-virtualization#networking-options

环境准备

先在Windows可选功能中将Hyper-V管理平台勾选上,重启电脑后确保可以正常使用Hyper-V创建虚拟机。

创建一个Hyper-V虚拟机,准备安装PVE,我这里虚拟机起名为pve

开启嵌套虚拟化

以管理员身份开启一个PowerShell

1
2
3
4
5
6
7
8
9
10
11
12
13
# 获取当前所有虚拟机
Get-VM

# 查看虚拟机处理器相关信息
Get-VMProcessor -VMName pve | fl
# 可以看到 ExposeVirtualizationExtensions: False

# 开启嵌套虚拟化
Set-VMProcessor -ExposeVirtualizationExtensions $true -VMName pve

# 确认是否成功开启
Get-VMProcessor -VMName pve | fl
# 可以看到 ExposeVirtualizationExtensions: True,嵌套虚拟化已成功开启

开启MAC地址欺骗

PVE安装成功后,创建一个虚拟机或LXC容器,发现无法联网。还需要对虚拟交换机的端口组开启MAC地址欺骗功能。

原因分析

Hyper-V虚拟交换机只能感知到Hyper-V虚拟机的MAC地址,无法感知到嵌套的虚拟机上的MAC地址,所以数据包通信到达宿主机后,找不到嵌套虚拟机的MAC地址,故产生了丢包。

解决方案

1
2
3
4
5
6
# 获取Hyper-V虚拟机网卡的Mac地址
Get-VM -Name pve | Get-VMNetworkAdapter
# 我这里的Mac地址为 00155DF2C602

# 开启MAC 地址欺骗
Get-VM -Name pve | Get-VMNetworkAdapter | Where-Object { $_.MacAddress -eq "00155DF2C602" } | Set-VMNetworkAdapter -MacAddressSpoofing On

重启PVE宿主机后可以发现虚拟机可以正常联网了。