libvirt TCP隧道networking仅适用于2个虚拟机

我正在使用libvirtqemu驱动程序)设置一些虚拟机。 一台虚拟机就是网关,因此configuration了两个networking接口。 一个接口连接到我的真实LAN,另一个使用TCP隧道(服务器模式):

<!-- External interface - ie facing the Internet --> <interface type='direct' trustGuestRxFilters='no'> <source dev='eth0' mode='vepa'/> </interface> <!-- Virtual network --> <interface type='server'> <source address='0.0.0.0' port='5558'/> </interface> 

然后,我有两个其他的虚拟机(称为test_1和test_2)几乎相同(当然除了UUID,MAC和主机名)。 那些只有使用虚拟TCP隧道networking的networking接口:

 <interface type='client'> <source address='127.0.0.1' port='5558'/> </interface> 

现在,网关虚拟机应该向虚拟networking上的所有虚拟机分发IP地址,但是只有在首先启动的testing虚拟机上才会这样做。 另外,如果两者都在运行,并且closures了当前具有IP的那个,则另一个将获得IP。

我不认为这是DHCP的问题,因为我可以看到,第二个testingVM甚至不向网关发送DHCP请求。 另外在第二个虚拟机上设置一个静态IP也没有帮助。

毕竟看起来只有一个虚拟机作为虚拟networking的客户端,而另一个虚拟机根本不连接到虚拟networking。 但是检查主机上的连接,我可以看到testingVM的两个qemu进程都有TCP隧道向网关的主机进程打开。

我真的无能为力 什么可能是错误的,或者我可以尝试接下来的任何build议?

编辑:有趣的是看看主机系统上的实际连接:

 qemu-syst 2900 libvirt-qemu 12u IPv4 22574 0t0 TCP *:5558 (LISTEN) qemu-syst 2900 libvirt-qemu 17u IPv4 22639 0t0 TCP localhost:5558->localhost:38714 (ESTABLISHED) qemu-syst 2946 libvirt-qemu 12u IPv4 21820 0t0 TCP localhost:38714->localhost:5558 (ESTABLISHED) qemu-syst 2967 libvirt-qemu 12u IPv4 21835 0t0 TCP localhost:38717->localhost:5558 (ESTABLISHED) 

看起来服务器(进程2900)只接受来自第一VM的连接(进程2949)

在查看libvirt和qemu的代码后,我发现这是预期的行为(至less通过qemu)。 libvirt将TCP隧道选项传递给qemu的-net开关。 单客户行为似乎已经被这个补丁引入[1]。 qemu的代码显然只能同时接受一个客户端。

尽pipe如此,libvirt的文档听起来像可能有多个客户端。 所以要么必须实现function,要么开发人员必须修改文档。

[1] https://libvirt.org/formatdomain.html#elementsNICSTCP