我已经设置了我认为是标准的 qemu bridge/ubuntu tap 接口,在我的 Ubuntu 主机上运行各种虚拟机。我遇到问题的所有虚拟机都是 Windows 映像。
我研究这个问题已经好几个星期了,尝试了所有我能找到的方法,从混杂模式到 txqueuelength 到唯一/不同的 VLAN 到静态定义 tap 接口到各种 sysctl 设置到各种 /proc 设置等等等等。但没有任何效果。
当我打开单个图像时,TAP 工作正常。但是两个、三个、四个,以及不可避免的一个或多个会失败,并且在 Ubuntu 中,您可以看到它只是丢弃了所有数据包。我必须解决这个问题。我知道我提供的具体信息很少,但我需要有人问一些问题,这样我才能发布相关的答案。
有人知道为什么 Ubuntu + bridge + tap + qemu + virtio + Windows 7 会丢包并且出现网络故障吗?有人能告诉我一个我还没试过的方法吗?
我可以提供这种程度的详细信息。这基本上就是正在发生的事情。它会在一段随机的时间内正常工作,然后开始丢弃传输数据包。一旦发生这种情况,它就永远无法恢复:
tap1 Link encap:Ethernet HWaddr 9a:14:12:5c:12:27
inet6 addr: fe80::9814:12ff:fe5c:1227/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3466 errors:0 dropped:0 overruns:0 frame:0
TX packets:16748 errors:0 dropped:232 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:319576 (319.5 KB) TX bytes:23245045 (23.2 MB)
更新:
- 不是路由器的问题,我试过三个了。
- 不是以太网卡的问题。我有两张,都试过了。
- 这不是“ethtool”卸载设置的问题。我尝试将它们全部关闭。
iptables -I FORWARD -d 255.255.255.255 -j ACCEPT
没有解决问题。- /proc/sys/net/bridge 中的设置已经正确。
- 将卡设置为混杂模式(或桥接模式)并不能解决问题。
- 增加 tap、br 和 eth 中 txqueuelen 的长度也无济于事。
答案1
好的,感谢 Bridge 团队,我找到了答案。我的主要问题是我没有意识到“TX 队列”意味着 Bridge 正在向客户机(即 Windows virtio 驱动程序)传输数据。基本上,我使用的 Windows virtio 驱动程序崩溃了。我被指出了这些:
https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/1325560
https://bugzilla.kernel.org/show_bug.cgi?id=42829
我小心地访问了 virtio 网站并下载了最新的驱动程序,卸载了我的虚拟机上的驱动程序并重新安装了最新的驱动程序,它似乎可以正常工作。