低レベルでは、これらのイベントは、ポーリングなしでrtnetlinkソケットを使用してキャッチできます。補足: rtnetlink を使用する場合は、udev と連携する必要があります。そうしないと、udev が新しいネットワーク インターフェイスの名前を変更するときに、プログラムが混乱する可能性があります。
シェル スクリプトを使用してネットワーク構成を行う際の問題は、シェル スクリプトがイベント処理(ネットワーク ケーブルの抜き差しなど) に対応できないことです。より強力なものが必要な場合は、ネットワーク構成用に設計されたプログラミング言語である私のNCD プログラミング言語をご覧ください。
たとえば、「cable in」と「cable out」を stdout に出力する単純な NCD スクリプトの例を示します (インターフェイスが既に起動していると仮定します)。
process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Print "cable in" when we reach this point, and "cable out"
# when we regress.
println("cable in"); # or pop_bubble("Network cable in.");
rprintln("cable out"); # or rpop_bubble("Network cable out!");
# just joking, there's no pop_bubble() in NCD yet :)
}
(内部でnet.backend.waitlink()
は、rtnetlink をnet.backend.waitdevice()
使用し、udev を使用します)
NCD の考え方は、ネットワークを構成するためだけに使用するというもので、通常は次のような構成コマンドが間に入ります。
process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Set device up.
net.up("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Add IP address to device.
net.ipv4.addr("eth0", "192.168.1.61", "24");
}
注意すべき重要な部分は、実行が後退できることです。たとえば、2 番目の例では、ケーブルが引き抜かれると、IP アドレスが自動的に削除されます。