KVM来宾和主机之间的巨型帧?


11

我正在尝试为KVM guest虚拟机和主机系统之间的存储通信实现9000字节的MTU。主机有一个br19000字节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

来宾具有连接到此网桥的接口,该接口也具有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

我可以从主机向访客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

但是,如果我将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

数据包跟踪显示这些数据包从未到达访客。我读到的所有内容都表明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

主机上VM的tun接口上的MTU是多少?
mgorven

也就是9000字节;我已经与输出更新的问题brctl,并ip addr show针对该接口。
larsk's

究竟是什么主机系统?
迈克尔·汉普顿

Arch Linux,具有Linux 3.6.10(x86_64),qemu-kvm 1.2.0,libvirt 1.0.1。
larsk's

Answers:


7

虽然这是一个MTU问题,但事实证明,它与任何组件设备上的MTU设置无关。正如我在原始问题中所示,主机桥,主机tun接口和来宾接口都具有相同的MTU设置(9000字节)。

实际的问题是libvirt / kvm配置问题。默认情况下,libvirt的并没有使用virtio设备。如果没有明确的配置,您最终将获得RealTek RTL-8139 NIC。该虚拟NIC 不支持巨型帧

要使用virtio设备,您需要指定一个显式模型。使用时virt-install

virt-install ... -w bridge=br1,model=virtio

或在事实之后,通过将<model>标签添加到<interface>域XML中的适当元素来实现:

<interface type="bridge">
  <model type="virtio"/>
  <source bridge="br1"/>
  <target dev="vnet2"/>
</interface>

进行此更改后,一切都会按预期进行。


0

为了使更大的MTU工作,整个堆栈必须具有更高的MTU,其中包括客户机,tapdev和桥所连接的物理NIC(如果您在途中有绑定和VLAN,它们也是如此)


您是否知道例如GigaEthernet等特定示例是自动协商的结果?这篇文章可能是重复的:google.com/...
ArrowInTree

不,必须手动完成,所有堆栈均设置为任何给定组件的最高MTU
dyasny 2012年

是的,我意识到这一点;到处都有详细的记录。从问题中可以看出,来宾,tapdev和网桥的MTU都较高。您在我提供的示例中看到任何配置错误的内容吗?
larsks 2012年

要使用非默认MTU设置,所有内容都必须遵守非默认MTU。从上到下,应该是来宾NIC,分接头,网桥,网桥下的eth(+ vlan +键),当然还有交换机端口。几分钟前,我已经对其进行了测试,它可以在带有kvm的RHEL上完美运行
dyasny 2012年

是的,我想我已经在问题中清楚地表明了堆栈各个部分的价值。您是否看到任何丢失的信息或配置不正确的信息?
larsk's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.