諸事情により 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