El servidor tiene varias NIC, de las cuales solo una tiene el cable conectado.
¿Cómo puedo comprobar si un puerto determinado ethX
está conectado o no?
encontré muchos similarespreguntas, pero ni ethtool
ni cat /sys/class/net/eth1/carrier
me funciona.
En mi caso, el cable está realmente conectado eth2
, pero ethtool
aún se muestraLink 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
No hay ningún cable conectado eth3
, pero ethtool
la salida se ve casi igual:
diff <(ethtool eth2) <(ethtool eth3)
1c1
< Settings for eth2:
---
> Settings for eth3:
11c11
< Port: Direct Attach Copper
---
> Port: Other
Primero, cuando abro la interfaz eth2
, luego ethtool
muestra Link detected: yes
. Después de eso, ethtool
informa el enlace como yes
, incluso cuando inactivo la interfaz.
En resumen, ethtool
no parece funcionar la primera vez, antes de que se haya actualizado la interfaz.
¿Cómo puedo probar de manera confiable si una interfaz determinada tiene un cable enchufado o no??
Respuesta1
Supongo que desea encontrar el estado del enlace de la NIC, no la condición física de tener un cable enchufado en el enchufe. (Eso podría ser imposible de descubrir).
En una búsqueda rápida, creo que ya tienes la respuesta. Abra la interfaz, espere a que encuentre un enlace, si lo hay (eso puede tardar algunos segundos), luego verifique la salida de ethtool
, o carrier
y/o operstate
en /sys/class/net/$NIC/
.
ifconfig somenic up
parece hacer estas dos ioctl
llamadas:
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
Es decir, se fija IFF_UP
. Residencia enaquí, configurar eso es lo que realmente hace que el dispositivo se inicialice:
Luego configura el
IFF_UP
bitdev->flag
medianteioctl(SIOCSIFFLAGS)
(Indicadores de interfaz de configuración de control de E/S de socket) para encender la interfaz.
ioctl(SIOCSIFFLAGS)
Sin embargo, el último comando ( ) llama al método open para el dispositivo.En lo que respecta al código real, el controlador tiene que realizar muchas de las mismas tareas que los controladores de caracteres y bloques. open solicita todos los recursos del sistema que necesita y le indica a la interfaz que se abra;
Hay comentarios en el mismo sentido en ele1000e
fuente del controlador:
/**
* 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)
Eso implicaría que no hay manera de encontrar de manera significativa el estado del enlace de una NIC que no seaarriba, ya que el hardware ni siquiera se inicializaría.
Por supuesto, es al menos teóricamente posible que algunos controladores se comporten de manera diferente e inicialicen el hardware antes de que alguien lo configure IFF_UP
, pero eso aún no ayudaría en el caso general.
En una máquina (con una e1000e
conectada a un conmutador Cisco), bajar la interfaz también hace que el conmutador vea que el enlace se cae.
En otra máquina (con alguna NIC Realtek incorporada), los cambios de arriba a abajo hacen que el interruptor remoto se desconecte brevemente, pero el interruptor ve el enlace y luego vuelve a activarse. ( ethtool
Sin embargo, muestra "sin enlace" en el lado de la PC). Esto podría o no tener algo que ver con la preparación para Wake-on-LAN o algo así, pero realmente no tengo idea.
Respuesta2
Pruebe el comando ifplugstatus
del paquetesi está enchufado
$ ifplugstatus net0
net0: unplugged
$ ifplugstatus wlnet0
wlnet0: link beat detected
Además de la salida en pantalla, también puede saberlo por el estado de salida del comando.
(de la página de manual)
VALORES DE DEVOLUCIÓN
0 Success 1 Failure 2 Link beat detected (only available when an interface is specified) 3 Unplugged (same here)
Respuesta3
Miré el código fuente de ethertools, pero no pude encontrar un lugar donde se describa el estado del enlace.
Luego descubrí que esto parece ser un duplicado exacto de una pregunta sobre SO:https://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network-cable-connector
Probé la mayoría de las respuestas enumeradas allí (mii-tools, ethertool, cat the carrier u operstate, dmesg) y ninguna funcionó correctamente en el enlace cuando ifconfig estaba inactivo.
Dado que la pregunta SO tiene más de 6 años, creo que la mayoría de lasposiblelas respuestas ya están ahí.
Mi voto sería que con las herramientas estándar de Linux no se puede verificar el operador hasta que se intenta abrirlo. Después de eso, mii-tools
pareció funcionar bien para la detección de enlaces y dar una respuesta uniforme.
No probé rtnetlink y algunas otras respuestas allí, que tratan con la detección decambiosen estado de enlace, que supongo que no es lo que querías.