
다음과 같을 수 있습니다.
ethtool ethx | grep detected
OS(Linux) 측에서 bond0이 아직 구성되지 않은 경우 "링크가 감지되지 않음"이 표시됩니까?
ethtool이 물리적 상태를 표시하지 않습니까?
답변1
Ethtool은 물리적 이더넷 어댑터에 대해서만 작동합니다. 이는 bond0, tun0 및 물리적 네트워크 장치가 아닌 기타 네트워크 장치가 ethtool에서 작동하지 않음을 의미합니다.
$ ethtool <eth?>
예를 들어:
$ ethtool eth0
다음을 제공합니다:
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
답변2
나는 당신이 소켓에 케이블이 꽂혀 있는 물리적인 상태가 아니라 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
하지만 일반적인 경우에는 여전히 도움이 되지 않습니다.