서버에는 여러 개의 NIC가 있으며 그 중 하나만 케이블이 연결되어 있습니다.
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
인터페이스가 실행되기 전에는 처음에는 작동하지 않는 것 같습니다.
해당 인터페이스에 케이블이 연결되어 있는지 여부를 어떻게 안정적으로 테스트할 수 있습니까??
답변1
나는 당신이 소켓에 케이블이 꽂혀 있는 물리적인 상태가 아니라 NIC의 링크 상태를 찾고 싶다고 가정합니다. (그것은 알아내는 것이 불가능할 수도 있습니다.)
빠르게 검색해 보면 이미 답이 나와 있는 것 같습니다. 인터페이스를 실행하고 링크를 찾을 때까지 기다린 후(몇 초 정도 걸릴 수 있음), ethtool
또는 carrier
및/또는 operstate
in 의 출력을 확인합니다 /sys/class/net/$NIC/
.
ifconfig somenic up
다음 두 가지 호출을 하는 것 같습니다 ioctl
.
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
. 기반여기, 설정에 따라 실제로 장치가 초기화됩니다.
그런 다음 인터페이스를 켜기 위해 (소켓 I/O 제어 설정 인터페이스 플래그)를 통해
IFF_UP
비트를 설정합니다 .dev->flag
ioctl(SIOCSIFFLAGS)
그러나 후자의 명령(
ioctl(SIOCSIFFLAGS)
)은 장치에 대한 open 메소드를 호출합니다.실제 코드에 관한 한 드라이버는 char 및 블록 드라이버와 동일한 작업을 많이 수행해야 합니다. 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가 아닌 NIC의 링크 상태를 의미 있게 찾을 수 있는 방법이 없음을 의미합니다.위로, 하드웨어가 초기화되지 않기 때문입니다.
물론 일부 드라이버가 다르게 동작하고 누군가가 설정하기 전에 하드웨어를 초기화하는 것은 적어도 이론적으로는 가능 IFF_UP
하지만 일반적인 경우에는 여전히 도움이 되지 않습니다.
한 시스템( e1000e
Cisco 스위치에 연결된)에서 인터페이스를 아래로 당기면 스위치도 링크가 다운되는 것을 볼 수 있습니다.
다른 시스템(일부 Realtek NIC가 내장되어 있음)에서 위에서 아래로 변경하면 원격 스위치의 연결이 잠시 끊어지지만 스위치는 링크를 확인한 다음 다시 활성화됩니다. ( ethtool
그러나 PC 측에는 "링크 없음"이 표시됩니다.) 이는 Wake-on-LAN 준비와 관련이 있을 수도 있고 없을 수도 있지만 실제로는 잘 모르겠습니다.
답변2
ifplugstatus
패키지에서 명령을 사용해 보세요.ifplugd
$ 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와 다른 답변을 시도하지 않았습니다.변화링크 상태에 있는데, 이는 당신이 원하는 것이 아닐 것이라고 생각합니다.