ディストリビューションに応じて、ip link set <iface> up
(または down、または ifup / ifdown) を呼び出すと、さまざまな設定ファイル (Debian では /etc/network/interfaces、Gentoo では /etc/conf.d/net...) が参照され、変更が行われます (例: DHCP とのやり取りなど)。
私が見た限りではstrace
、ip
コマンドはカーネルと直接通信します (そうでしょうか?)。しかし、最終的には、誰かがそれらのシェル スクリプトを起動したり、構成を読み取ります。これが発生するメカニズムは何ですか? init システムは、カーネル インターフェイスでアップ/ダウン状態の変更をリッスンし、これらのスクリプトを起動していますか? それとも、何か別のものですか?
答え1
あなたが説明したように呼び出すことip link set <iface> up
は、カーネルとの最小限の通信をrtnetリンクAPI(これはルートだけでなく、リンク、アドレスなどに関するものです。ここではRTM_NEWLINK
) を使用して、インターフェイスを管理的に起動します。古いifconfig
ツールは、非推奨の (ネットワーク用) ioctl API (ここでは ) を使用して、カーネルに同じことを要求しますSIOCGIFFLAGS
。
これらのコマンドは、要求されたことだけを実行し、それ以上は何も行わない低レベルのコマンドです。
ifup
(Debianでは)アップダウン(または代替上へ下へ2) スイートであり、Linux ディストリビューションごとに異なる実装があります。これらは単なるスクリプト スイートであり、おそらくip link set ...
自分自身を呼び出すものであり、おそらくそのうちのいくつかは他の利用可能なツール (ネットワーク管理者)。したがって、これらを同じレベルに置くことは絶対にできません。ip link set ... up
まったくそうではありませんifup ...
。
では、他のネットワークツールではネットワーク管理者対話して何が起こったのかを知るには?カーネルに問い合わせているからですrtnetリンク興味のあるネットワークイベントの通知を受け取ることができます。ネットリンクAPI 実装はマルチキャストをサポートします。つまり、単一のメッセージを複数の関係者 (ユーザー空間またはカーネルに属する) が効率的に受信できるため、イベントの実装が簡素化されます。
通常、何か (ここではip link set ... up
) がカーネルにメッセージを送信すると、カーネルは関係するパーティにマルチキャストされるメッセージで応答します。コマンドはip link
このメッセージを受け取りますが、待機中のすべてのツールも「インターフェイスが起動された」ことを認識します (管理状態が起動している場合と運用状態が起動している場合の違いについてはここでは触れません)。
コマンドの出力によって駆動されるイベントループを使用してスクリプトで同じことを行うこともできます。ip monitor
カーネルからのネットワークイベントを待っている。もちろん、本当に解析可能な出力が望ましいが、残念ながら他の多くのiproute2サブコマンドは 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
。