路遇CentOS6.9的initscripts的bug
缘起
某台机器(CentOS 6.*)升级到最新的 6.9 版本,重启结果发现以前开机自起的 GRE 设备 greXXX 没有自动起来?!
发现问题
最初怀疑是 iptables 没有放开 GRE 数据包的入站导致,结果发现不是,而且手工 ifup greXXX
能直接将这个设备起来。
于是查代码 /etc/init.d/network,发现这段:
1 | if [ "$TYPE" = "IPSEC" ] || [ "$TYPE" = "IPIP" ] || [ "$TYPE" = "GRE" ]; then |
看起来设备 greXXX 被放到变量 vpninterfaces 里了,但是再翻遍 /etc/init.d/network,也没发现最后要把 vpninterfaces 怎么着呀,这到底是个什么情况呀?!
在 /etc/init.d/network 发现还有一段:
1 | # Bring up xDSL and VPN interfaces |
看见没有看见没有,注释里写了这一段会启动 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 |