路遇CentOS6.9的initscripts的bug

缘起

某台机器(CentOS 6.*)升级到最新的 6.9 版本,重启结果发现以前开机自起的 GRE 设备 greXXX 没有自动起来?!

发现问题

最初怀疑是 iptables 没有放开 GRE 数据包的入站导致,结果发现不是,而且手工 ifup greXXX 能直接将这个设备起来。

于是查代码 /etc/init.d/network,发现这段:

1
2
3
4
if [ "$TYPE" = "IPSEC" ] || [ "$TYPE" = "IPIP" ] || [ "$TYPE" = "GRE" ]; then
vpninterfaces="$vpninterfaces $i"
continue
fi

看起来设备 greXXX 被放到变量 vpninterfaces 里了,但是再翻遍 /etc/init.d/network,也没发现最后要把 vpninterfaces 怎么着呀,这到底是个什么情况呀?!

在 /etc/init.d/network 发现还有一段:

1
2
3
4
5
6
7
8
9
10
11
12
# Bring up xDSL and VPN interfaces
for i in $vlaninterfaces $bridgeinterfaces $xdslinterfaces ; do
if ! LANG=C egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i >/dev/null 2>&1 ; then
# If we're in confirmation mode, get user confirmation.
if [ -f /var/run/confirm ]; then
confirm $i
test $? = 1 && continue
fi
action $"Bringing up interface $i: " ./ifup $i boot
[ $? -ne 0 ] && rc=1
fi
done

看见没有看见没有,注释里写了这一段会启动 xDSL 和 VPN 设备的,但是在具体的代码里,却又为嘛把变量 vpninterfaces 丢掉了呀?!这个程序员得有多粗心呀!

查一下

1
rpm -qf /etc/init.d/network

发现这个文件是属于包:initscripts-9.03.58-1.el6.centos.x86_64,再接着查:

1
rpm -qV initscripts

发现包 initscripts 里的文件 /etc/init.d/network 没有被修改过。所以猜想可能是 bug,google 上一查,果不其然,在这里:0013020: initscripts 9.03.58-1.el6.centos breaks gre interfaces

解决办法

来龙去脉搞明白了,解决问题其实非常简单,可以直接修改文件 /etc/init.d/network,但我不想这么做,因为 CentOS 官方迟早是会修复这个 bug 的,不用我来凑这个热闹。不过目前的问题的话,直接在 /etc/rc.local 里加一句,手工起这个设备算了:

1
echo "/etc/sysconfig/network-scripts/ifup greXXX">>/etc/rc.local