O servidor possui várias NICs, das quais apenas uma possui cabo conectado.
Como posso testar se determinada porta ethX
está conectada ou não?
encontrei muitos parecidosquestões, mas nem ethtool
nem cat /sys/class/net/eth1/carrier
funciona para mim.
No meu caso, o cabo está realmente conectado eth2
, mas ethtool
ainda mostraLink 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
Não há nenhum cabo conectado eth3
, mas ethtool
a saída parece quase a mesma:
diff <(ethtool eth2) <(ethtool eth3)
1c1
< Settings for eth2:
---
> Settings for eth3:
11c11
< Port: Direct Attach Copper
---
> Port: Other
Primeiro, quando eu abro a interface eth2
, depois ethtool
mostra Link detected: yes
. Depois disso, ethtool
reporta o link como yes
, mesmo quando eu desço a interface.
Resumindo, ethtool
não parece funcionar na primeira vez, antes que a interface seja atualizada.
Como posso testar com segurança se determinada interface tem cabo conectado ou não??
Responder1
Presumo que você queira encontrar o estado do link da NIC, não a condição física de ter um cabo conectado ao soquete. (isso pode ser impossível de descobrir.)
Em uma pesquisa rápida, acho que você já tem a resposta. Abra a interface, espere encontrar um link, se houver (isso pode levar alguns segundos), e verifique a saída de ethtool
, ou carrier
e/ou operstate
em /sys/class/net/$NIC/
.
ifconfig somenic up
parece fazer estas duas ioctl
chamadas:
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
Ou seja, ele define IFF_UP
. Baseado emaqui, essa configuração é o que realmente faz com que o dispositivo seja inicializado:
Em seguida, ele define o
IFF_UP
bitdev->flag
por meio deioctl(SIOCSIFFLAGS)
(Socket I/O Control Set Interface Flags) para ligar a interface.O último comando (
ioctl(SIOCSIFFLAGS)
), porém, chama o método open para o dispositivo.No que diz respeito ao código real, o driver precisa executar muitas das mesmas tarefas que os drivers char e block. open solicita quaisquer recursos do sistema necessários e informa a interface para ativar;
Há comentários sobre o efeito semelhante noe1000e
fonte do driver:
/**
* 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)
Isso implicaria que não há como encontrar de forma significativa o estado do link de uma NIC que não sejaacima, já que o hardware nem seria inicializado.
É claro que é pelo menos teoricamente possível que alguns drivers se comportem de maneira diferente e inicializem o hardware antes que alguém configure IFF_UP
, mas isso ainda não ajudaria no caso geral.
Em uma máquina (com um e1000e
switch Cisco conectado), puxar a interface para baixo também faz com que o switch veja o link cair.
Em outra máquina (com algumas NICs Realtek incorporadas), as alterações de cima para baixo fazem com que o switch remoto se desconecte brevemente, mas o switch vê o link e depois volta a funcionar. ( ethtool
mas mostra "sem link" no lado do PC.) Isso pode ou não ter algo a ver com a preparação para o Wake-on-LAN ou algo parecido, mas realmente não tenho ideia.
Responder2
Experimente o comando ifplugstatus
do pacoteifplugd
$ ifplugstatus net0
net0: unplugged
$ ifplugstatus wlnet0
wlnet0: link beat detected
Além da saída da tela, você também pode saber pelo status de saída do comando.
(da página de manual)
VALORES DE RETORNO
0 Success 1 Failure 2 Link beat detected (only available when an interface is specified) 3 Unplugged (same here)
Responder3
Examinei o código-fonte do ethertools, mas não consegui encontrar um local onde o estado do link fosse descrito.
Então descobri que esta parece ser uma duplicata exata de uma pergunta no SO:https://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network-cable-connector
Tentei a maioria das respostas listadas lá (mii-tools, ethertool, cat the carrier ou operastate, dmesg) e nenhuma delas funcionou corretamente no link quando o ifconfig estava inativo.
Como a pergunta SO tem mais de 6 anos, acho que a maioria dospossívelas respostas já estão lá.
Meu voto seria que, com as ferramentas padrão do Linux, você não pode verificar a operadora até tentar mencioná-la. Depois disso, mii-tools
pareceu funcionar bem para detecção de links e fornecer respostas uniformes.
Eu não tentei o rtnetlink e algumas outras respostas lá, que tratam da detecção demudançasno estado do link, que, presumo, não é o que você queria.