ボンドが設定されるまでリンクが検出されない可能性がありますか?

ボンドが設定されるまでリンクが検出されない可能性がありますか?

それは次のことでしょうか:

ethtool ethx | grep detected

OS (Linux) 側で bond0 がまだ設定されていない場合、「リンクが検出されませんでした」と表示されますか?

ethtool は物理的な状態を表示しませんか?

答え1

Ethtool は物理イーサネット アダプタに対してのみ機能します。つまり、bond0、tun0、および物理ネットワーク デバイスではないその他のネットワーク デバイスは ethtool では機能しません。

$ ethtool <eth?>

例えば:

$ ethtool eth0

提供:

Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000001 (1)
        Link detected: yes

答え2

ソケットにケーブルが差し込まれた物理的な状態ではなく、NIC のリンク状態を調べたいのだと思います (調べるのは不可能かもしれません)。

ちょっと検索してみると、すでに答えが見つかるのではないかと思います。インターフェースを起動し、リンクが見つかるまで待ちます。リンクがあれば (数秒かかる場合があります)、 、ethtoolまたはcarrierおよび/または のoperstate出力を確認します/sys/class/net/$NIC/

ifconfig somenic up次の 2 つの呼び出しを行うようですioctl:

ioctl(4, SIOCGIFFLAGS, {ifr_name="somenic", ifr_flags=IFF_BROADCAST|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="somenic", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0

つまり、 を設定しますIFF_UPここ実際にデバイスを初期化する設定は次のとおりです。

次に、 (ソケット I/O 制御インターフェイス フラグの設定)を使用してIFF_UPビットを設定し、インターフェイスをオンにします。dev->flagioctl(SIOCSIFFLAGS)

ただし、後者のコマンド ( ioctl(SIOCSIFFLAGS)) は、デバイスの open メソッドを呼び出します。

実際のコードに関する限り、ドライバーは char ドライバーや block ドライバーと同じタスクの多くを実行する必要があります。open は必要なシステム リソースを要求し、インターフェイスを起動するように指示します。

同様のコメントはe1000eドライバーソース:

/**
 * e1000e_open - Called when a network interface is made active
 * @netdev: network interface device structure
 *
 * Returns 0 on success, negative value on failure
 *                                                                                                                                                                           * The open entry point is called when a network interface is made
 * active by the system (IFF_UP).  At this point all resources needed
 * for transmit and receive operations are allocated, the interrupt
 * handler is registered with the OS, the watchdog timer is started,
 * and the stack is notified that the interface is ready.
 **/
int e1000e_open(struct net_device *netdev)  

つまり、NICのリンク状態を意味のある方法で見つける方法はないということです。ハードウェアが初期化されないためです。


もちろん、一部のドライバーが異なる動作をして、誰かが設定する前にハードウェアを初期化することは少なくとも理論的には可能ですがIFF_UP、それでも一般的なケースでは役に立ちません。

関連情報