我正在使用systemd-networkd在所有节点上使用Debian Bullseye为KVM(基于内核的虚拟机)配置由libvirt管理的网络接口。我想在使用Linux Bridge的虚拟机上支持透明 VLAN 。对于 Linux Bridge,这不受libvirt支持。
例如,我有一个虚拟机,其三个接口连接到网桥:
host ~$ virsh attach-interface guest-vm bridge br0 --config
host ~$ virsh attach-interface guest-vm bridge br0 --config
host ~$ virsh attach-interface guest-vm bridge br0 --config
现在,当运行来宾时,我将在桥上看到:
host ~$ sudo bridge link
3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
30: vnet13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
31: vnet14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
32: vnet15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
所有接口都成功连接到网桥。enp1s0是主机上的上行链路接口。现在查看网桥上的 VLAN id 时,我看到:
~$ sudo bridge vlan
port vlan-id
enp1s0 10
26
30
50
仅显示主机接口及其 VLAN id。
有没有办法将 VLAN id 附加到vnet*
来宾的其他接口,以便它可以使用它们?
我已经解决了这个问题并找到了解决方案。手动添加 VLAN id 到网桥的从接口是没有问题的,例如:
问题是在虚拟机启动时自动执行此操作。幸运的是libvirt支持libvirt 挂钩脚本。我将使用qemu的钩子脚本并分三步完成。
第 1 步:定义哪个 VLAN-ID 连接到哪个接口
为此,我们为自定义元数据提供了域 XML 格式的额外元素 <metadata>。我们可以简单地将信息添加到域(虚拟机)的静态配置中:
正如文档所给出的,我必须使用我自己的自定义命名空间
<my:home xmlns:my="http://hoeft-online.de/libvirt">
。一旦创建,在命名空间中工作就更容易了:步骤 2:从域的运行时 XML-config 获取启动信息
挂钩脚本获取有关其标准输入的信息。这是正在运行的 VM 的 XML 配置。我们也可以
virsh dumpxml guest-vm
在虚拟机运行时获取它。我将 XSLT 与xmlstarlet一起使用,以通过 xsl 样式表获取所需的信息。我可以测试:这是样式表:
第 3 步:将 VLAN-ID 设置为动态虚拟网络接口 vnet *
使用样式表中的信息,我们现在可以使用挂钩脚本设置网络接口。使其可执行。
感谢@Ingo 的想法,虽然他的(可能)解决方案效果很好,但我真的不想使用 xmlstarlet,因为它不在 Centos Stream 9 的存储库中。
无论如何,我使用了 Ingos 的想法并在 python 中实现了它。唯一需要的是python。
https://github.com/modzilla99/libvirt-vlans