服务器有多个网卡,只有其中一个已插入电缆。
如何测试给定端口是否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
在界面被 ifuped 之前,第一次似乎不起作用。
如何可靠地测试给定接口是否已插入电缆?
答案1
我假设您想要查找 NIC 的链接状态,而不是电缆插入插座的物理状况。 (这可能是不可能找到的。)
通过快速搜索,我想您已经有了答案。打开界面,等待它找到一个链接,如果有的话(可能需要几秒钟),然后检查ethtool
, orcarrier
和/或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 方法。就实际代码而言,驱动程序必须执行许多与字符和块驱动程序相同的任务。 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
,但这在一般情况下仍然没有帮助。
在一台计算机(连接e1000e
到 Cisco 交换机)上,关闭接口也会使交换机看到链路已关闭。
在另一台计算机(具有某些嵌入式 Realtek NIC)上,从上到下的更改使远程交换机短暂断开连接,但交换机看到链接然后又恢复正常。 (ethtool
不过,在 PC 端确实显示“无链接”。)这可能与准备 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 和其他一些答案,它们涉及检测变化处于链接状态,我认为这不是您想要的。