Der Server verfügt über mehrere Netzwerkkarten, von denen nur bei einer ein Kabel eingesteckt ist.
Wie kann ich testen, ob der angegebene Port ethX
angeschlossen ist oder nicht?
Ich fand viele ähnlicheFragen, aber weder ethtool
noch cat /sys/class/net/eth1/carrier
funktioniert für mich.
In meinem Fall ist das Kabel zwar angeschlossen , zeigt eth2
aber trotzdemethtool
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
Es ist kein Kabel angeschlossen eth3
, aber ethtool
die Ausgabe sieht fast gleich aus:
diff <(ethtool eth2) <(ethtool eth3)
1c1
< Settings for eth2:
---
> Settings for eth3:
11c11
< Port: Direct Attach Copper
---
> Port: Other
Erst wenn ich die Schnittstelle hochfahre eth2
, ethtool
wird angezeigt Link detected: yes
. Danach ethtool
wird der Link als gemeldet yes
, auch wenn ich die Schnittstelle herunterfahre.
Kurz gesagt, ethtool
es scheint nicht auf Anhieb zu funktionieren, bevor die Schnittstelle aktualisiert wurde.
Wie kann ich zuverlässig testen, ob das Kabel an der angegebenen Schnittstelle angeschlossen ist oder nicht??
Antwort1
Ich gehe davon aus, dass Sie den Verbindungsstatus der Netzwerkkarte herausfinden möchten und nicht den physischen Zustand eines in die Buchse eingesteckten Kabels. (Das lässt sich möglicherweise nicht herausfinden.)
Nach einer kurzen Suche glaube ich, dass Sie die Antwort bereits gefunden haben. Rufen Sie die Schnittstelle auf, warten Sie, bis ein Link gefunden wird, falls es einen gibt (das kann einige Sekunden dauern), und überprüfen Sie dann die Ausgabe von ethtool
oder carrier
und/oder operstate
in /sys/class/net/$NIC/
.
ifconfig somenic up
scheint diese beiden ioctl
Aufrufe zu tätigen:
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
Das heißt, es setzt IFF_UP
. Basierend aufHier, Einstellung, die tatsächlich zur Initialisierung des Geräts führt:
Anschließend setzt es mittels (Socket I/O Control Set Interface Flags) das
IFF_UP
Bit , um die Schnittstelle einzuschalten.dev->flag
ioctl(SIOCSIFFLAGS)
Der letztere Befehl (
ioctl(SIOCSIFFLAGS)
) ruft jedoch die Open-Methode für das Gerät auf.Was den eigentlichen Code betrifft, muss der Treiber viele der gleichen Aufgaben ausführen wie die Zeichen- und Blocktreiber. Open fordert alle benötigten Systemressourcen an und weist die Schnittstelle an, zu erscheinen.
Ähnliche Kommentare gibt es ime1000e
Treiberquelle:
/**
* 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)
Das würde bedeuten, dass es keine Möglichkeit gibt, den Verbindungsstatus einer Netzwerkkarte sinnvoll zu ermitteln, die nichthoch, da die Hardware nicht einmal initialisiert würde.
Natürlich ist es zumindest theoretisch möglich, dass sich einige Treiber anders verhalten und die Hardware initialisieren, bevor jemand einstellt IFF_UP
, aber im Allgemeinen würde das immer noch nicht helfen.
Auf einer Maschine (mit e1000e
Anschluss an einen Cisco-Switch) führt das Herunterziehen der Schnittstelle dazu, dass der Switch den Verbindungsverlust erkennt.
Auf einem anderen Rechner (mit eingebetteter Realtek-Netzwerkkarte) führen Änderungen von „hoch“ nach „herunter“ dazu, dass der Remote-Switch eine kurze Unterbrechung erkennt, die Verbindung jedoch erkennt und dann wiederhergestellt wird. ( ethtool
Auf der PC-Seite wird jedoch „keine Verbindung“ angezeigt.) Dies kann mit der Vorbereitung für Wake-on-LAN oder Ähnliches zu tun haben oder auch nicht, aber ich habe wirklich keine Ahnung.
Antwort2
Versuchen Sie den Befehl ifplugstatus
aus dem Paketifplugd
$ ifplugstatus net0
net0: unplugged
$ ifplugstatus wlnet0
wlnet0: link beat detected
Neben der Bildschirmausgabe können Sie dies auch am Beendigungsstatus des Befehls erkennen.
(aus der Manpage)
RÜCKGABEWERTE
0 Success 1 Failure 2 Link beat detected (only available when an interface is specified) 3 Unplugged (same here)
Antwort3
Ich habe mir den Ethertools-Quellcode angesehen, konnte aber keine Stelle finden, an der der Linkstatus beschrieben wird.
Dann stellte ich fest, dass dies eine exakte Kopie einer Frage auf SO zu sein scheint:https://stackoverflow.com/questions/808560/wie-erkennt-man-den-physischen-verbindungszustand-eines-netzwerkkabelverbinders?
Ich habe die meisten der dort aufgeführten Antworten ausprobiert (mii-tools, ethertool, cat the carrier oder operstate, dmesg) und keine davon hat bei der Verbindung richtig funktioniert, als die ifconfig ausgefallen war.
Da die SO-Frage mehr als 6 Jahre alt ist, denke ich, dass die meistenmöglichAntworten gibt es bereits.
Meiner Meinung nach können Sie mit Standard-Linux-Tools den Netzbetreiber erst prüfen, wenn Sie versuchen, ihn aufzurufen. Danach mii-tools
schien die Linkerkennung einwandfrei zu funktionieren und eine einheitliche Antwort zu geben.
Ich habe rtnetlink und einige andere Antworten dort nicht ausprobiert, die sich mit der Erkennung vonÄnderungenim Link-Status, was, wie ich annehme, nicht das ist, was Sie wollten.