ifconfgはアクティブなネットワークカードをどのように取得しますか?

ifconfgはアクティブなネットワークカードをどのように取得しますか?

しばらく検索してみましたが、同じ問題を見つけるための明確なキーワードはありません。

私の問題の簡単な説明:

ifconfig有効なNICのみが表示されます。

# ifconfig
br0       Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          ...

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:XX.XX.XX.XX  Bcast:XX.XX.XX.XX  Mask:XX.XX.XX.XX
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          ...

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          ...

ただし、ip addrすべてのNICが表示されます。

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> ... UNKNOWN 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UP
3: eth1: <BROADCAST,MULTICAST> ... state DOWN
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UNKNOWN

画面出力に基づいて、文字ifconfig列を介してネットワークカードが有効になっているかどうかを確認できます。戻る。 (例:ループバック、戻る、LOWER_UP)

私が知る限り、この文字列はハードウェアとは何の関係もありません。したがって、どちらも答えでは/sys/class/net/NIC/operstateありません。/sys/class/net/NIC/carrier


私の質問は:そのロープはどこから来ますか?

(ファイルシステムの一部のファイルに含まれていると推測します。)

ベストアンサー1

man ifconfig説明する:

ifconfig はカーネル常駐ネットワークインタフェースを設定するために使用されます。必要に応じてインターフェイスを設定するために起動時に使用されます。それ以降は通常、デバッグ時やシステム調整が必要な場合にのみ必要です。

引数が指定されていない場合、ifconfig は現在アクティブなインターフェイスのステータスを表示します。

単一のインターフェースパラメーターが指定されている場合は、そのインターフェースの状況のみが表示されます。

単一の-a引数が指定されている場合は、停止したインターフェイスを含むすべてのインターフェイスのステータスが表示されます。

それ以外の場合はインターフェイスを設定します。

man netdeviceまた、この問題に関するいくつかの手がかりを共有することもできます。 ioctl() システムコールを使用します。

もう一つの技術はを使用することですstrace

これは、渡されたプログラムによって実行されたすべてのシステム呼び出しのリストと、対応する引数と戻り値を提供します。プログラムが長時間実行されるのではなく、一部の情報をダンプして終了する場合は、検索中の情報を提供できるように見えるすべてのシステム呼び出しに対してmanを実行するのは非常に簡単です。

私が走るとき

strace ifconfig

いくつかの興味深い呼び出しは次のとおりです。

open("/proc/net/dev", O_RDONLY)         = 6

以下はioctlの束です。

ioctl(5, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(5, SIOCGIFHWADDR, {ifr_name="eth0", ifr_hwaddr=12:cd:4b:bb:7f:39}) = 0
ioctl(5, SIOCGIFMETRIC, {ifr_name="eth0", ifr_metric=0}) = 0
ioctl(5, SIOCGIFMTU, {ifr_name="eth0", ifr_mtu=9001}) = 0

おすすめ記事