坑边闲话:在前作中,我描述了如何用 Hyper-V 替代 VMware Workstation Pro 来承载 OpenWrt 虚拟机,以实现 10Gb 万兆虚拟网络。效果确实很好,而且占用更少。然而在文章最后我也提到了,这种模式有一些弊端,那就是 OpenWrt 的代理无法给 VMware 的虚拟机用。这是因为这两套虚拟平台并不互通。加上 Hyper-V 的弱鸡 Linux 桌面,我们不得不考虑让 VMware 虚拟机利用 Hyper-V 里的 OpenWrt.

其实这个问题很通用,往大了说就是如何在两套虚拟化平台间建立通信。

1. 背景知识·

首先要明白,开启了 Hyper-V 之后,你的 Windows 就不再是以前那个 Windows 了。有人说开启了 Hyper-V,你的电脑就变成了一个虚拟机,所以游戏性能什么的会大大下降。这么说也不全错,毕竟微软文档有提到过这个问题,特别是在外设的 I/O 速度方面,确实有这部分问题,但是也不至于“大大降低性能”。

注意

开启了 Hyper-V 之后,在 Windows 10 21H1 上还是可以用 VMware 的,但是不能像以前那样开启虚拟机的某些虚拟化选项了。除了 IOMMU 之外的另外两项 CPU 虚拟化功能都无法开启,其中就包括 Intel VT-x/EPT 功能。这对于某些需要在虚拟机里用 KVM/Qemu 的小伙伴可能有点影响,不过我也没仔细测试,这一点只能给大家提个醒

2. 通信建立·

回归正题,如何让两套虚拟化平台建立通信呢?

Hyper-V 建立一个内部网络(用符号 Ethernet_LAN 表示),这时 Hyper-V 会给你的 Windows 分配一个接入了 Ethernet_LAN 的一个虚拟网卡。我们将这个虚拟网卡命名为 vEthernet_LAN,该网卡的 MAC 地址一般是 00:15:5D 开头,如图 1 所示。

给 Hyper-V 里的 OpenWrt 分配一个虚拟网卡,并连接到上述的那个内部网络 Ethernet_LAN.

在 Hyper-V 里的 OpenWrt 里,将属于 Ethernet_LAN 的那个虚拟网卡设为 LAN 口,或者桥接到 br-LAN 里。

开启 OpenWrt 的 br-LAN 的 DHCP 功能。这样你主机的 vEthernet_LAN 虚拟网卡就能获得一个来自 OpenWrt 虚拟机的 IP 地址。

【重点!】在 VMware 的虚拟网络编辑器里,创建一个桥接网络,桥接对象正是步骤 1 里主机获得的 Hyper-V 虚拟网卡 vEthernet_LAN. 这样一来,你的 VMware 就能复用这张虚拟网卡,接入了 Hyper-V 的网络~~

图 1. Hyper-V 提供的虚拟网卡的 MAC 地址前缀。

图 2. Hyper-V 虚拟网卡。

图 3. VMware 创建桥接网络。

3. 网络测试·

让我们测试一下 VMware 的虚拟机能否上 Google~

看图:

图 4. 仅分配一个虚拟网卡的 Manjaro 成功通过 Hyper-V 里的虚拟机实现了 Google 访问。

图 5. 网卡确实只有一个。

图 6. VMware 的虚拟机确实可以访问到 Hyper-V 里的 OpenWrt 虚拟机。

总结·

如此一来,我们就简单地实现了网络升级,并且原有的开发环境并没有发生太多变动。

  • Hyper-V 承担代理,开启自启虚拟机顺滑无比;
  • VMware 承担 Linux 虚拟机托管,图形界面非常精细;

总之就是非常 nice,而且没什么瓶颈。最后,感谢 Mr. Zhao 师兄给我提的 idea,虽然那个操作比较有点不对口,不过也启发了我想到这个方法。