LinuxでEthernetの接続状態を調べる

おきまりのネットワーク設定の話ではなく、Ethernetケーブルがささっている のか、抜けているのかをLinux上で検出しようという話です。

なにが問題なのか

ノートパソコンにLinuxをインストールしている方も結構いるかと思います。 普段から持ち歩く場合、ネットワーク設定はDHCPに任せておくと、接続先を変 えたときにわざわざ設定し直したりせずにすみ、便利に使えます。
そんな便利なDHCPですが、新幹線の中などでネットワークにつながっていない ときにちょと問題となります。起動時にDHCPサーバーを探そうとして、1分ぐ らい起動時間が余分にかかってしまうのです。たいてい、外で使う場合はちょ こっと何かしたいという場合が多く、その余計な1分が気になっていました。

ethtoolを使ってみる

SorceForgegkernelプロジェク トに、ethtoolなるものがあります。これを使うとケーブルの状態を知ること ができます。

使い方は簡単で、以下のようにネットワークデバイスを指定して呼び出すと、 一番最後にケーブルの状態が表示されます。

# ethtool eth0
Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
        100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
        100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: pg
    Wake-on: g
    Link detected: yes

これはケーブルがつながっているときですが、ケーブルが抜けていると、最後 の行が"Link detected: no"という表示に変わります。

これを使って、ケーブルがつながっていなければ、DHCPを使わないようにして みましょう。TurboLinuxで試していますが、ほかのディストリビューションで も同じようにできると思います。
やり方は単純で、/sbin/ifupの50行目付近を以下の様にします。

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
  DYNCONFIG=true

  # cable check
  ifconfig $DEVICE up
  /usr/sbin/ethtool $DEVICE | grep -q "Link detected: no"
  if [ "$?" = "0" ]; then
    echo "Cable is not connected."
    exit
  fi
fi

プログラムから接続状態を調べる

Cのプログラムから、接続状態を調べてみます。ethtoolから必要な部分を抜き 出しただけですが、サンプルプログラムの形にしてみました。
ethlink.c


ご意見、ご感想は、花房 真広 <webmaster@hanabusa.net>まで。メールする前にtop pageの注意書を読んでください。