
Könnte es sein, dass:
ethtool ethx | grep detected
zeigt „Keine Verbindung erkannt“ an, wenn Bond0 auf der Betriebssystemseite (Linux) noch nicht konfiguriert ist?
zeigt ethtool nicht einen physischen Zustand an?
Antwort1
Ethtool funktioniert nur mit physischen Ethernet-Adaptern. Das bedeutet, dass bond0, tun0 und alle anderen Netzwerkgeräte, die keine physischen Netzwerkgeräte sind, nicht mit ethtool funktionieren.
$ ethtool <eth?>
Zum Beispiel:
$ ethtool eth0
bietet:
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
Antwort2
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.