xen中出现received packet with own address问题解决

来源:互联网 发布:时间序列相似性算法 编辑:程序博客网 时间:2024/06/05 00:59

问题表现:从system->administration->systemmonitor菜单打开资源管理器,在resource栏中看见networkhistory下面的received和sent都以数百兆的速率在传输数据,dom0顷刻死机。eth0网卡MAC地址和IP地址突然消失,莫名其妙多出来一块eth1网卡。本来应该有的新启动的虚拟机通信接口vif1.0没有显示出来。

以上是在我的电脑上的表现。我的电脑是CentOS5.2, runlevel 5, 从CentOS5.5的iso中安装的xen3.1, ip10.60.56.90。从xend.log, xend-debug.log, xm dmesg中都没有看到相关信息。
同处于局域网的10.60.56.220上启动虚拟机发现状况相似,整个局域不能上网,10.60.56.220的eth0网卡信息消失,莫名多出来一块eth1网卡。在10.60.56.220上多出来的收获是看到了有vif0.0 received packet with own addressas source address的错误信息。

问题出现于两三天前(2011-1-2)左右,在问题出现以前启动虚拟机一直没有出现过这样的问题。环境一直是自己配置,没有经过改动。局域网环境,且网格计算方向的其他实验室没有这样的环境,其他实验室一般都使用windows,多是学生和老师办公使用,不太可能是病毒。

拿错误信息“vif0.0 received packet with own addressas sourceaddress”去google了一下,找到一些网页,其中还找到了xen发而的一个patch,但是patch以后错误依旧。这些网页上基本都是说这是网络配置的问题,不是xen的问题。
因为出问题以前长时间启动虚拟机也情况良好,另外我的电脑上出问题后重新安装过其他版本的xen,也有问题,10.60.56.220上的xen是随所安装的OS的光盘中的xen,启动虚拟机的时候也有问题,基本上可以确定这确实不是xen的问题。

把虚拟机的网卡去掉,没有配置NIC,情况还是一样,但不会导致dom0死机。在虚拟机启动过程中,看到:
XENBUS: Device with no driver: device/vbd/51712
XENBUS: Device with no driver: device/vbd/51729
XENBUS: Device with no driver: device/vbd/51731
XENBUS: Device with no driver: device/vbd/51730
XENBUS: Device with no driver: device/vif/0
XENBUS: Device with no driver: device/vif/1
信息。
从/var/log/xen/xend.log中看一下,发现51729是config.img,51712是evc.img,

xm des 3把虚拟机关掉以后资源管理器中看网络情况正常,所以确定这是因为启动虚拟机时虚拟机的配置引起的问题。
从虚拟机配置文件~test/vm.xen.conf文件中把虚拟网卡都去掉,在config.img中的vmconfig文件中也把EVC使用的网卡信息拿掉,再启动虚拟机,资源管理器表现一直正常。看来是虚拟机的网络配置引发的问题。

于是在虚拟机配置文件~test/vm.xen.conf中只配置一块虚拟网卡:
vif=["bridge=xenbr0"]
再启动虚拟机,没有任何问题。
一块网卡没有问题,多块这样的网卡也应该没有问题,于是给这块网卡增加参数:
vif=["bridge=xenbr0,vifname=eth0"]
再启动,问题又出现了。
看表现应该是vifname参数的问题。

于是,把配置文件恢复到最初EVC创建的配置,并在config.img中的vmconfig也恢复成最初EVC创建时刻的配置。并删除vm.xen.conf中的所有vifname参数,再启动,没有任何问题。

现在看为什么vifname会导致这么严重的问题。
xm --help_config
命令会列出可用的配置参数,对vif配置的格式如下:
vif=type=TYPE,mac=MAC,bridge=BRIDGE,ip=IPADDR,script=SCRIPT,backend=DOM,vifname=NAME
                    Add a network interface with the given MAC address
                    and bridge.
                    The vif is configured by calling the given
                    configuration script.
                    If type is not specified, default is netfront not
                    ioemu device.
                    If mac is not specified a random MAC address is used.
                    If not specified then the network backend chooses
                    it's own MAC address.
                    If bridge is not specified the first bridge found is
                    used.
                    If script is not specified the default script is
                    used.
                    If backend is not specified the default backend
                    driver domain is used.
                    If vifname is not specified the backend virtual
                    interface will have name vifD.N
                    where D is the domain id and N is the interface id.
                    This option may be repeated to add more than one vif.
                    Specifying vifs will increase the number of
                    interfaces as needed.

其中ip只是做个样子,真正要设置虚拟机的IP需要登录到虚拟机中使用具体的操作系统接口来设置。vifname如果指定的话形式应该是vifD.N的形式。

得到的教训:
一)磨刀不误砍柴工。上面的问题产生的原因就是对xen的文档阅读的极不仔细,在这样的情况下就去动手写代码,结果因为自己按照想当然的理解去写代码,使得代码产生了错误的配置文件,花费了两三天的时间才解决。不能贪图速度,一定要准确,正确,一步一个脚印。只求速度,就会丢三落四,后劲不足,产生一大堆类似上面这样的问题,这种问题产生后极难发现,这样的project会越做越有挫败感。
二)遇到问题不要鲁莽地“从头再来”。"从头再来"一度被自己视为解决问题的法宝。
三)理性地分析,不要靠感觉来判断这个问题很复杂。如果确实很难,用理性的证据来证明这个问题确实很难。