諸事情により NetworkManager を停止して CentOS を起動しなければならない案件があり、NetworkManager を disable にして起動したら、起動時にネットワークインターフェイスが上がらないという問題に直面した。
コンソールには、以下のように出力されていて、
Determining IP information for eth0... failed; no link present. Check cable?
[FAILED]
syslog の /var/log/messagesには、以下のように出力されていた。
Aug 30 17:05:21 server network: ループバックインターフェイスを呼び込み中 [ OK ] Aug 30 17:05:21 server network: インターフェース eth0 を活性化中: Aug 30 17:05:21 server kernel: pps pps0: new PPS source ptp0 Aug 30 17:05:21 server kernel: ixgbe 0000:07:00.0: registered PHC device on eth0 Aug 30 17:05:21 server kernel: power_meter ACPI000D:00: Found ACPI power meter. Aug 30 17:05:21 server kernel: IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
これは、ランケーブルが刺さっているのに、ケーブルが刺さってないと認識されるため、インターフェース eth0 が起動しないという問題に直面。これは完璧なハード固有の問題ですね。
ifup のスクリプトをおうと、どうやら check_link_down 関数でコケている事がわかる。しかし LINKDELAY の値が設定していれば、ケーブルが認識されるのをしばらく待ってくれるらしい。LINKDELAY =1 で 0.5 秒スリープしてくれるので
/etc/sysconfig/network-scripts/network-functions
:
check_link_down ()
{
if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q ",UP" ; then
ip link set dev $1 up >/dev/null 2>&1
fi
timeout=0
delay=10
[ -n "$LINKDELAY" ] && delay=$(($LINKDELAY * 2))
while [ $timeout -le $delay ]; do
[ "$(cat /sys/class/net/$REALDEVICE/carrier 2>/dev/null)" != "0" ] && return 1
sleep 0.5
timeout=$((timeout+1))
done
return 0
}
:
よって /etc/sysconfig/network-scripts/ifcfg-eth0 などに LINKDELAY を追加すれば問題が解決した。
ONBOOT=yes
DEVICE=eth0
BOOTPROTO=dhcp
:
LINKDELAY=20
syslog の /var/log/messages に eth0: link becomes ready と出力されるようになりました。
Aug 30 17:05:40 server kernel: ixgbe 0000:07:00.0 eth0: NIC Link is Up 1 Gbps, Flow Control: RX/TX Aug 30 17:05:40 server kernel: IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready



