failed; no link present. Check cable?

LINEで送る
Pocket

諸事情により 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
LINEで送る
Pocket

  • このエントリーをはてなブックマークに追加

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください