之前因为不熟悉Hyper-V,有些功能不会用,因而一直在说 不要使用Hyper-V,会变得不幸 。由于最近需要一个vscode来读代码,在被RK3328+eMMC这种更加不幸的组合折磨之后,决定回过头来看看能不能把之前遇到的问题解决。功夫不负有心人,误打误撞之下,最终还是找到了解决方案。

前情提要:Hyper-V自带了一个用于虚拟机与主机通信的默认交换机,但是该交换机不支持网段配置,每次重启会在10.0.0.0网段下随机选一个子网段给当前DHCP用于分配IP。于是为了获得可以稳定访问的虚拟机IP,就不能使用默认交换机,必须自己单独配一个固定网段,然后给虚拟机分配静态IP。

然后又来到了万能的StackOverflow:网友指出,在已经启用了Hyper-V的情况下,通过PowerShell调用系统接口,可以创建指定网段的NAT,无需配置网关即可访问外网,具体步骤如下:

New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
Get-NetAdapter       // (note down ifIndex of the newly created switch as INDEX)
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex <INDEX>
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24

其中关键在于最后一步New-NetNat。前面几步分别可以通过在Hyper-V图形管理界面中新建虚拟网卡,以及直接在控制面板中修改对应虚拟网卡的IP完成。

创建完虚拟NAT并修改虚拟网卡的IP之后,在虚拟机中配置静态IP,并将网关设置为主机的虚拟网卡IP,就可以实现虚拟机连通外网了。

这里顺便说一下Hyper-V中的三类虚拟网卡,这篇文章及其配图做了一个还比较好的解释。三种可以在Hyper-V中创建的虚拟网卡分别是外部、内部和私有网卡,特征大致如下:

  • 外部网卡(External):虚拟机直接连通外网,虚拟机与主机处于同一网络层级(都直接获取上层路由器的IP,如果是需要登录的网络,则相当于使用了新设备,需要重新登录);
  • 内部网卡(Internal):虚拟机只连通主机,不连通外网;
  • 私有网卡(Private):虚拟机间相互连通,不连通主机和外网。

需要注意的是,Hyper-V中只有默认的虚拟网卡才带DHCP,所有自己创建的虚拟网卡都是不提供DHCP服务的,只能配静态IP或者自己部署一个DHCP服务端。

之前由于没有搞清几类虚拟网卡的区别,一直在用外部网卡,加上恰好手头的网络是要登录才能使用的,折磨了老久都没用;然后换了内部网卡又不知道要配NAT,属实是十分的不幸了。

标签: none

添加新评论