lar*_*sks 11 networking linux bridge mtu kvm-virtualization
我正在尝试实现一个 9000 字节的 MTU,用于 KVM 来宾和主机系统之间的存储通信。主机有一个br1具有 9000 字节 MTU的网桥 ( ):
host# ip link show br1
8: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP
link/ether fe:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ff
inet 172.16.64.1/24 brd 172.16.64.255 scope global br1
inet6 fe80::21b:21ff:fe0e:ee39/64 scope link
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
来宾有一个连接到此网桥的接口,该接口也有一个 9000 字节的 MTU:
guest# ip addr show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ff
inet 172.16.64.10/24 brd 172.16.64.255 scope global eth2
inet6 fe80::5054:ff:fe50:f355/64 scope link
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
我可以从主机 ping 到访客:
host# ping -c4 172.16.64.10
PING 172.16.64.10 (172.16.64.10) 56(84) bytes of data.
64 bytes from 172.16.64.10: icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from 172.16.64.10: icmp_seq=2 ttl=64 time=0.558 ms
64 bytes from 172.16.64.10: icmp_seq=3 ttl=64 time=0.566 ms
64 bytes from 172.16.64.10: icmp_seq=4 ttl=64 time=0.631 ms
--- 172.16.64.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.558/0.727/1.153/0.247 ms
Run Code Online (Sandbox Code Playgroud)
但是,如果我将 ping 数据包大小增加到 1490 字节以上,则不再有连接:
host# ping -c4 -s 1491 172.16.64.10
PING 172.16.64.10 (172.16.64.10) 1491(1519) bytes of data.
--- 172.16.64.10 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3000ms
Run Code Online (Sandbox Code Playgroud)
数据包跟踪显示这些数据包从未到达访客。我读过的所有内容都表明 Linux 桥接接口和virtio网络驱动器都支持巨型帧,但这对我来说肯定是 MTU 问题。
我错过了一些非常明显的东西吗?
更新
显示访客界面的主机端:
host# brctl show
bridge name bridge id STP enabled interfaces
br1 8000.fe540050f355 no vnet2
host# ip addr show vnet2
11: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast master br1 state UNKNOWN qlen 500
link/ether fe:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe50:f355/64 scope link
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
虽然这是 MTU 问题,但事实证明它与任何组件设备上的 MTU 设置无关。正如我在原始问题中所展示的,主机桥、主机 tun 接口和访客接口都具有相同的 MTU 设置(9000 字节)。
实际问题是 libvirt/kvm 配置问题。默认情况下,libvirt的并没有使用virtio设备。如果没有明确的配置,您最终会得到 RealTek RTL-8139 NIC。此虚拟 NIC不支持巨型帧。
要使用virtio设备,您需要指定一个显式模型。使用时virt-install:
virt-install ... -w bridge=br1,model=virtio
Run Code Online (Sandbox Code Playgroud)
或者事后通过向域 XML 中<model>的适当<interface>元素添加标签:
<interface type="bridge">
<model type="virtio"/>
<source bridge="br1"/>
<target dev="vnet2"/>
</interface>
Run Code Online (Sandbox Code Playgroud)
有了这个改变,一切都按预期工作。