|
发表于 2008-3-25 19:55:04
|
显示全部楼层
我知道这个问题,嘿嘿,因为我也碰到了这个问题,然后做了一些调试。
其实很简单,你把/etc/rc.d/network脚本打开来看一下,restart的时候会首先调用stop,然后是start,stop没有问题,但是start的时候,具体调用的是这个脚本中ifup这个函数,这个函数中有一句代码是判断需要start的interface是否已经启动(如果已经启动那就什么都不做了),就是这句代码有问题,因为这句代码是这样写的(大概是这样,现在没有archlinux的环境,无法拷贝过来):
[ $(/sbin/ifconfig $1 |grep -v "inet6...."|grep -e "..." -e "....") ] && return 0
这里的$1就是传递到这个函数的网络interface,比如lo,eth0这样的,设计者的意图是:因为前面已经stop了网络,所以ifconfig eth0应该没有输出,所以,上面的代码判断就是失败,于是继续往下做(不return),下面的代码就是给eth0配置IP地址和netmask这些。但问题恰恰是此时ifconfig eth0有输出,于是这句代码判断eth0已经启动了,所以不再去尝试启动eth0。
由于ifup函数中没有启动网络interface,所以在后面的代码中,设置route的时候,其实就是命令:route add default gw xxx.xxx.xxx.xxx这样的代码,default gw xxx.xxx.xxx.xxx就是我们写在/etc/rc.conf中gateway那个变量的内容。由于interface没有启动,所以route add就出错了,就打印出了SIOCADDRT: No such process 这个出错信息。
其实现在看来,目前的arch中,网络被stop了之后,输入ifconfig是什么输出都没有的,但是ifconfig eth0这个命令却有输出,这是不太符合逻辑的。估计是ifconfig这个包有问题。这就是导致问题的根源。
我现在直接将ifup中上面提到的那句代码注释掉了,不判断interface是否已经启动,就一切正常了。 |
|