iproute2 の `ip link show` はどのようにしてリンク状態を判断するのでしょうか?

iproute2 の `ip link show` はどのようにしてリンク状態を判断するのでしょうか?

次のように報告するネットワーク インターフェイスがありますip link show

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:43:e6:b1:e7 brd ff:ff:ff:ff:ff:ff

しかし/sys/class/net/docker0/flags、こう言います。

$ cat /sys/class/net/docker0/flags 
    0x1003

設定されている 3 つのビットはIFF_MULTICAST、、IFF_BROADCASTおよびですIFF_UP。これは UP 状態のインターフェースのように見えます。なぜ がip link報告されるのでしょうかstate DOWN?

システムは Linux 4.15 / Ubuntu 18.04 です。

答え1

設定されている3つのビットは、IFF_MULTICAST、IFF_BROADCAST、IFF_UPです。これはUPしているインターフェースのように見えます。

そしてそれは実際の出力:

3: docker0: <キャリアなし、ブロードキャスト、マルチキャスト、アップ>
                           ↑ ↑ ↑

IP リンク レポートの状態が DOWN になるのはなぜですか?

それは別の種類の状態です。

  • フラグIFF_UP(上記では「<UP>」と表示)は、行政上の状態は、 を介して設定できる手動ノブですip link set eth0 up

  • 一方、「状態[…]」のテキストは、運用上の状態はインターフェースが有能働くこと。

動作状態は、おおよそ「キャリア」の存在と同じです。たとえば、イーサネットリンクが完全に確立されているか、Wi-Fiアクセスポイントが関連付けられているかなどです。ブリッジが稼働中(キャリアがある)と報告されるのは、少なくとも一つのdummy0メンバー ポートのすべてが稼働しています。そのため、インターフェイスをブリッジ メンバーとして追加する必要がある場合があります。

動作状態は、フラグIFF_LOWER_UP(フラグ領域に「<LOWER_UP>」として表示)とIFF_RUNNING(その不在は、例では疑似フラグ「<NO-CARRIER>」として表示されます)にほぼ対応します。ソースコード

しかし、iprouteツールはNetlink経由でインターフェース情報を取得し、state …セクションはIFLA_オペレーション状態netlink 属性。(ソースコード

この属性はsysfs経由で…/operstateも利用可能です。Linuxのドキュメントには、これらのフラグと属性に関するより詳しい説明があります。オペレーションステート.txt

関連情報