虚拟接口+tx+linux,Linux使用笔记: 解决Xen虚拟机中VLAN接口不能ping大包的问题
出于調(diào)試的需要,想在兩個(gè)Xen虛擬機(jī)間使用VLAN相互訪問(wèn)。在Linux上啟用VLAN非常簡(jiǎn)單,只需要使用命令vconfig配置一個(gè)VLAN接口就可以了:
vconfig add eth0 3
ifconfig eth0.3 11.11.4.2 netmask 255.255.255.0 up
刪除VLAN則使用vconfig rem eth0.3。當(dāng)然你也可以在網(wǎng)絡(luò)腳本中配置你的VLAN接口,這樣每次系統(tǒng)啟動(dòng)后會(huì)自動(dòng)配置VLAN接口,具體的配置參見(jiàn)文尾的第一篇參考文檔。
當(dāng)Easwy在兩個(gè)Xen虛擬機(jī)上都配置了VLAN后,使用ping命令可以使兩臺(tái)虛擬機(jī)相互ping通。但發(fā)現(xiàn)一個(gè)問(wèn)題,一旦ping包的大小超過(guò)一定長(zhǎng)度,也就是說(shuō)當(dāng)ping包開(kāi)始分片后,兩臺(tái)虛擬機(jī)之間就不能ping通了:
root@nti etc> ping 11.11.4.30 -s 1476 -c 3
PING 11.11.4.30 (11.11.4.30) 1476(1504) bytes of data.
1484 bytes from 11.11.4.30: icmp_seq=1 ttl=64 time=0.536 ms
1484 bytes from 11.11.4.30: icmp_seq=2 ttl=64 time=0.213 ms
1484 bytes from 11.11.4.30: icmp_seq=3 ttl=64 time=0.238 ms
--- 11.11.4.30 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.213/0.329/0.536/0.146 ms
root@nti etc> ping 11.11.4.30 -s 1477 -c 3
PING 11.11.4.30 (11.11.4.30) 1477(1505) bytes of data.
--- 11.11.4.30 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2009ms
上面的輸出顯示,當(dāng)ping包長(zhǎng)度為1476字節(jié)時(shí),可以正常ping通,但當(dāng)ping包長(zhǎng)度變?yōu)?477字節(jié)時(shí),就無(wú)法ping通了。
在網(wǎng)上搜索了很久,終于找到了原因。原來(lái),在Xen中,虛擬機(jī)的網(wǎng)卡是通過(guò)宿主機(jī)(Domain-0)上的虛擬接口vifX.X以及虛擬網(wǎng)橋設(shè)備virbrX來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通信的。
下面的/sbin/ifconfig輸出列出了宿主機(jī)相應(yīng)的網(wǎng)絡(luò)接口:
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:13:72:18:E0:99
inet addr:192.168.19.84 Bcast:192.168.190.255 Mask:255.255.255.0
inet6 addr: fe80::213:72ff:fe18:e099/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:36017777 errors:43235 dropped:0 overruns:0 frame:46756
TX packets:894337 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:105224895 (100.3 MiB) TX bytes:424826680 (405.1 MiB)
Interrupt:17
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4698 errors:0 dropped:0 overruns:0 frame:0
TX packets:4698 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2439660 (2.3 MiB) TX bytes:2439660 (2.3 MiB)
vif3.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:38149 errors:0 dropped:0 overruns:0 frame:0
TX packets:512426 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:32
RX bytes:7652947 (7.2 MiB) TX bytes:41352902 (39.4 MiB)
vif4.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:65806 errors:0 dropped:0 overruns:0 frame:0
TX packets:553557 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:32
RX bytes:3835916 (3.6 MiB) TX bytes:157035614 (149.7 MiB)
virbr0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:555514 errors:0 dropped:0 overruns:0 frame:0
TX packets:824276 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:64025226 (61.0 MiB) TX bytes:968699886 (923.8 MiB)
也就是說(shuō),當(dāng)虛擬機(jī)1發(fā)包給虛擬機(jī)2時(shí),它的報(bào)文首先經(jīng)過(guò)vif3.0,然后經(jīng)過(guò)網(wǎng)橋設(shè)備(bridge)virbr0,最后到達(dá)虛擬機(jī)2的虛擬接口vif4.0。
而Easwy所用的Linux內(nèi)核版本2.6.18-128.el5xen中,它的bridge驅(qū)動(dòng)中存在bug,當(dāng)使能了conntrack模塊時(shí),bridge會(huì)把分片包重組起來(lái)進(jìn)行檢查,但由bridge再向外發(fā)時(shí),卻沒(méi)有重新分片,這導(dǎo)致報(bào)文被二層丟棄。也正是這個(gè)原因,當(dāng)ping包大小大于1476時(shí),兩臺(tái)虛擬機(jī)間就無(wú)法相互ping通了。
要解決這個(gè)問(wèn)題,可以重新編譯內(nèi)核(不過(guò)我不知道這個(gè)問(wèn)題在哪一個(gè)內(nèi)核版本中得到了解決)。對(duì)于Easwy來(lái)說(shuō),因?yàn)椴恍枰褂梅阑饓?#xff0c;所以解決起來(lái)就不用這么麻煩了,只需要使用下面的命令禁用bridge的防火墻就行了:
# echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
禁用掉防火墻后,兩臺(tái)虛擬機(jī)間的大包可以ping通了,分片包的通過(guò)不存在問(wèn)題。
要了解這個(gè)bug的詳細(xì)信息,參見(jiàn)文末的第二篇參考文檔。文末的第三篇和第四篇參考文檔,則列出了在Xen中使用VLAN的配置方法,有興趣的朋友可以看一下。
更多內(nèi)容,請(qǐng)閱讀Easwy的博客上的其它文章。
[ 參考文檔 ]
本文以創(chuàng)作共用版權(quán)協(xié)議發(fā)布,轉(zhuǎn)載本文要求遵循“署名-非商業(yè)性使用-相同方式共享3.0”的創(chuàng)作共用協(xié)議,并以鏈接形式指明本文地址。
文章的腳注信息由WordPress的wp-posturl插件自動(dòng)生成
總結(jié)
以上是生活随笔為你收集整理的虚拟接口+tx+linux,Linux使用笔记: 解决Xen虚拟机中VLAN接口不能ping大包的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 更改应用程序图标_在 Windows 1
- 下一篇: linux 嵌入式 交叉 环境搭建 实验