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