サーバーには複数のネットワークカードがあり、そのうちの1つだけがケーブルで接続されています。
特定のポートethX
が接続されているかどうかをテストする方法は?
似たようなものがたくさん見つかりました。質問しかし、それらのどれも私にはethtool
適していませんcat /sys/class/net/eth1/carrier
。
私の場合、ケーブルは実際に接続されていましたが、まだ表示されていますeth2
。ethtool
Link detected: no
Settings for eth2:
Supported ports: [ FIBRE ]
Supported link modes: 10000baseT/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: No
Advertised link modes: 10000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: No
Speed: Unknown!
Duplex: Unknown! (255)
Port: Direct Attach Copper
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: no
eth3
接続ケーブルはありませんが、ethtool
出力はほぼ同じに見えます。
diff <(ethtool eth2) <(ethtool eth3)
1c1
< Settings for eth2:
---
> Settings for eth3:
11c11
< Port: Direct Attach Copper
---
> Port: Other
最初にインターフェースを呼び出すと、eth2
インターフェースethtool
が表示されますLink detected: yes
。その後、インターフェイスを閉じてもethtool
リンクはとして報告されます。yes
簡単に言えば、ethtool
インターフェイスが ifup されるまで最初は動作しないようです。
特定のインターフェイスにケーブルが接続されているかどうかを確実にテストする方法?
ベストアンサー1
ソケットに接続されているケーブルの物理状態ではなく、NICのリンク状態を探したいとします。 (見つけることは不可能かもしれません。)
すばやく検索してみると、すでに答えを知っているようです。インターフェイスを開き、リンクがある場合はそれが見つかるのを待ってから(数秒かかることがあります)、およびethtool
/carrier
またはoperstate
の出力を確認します/sys/class/net/$NIC/
。
ifconfig somenic up
ioctl
次の2つの呼び出しが行われたようです。
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
.basedを基準に設定します。ここ、これは実際にデバイスを初期化する設定です。
次に、この
IFF_UP
ビットを設定して(ソケットI / O制御設定インターフェイスフラグ)を介してインターフェイスを開きます。dev->flag
ioctl(SIOCSIFFLAGS)
ただし、後者のコマンド(
ioctl(SIOCSIFFLAGS)
)はデバイスのopenメソッドを呼び出します。実際のコードに関しては、ドライバは文字やブロックドライバと同じことをたくさん行う必要があります。 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
一般的な場合にはまだ役に立ちません。
Cisco スイッチに接続されたコンピュータでe1000e
インターフェイスをシャットダウンすると、スイッチにもリンクがダウンしているとマークされます。
他のコンピュータ(一部のRealtek NICが組み込まれています)では、トップダウンの変更によりリモートスイッチの接続がしばらく切断されましたが、スイッチはリンクを確認して再接続しました。 (ethtool
ただし、PC側では「No Link」と表示されます。) これはWake on LANの準備などと関連があるかもしれませんが、よくわかりません。