libvirtd 中使用 VLAN (VMM)

现在有一个需求,想要将 libvirtd 中管理的虚拟机和以太网某一个特定的 VLAN 连接。

太长不看版:

  • 使用 NetworkManager 中的 nmtui 工具管理网桥和 VLAN (GUI中没有实现此功能)
  • 在 VMM 中添加网络设备, Network Source 选择 Specify shared devices name,然后输入网桥的名字
  • 网桥中,需要设置 “Group forward mask” 为 65528 ,否则 DHCP Discover 等广播报文无法通过网桥

下面开始罗嗦的正文了。

最开始打算用 ifupdown 脚本之类,以及 vconfig 、 brctl 之类的工具处理这个事情。不过后来想了想,这些工具早就落伍了,看了红帽的资料, NetworkManager 是可以配置 VLAN 的,不如直接在这上面配置。

然后高高兴兴的在托盘里面打开 NetworkManager 的管理界面,发现虽然红帽中说有 VLAN 管理,但实际上并不行……可能是因为我用的 openSUSE 吧,然后发现了 nmtui 这个工具,它可以在终端中配置 NetworkMag吧aner。

于是乎在其中新建了一个 VLAN 配置,Parent 指定为那个物理网卡, VLAN 指定为 3 , Active 后手动配置上一个 IP ,连通成功。

之后尝试把它连入虚拟机,最开始是用 brctl 建立网桥并把那个 VLAN 接口加进去,不过在虚拟机启动后,似乎并不能顺利连接。想到 NM 实际上有管理网桥的功能,因此直接在里面新建一个网桥并在网桥中新建一个 VLAN 接口,再把虚拟机接在这个 Bridge 上,虚拟机/宿主机/对端之间就可以相互 Ping 通了。

要注意的是,我用了小米路由器 Mini 作为一个 VLAN 交换机,最开始我把 VLAN 号指定为 10 ,此时怎么搞都通不了,后来改成 3 就好了。怀疑两个原因:一是交换机芯片不支持这么多 VLAN (不过怎么想也不可能吧?);另一个是 10 进制 / 16 进制的问题。这个等以后再研究吧。

还有就是,最开始我把 enp0s31f6 直接用 macvtap 接进来了,在虚拟机中添加 VLAN 接口,好像并不管用。个人猜测应该是宿主机开启了 802.1Q 后,打 Tag 的包就直接丢进对应接口了,所以并没有机会进入虚拟机。

另外我看到 VMM 似乎已经可以使用 SR-IOV 技术了,相比于网桥,这一技术应该可以极大的提高网络性能,很棒。

发表评论