サーバーには複数のネットワークカードがあり、そのうちの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の準備などと関連があるかもしれませんが、よくわかりません。
答え2
ifplugstatus
パッケージ内のコマンドを試してください。プラグインの場合
$ ifplugstatus net0
net0: unplugged
$ ifplugstatus wlnet0
wlnet0: link beat detected
画面出力に加えて、コマンドの終了状態としても知ることができます。
(マンページから)
戻り値
0 Success 1 Failure 2 Link beat detected (only available when an interface is specified) 3 Unplugged (same here)
答え3
ethertoolsソースコードを見てみましたが、リンクの状態が説明されている場所が見つかりませんでした。
それからSOに関する同じ質問のようなものが見つかりました。https://stackoverflow.com/questions/808560/how-to-Detect-the-physical-connected-state-of-a-network-cable-connector
私はそこにリストされているほとんどの答え(mii-tools、ethertool、cat the Carrier、またはoperstate、dmesg)を試しましたが、ifconfigがオフになっていると、リンク内のどれも正しく機能しません。
SOの質問は6年を超えたため、ほとんどの場合可能答えはすでに出ています。
私の投票は、標準のLinuxツールを使用すると、演算子を上げようとしない限り、演算子を確認できないことです。その後、mii-tools
リンク検出は正常に機能しているように見え、統一された回答を提供します。
私はrtnetlinkと他の答えのいくつかを試していませんし、検出を処理します。多様性接続されているので、これはあなたが望むものだとは思わない。