ディストリビューションに応じて、呼び出しip link set <iface> up
(または下に、ifup / ifdownも)はさまざまな設定ファイル(私の意見ではDebianの場合は/etc/network/interfaces、Gentooの場合は/etc/conf.d/net...)を見ていますMakeの変更(例:DHCPとの相互作用など)
私が知る限りstrace
、このip
コマンドはカーネルと直接会話します(そうですか?)。しかし、最終的に誰かがこれらのシェルスクリプトを実行したり設定を読み取ったりします。これのメカニズムは何ですか?初期化システムは、一部のカーネルインタフェースの動作/停止状態の変更を受け取り、これらのスクリプトを実行しますか?それとも違いがありますか?
答え1
説明したように、呼び出しは以下を介してip link set <iface> up
カーネルと最小限に通信します。rtnetlinkアプリケーションプログラミングインターフェース(これはルーティングだけでなく、リンク、アドレスなどに関するものです。ここにあります。RTM_NEWLINK
)管理モードでインターフェイスを起動します。以前のツールは、廃止されifconfig
た(ネットワーク用)ioctl API(ここ)を使用して、SIOCGIFFLAGS
カーネルに同じ要求を送信します。
これらのコマンドは、必要な操作のみを実行する低レベルのコマンドです。
ifup
(Debianで)の一部です上下なら(または代替上下2の場合)ファミリであり、さまざまなLinuxディストリビューションで異なる実装をしています。それらは自分で呼び出すことができる一連のスクリプトでありip link set ...
、おそらくそれらのいくつかは他の利用可能なツールです(例:ネットワーク管理者)。したがって、それらを同じレベルに置くことはできません。まったくip link set ... up
そうではありませんifup ...
。
今、他のWebツールはどうなりますか?ネットワーク管理者相互作用し、何が起こっているのか知っていますか?彼らはカーネルについて尋ねているのでrtnetlink、興味のあるいくつかのネットワークイベントに関する通知を受け取ります。インターネット接続API実装はマルチキャストをサポートします。つまり、複数の関係者(ユーザー空間またはカーネルに属する)が単一のメッセージを効果的に受信できるため、イベントの実装が簡素化されます。
通常、何か(ここでip link set ... up
)がカーネルにメッセージを送信すると、カーネルは関心のあるパーティにマルチキャストされたメッセージで応答します。コマンドはip link
このメッセージを受信し、待機しているすべてのツールは「インターフェースが起動されたばかりです」ということを知っています。管理状態開始と動作状態開始の違い)
コマンド出力で駆動されるイベントループを使用して、スクリプトで同じことを実行できます。ip monitor
カーネルでネットワークイベントを待っています。もちろん、実際に解析可能な出力が良いでしょう。残念ながら、他の多くの出力はIP ルート 2サブコマンドはJSON出力をサポートします-json
(ip monitor
。
これは基本的なシェルの例は、ip monitor link
そのインターフェイスが変更されるたびに(動作状態に関係なく)、インターフェイスの動作状態を表示することに基づいています。基本的な例)。信頼できない出力を解析するため、場合によっては失敗する可能性があります。
#!/bin/sh
ip -o monitor link | while read -r index interface status remaining; do
iface=$(printf '%s\n' "$interface" | sed -E 's/(@.*)?:$//')
operstate=$(printf '%s\n' "$remaining" | grep -Eo ' state [^ ]+' | sed 's/^ state //')
printf '%s %s\n' "$iface" "$operstate"
done
上記のスクリプトの実行中に、他の場所で次のコマンドを試してみてください。
# ip link add test1 type veth peer name test2
# ip link set test1 up
# ip link set test2 up
# ip link delete test1 # script doesn't handle correctly lines starting with Deleted
住所、方向なども同様です。これはネットワーク管理者コマンドに反応しますip link set <iface> up
。