LinuxでEthernetの接続状態を調べる
おきまりのネットワーク設定の話ではなく、Ethernetケーブルがささっている
のか、抜けているのかをLinux上で検出しようという話です。
なにが問題なのか
ノートパソコンにLinuxをインストールしている方も結構いるかと思います。
普段から持ち歩く場合、ネットワーク設定はDHCPに任せておくと、接続先を変
えたときにわざわざ設定し直したりせずにすみ、便利に使えます。
そんな便利なDHCPですが、新幹線の中などでネットワークにつながっていない
ときにちょと問題となります。起動時にDHCPサーバーを探そうとして、1分ぐ
らい起動時間が余分にかかってしまうのです。たいてい、外で使う場合はちょ
こっと何かしたいという場合が多く、その余計な1分が気になっていました。
ethtoolを使ってみる
SorceForgeのgkernelプロジェク
トに、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
ご意見、ご感想は、花房 真広 <[email protected]>まで。メールする前にtop pageの注意書を読んでください。