我正在使用 libvirt(qemu 驱动程序)设置一些虚拟机。其中一个虚拟机用作网关,因此配置了两个网络接口。一个接口桥接到我的真实 LAN,另一个使用 TCP 隧道(服务器模式):
<!-- External interface - i.e. 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 隧道网络的网络接口:
<interface type='client'>
<source address='127.0.0.1' port='5558'/>
</interface>
现在网关虚拟机应该向虚拟网络上的所有虚拟机分发 IP 地址 - 但它只向首先启动的测试虚拟机分发 IP 地址。此外,如果两个虚拟机都在运行,并且我关闭了当前具有 IP 的虚拟机,则另一个虚拟机将获得 IP。
我不认为这是 DHCP 的问题,因为我可以看到第二台测试虚拟机甚至没有向网关发送 DHCP 请求。在第二台虚拟机上设置静态 IP 也无济于事。
毕竟,看起来只能有一个虚拟机作为虚拟网络的客户端,而另一个虚拟机根本没有连接到虚拟网络。但检查主机上的连接后,我可以看到测试虚拟机的两个 qemu 进程都打开了通往网关主机进程的 TCP 隧道。
我真的一无所知。有什么建议可以告诉我哪里出了问题或者我下一步该怎么做吗?
编辑:看看主机系统上的实际连接很有趣:
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)只接受来自第一个虚拟机(进程 2949)的连接
答案1
在研究了 libvirt 和 qemu 的代码后,我发现这是预期的行为(至少 qemu 是这样的)。libvirt 将 TCP 隧道选项传递给 qemu 的 -net 开关。单客户端行为似乎是由这个补丁 [1] 引入的。此外,qemu 的代码显然一次只接受一个客户端。
尽管如此,libvirt 的文档听起来好像可能有多个客户端。因此,开发人员必须实现该功能,或者必须调整文档。