解决 xend stop 后无法还原网络配置的问题

我使用的是 3.3.0 版本的 xen 及管理工具。

在 Xen 官网的用户手册(http://tx.downloads.xensource.com/downloads/docs/user/)的 5.2.2 节中提到:

network-bridge:

This script is called whenever xend is started or stopped to respectively initialize or tear down the Xen virtual network. In the default configuration initialization creates the bridge `xen-br0′ and moves eth0 onto that bridge, modifying the routing accordingly. When xend exits, it deletes the Xen bridge and removes eth0, restoring the normal IP and routing configuration.

也就是说,在使用桥接网络时:

  • xend 开始时,会创建 xen-br0,并将物理网卡 eth0 的配置复制到该桥上;
  • xend 停止时,将会删除 eth0,并还原物理网卡。

在 xen 3.3 版本中,以上的 xen-br0 会变为 eth0,请参考 Wiki:

http://wiki.xensource.com/xenwiki/XenNetworking

Please notice that in xen 3.3, the default bridge name is the same than the interface it is attached to. Eg: bridge name eth0, eth1 or ethX.VlanID

经测试,在启动 xend 前,ifconfig 输出:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:15:17:90:79:5F 
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24690 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:3356660 (3.2 Mb)  TX bytes:3657518 (3.4 Mb)
          Base address:0x2000 Memory:e8180000-e81a0000

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

在执行 /etc/init.d/xend start (调用了 xend start)后,xend 工作正常,创建了 xen-br0(或 eth0),ifconfig 输出:

# ifconfig             
eth0      Link encap:Ethernet  HWaddr 00:15:17:90:79:5F 
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:598 (598.0 b)  TX bytes:1168 (1.1 Kb)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

peth0     Link encap:Ethernet  HWaddr 00:15:17:90:79:5F 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25599 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20896 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:3444486 (3.2 Mb)  TX bytes:3795992 (3.6 Mb)
          Base address:0x2000 Memory:e8180000-e81a0000

但在执行 /etc/init.d/xend stop (调用了 xend stop)时,ifconfig 输出内容依旧如上,并没有像官方用户文档所述还原网络配置。

问题分析:

查看源代码发现,xend 运行时每次都加载了 XendPIF 这个模块,而在装载这个模块时无条件地执行了 network-script 的 start 命令,并没有根据 xend 后输入的参数来执行相应的操作,这应该是一个 Bug。

解决方案(不同系统上的文件路径略有不同):

修改 /usr/lib64/python2.4/site-packages/xen/xend/XendPIF.py

#Vifctl.network('start')
from xen.xend import hily_fixed
if hily_fixed.hily_action in ('start', 'stop'):
    Vifctl.network(hily_fixed.hily_action)

新建 /usr/lib64/python2.4/site-packages/xen/xend/hily_fixed.py

hily_action = ''

修改 /usr/sbin/xend:

if sys.argv[1:]:
    from xen.xend import hily_fixed
    hily_fixed.hily_action = sys.argv[1]

from xen.xend.server import SrvDaemon

— EOF —

发表评论

电子邮件地址不会被公开。 必填项已用*标注