检测网络连接器的物理连接状态
1. 概述
假设我们要查询系统以太网端口的状态。在本教程中,我们将讨论发现其物理状态的三种方法。一个是探索文件系统目录,我们可以很容易地做到这一点。第二个是ip link 命令,它是旧的ifconfig 的替换。最后,ethtool 实用程序还提供了信息(尽管它可能不会默认安装)。
2.目录探索
Linux 中的一切都是文件,从系统信息到硬件设备。** /sys/class/net目录包含有关连接到系统的网络设备的信息。**
2.1.可用输出
假设网络名称遵循新的Predictable Network Interfaces Names 网络命名方案。我们将查找名为enp0s25的网卡的状态(而不是旧的约定名称eth0)。
有两个文件与电缆的连接状态有关。我们将使用cat 命令查看它们的内容。我们将考虑物理连接器的两种可能状态:插入或拔出。
**第一个文件是operstate,它显示网络是否能够发送或接收包。**在有线连接中,这相当于连接的电缆。在这种情况下,文件包含up:
$ cat /sys/class/net/enp0s25/operstate
up
当我们断开电缆时,文件包含down:
$ cat /sys/class/net/enp0s25/operstate
down
**第二个文件是carrier,我们可能比operstate更经常遇到它,但工作方式相同。**如果我们连接了电缆,则输出显示 1:
$ cat /sys/class/net/enp0s25/carrier
1
但是,如果电缆断开,我们得到 0:
$ cat /sys/class/net/enp0s25/carrier
0
2.2. 无效参数错误
如果网络设备关闭,则运营商文件为空 。例如,由于节电管理,网卡可能会关闭。 因此,在检查参数carrier的内容时,我们会得到一个错误:
$ cat /sys/class/net/enp0s25/carrier
cat: /sys/class/net/enp0s25/carrier: Invalid argument
属性operstate显示网络已关闭:
$ cat /sys/class/net/enp0s25/operstate
down
我们可以使用ip link命令和接口名称来激活(设置)网络设备:
$ sudo ip link set enp0s25 up
现在,carrier参数还显示(断开连接)状态:
$ cat /sys/class/net/enp0s25/carrier
0
2.3. 一次获取更多网络属性
当我们不仅要检索carrier,还要检索诸如operstate等其他属性时,我们可以使用grep 命令:
$ grep "" /sys/class/net/enp0s25/* -sH
/sys/class/net/enp0s25/addr_assign_type:0
/sys/class/net/enp0s25/address:ff:ff:ff:ff:ff:ff
/sys/class/net/enp0s25/addr_len:6
/sys/class/net/enp0s25/broadcast:ff:ff:ff:ff:ff:ff
/sys/class/net/enp0s25/carrier_changes:1
/sys/class/net/enp0s25/carrier_down_count:1
/sys/class/net/enp0s25/carrier_up_count:0
/sys/class/net/enp0s25/dev_id:0x0
/sys/class/net/enp0s25/dev_port:0
/sys/class/net/enp0s25/flags:0x1002
/sys/class/net/enp0s25/gro_flush_timeout:0
/sys/class/net/enp0s25/ifindex:2
/sys/class/net/enp0s25/iflink:2
...
这将返回一个格式良好的列表,其中包含不同的key:value对。 它们包括carrier、operstate和许多其他有用的信息,例如 MAC 地址。
3. ip link命令
ip link命令还可以显示网络设备的状态。当我们使用带有网络设备名称的show参数时,我们得到:
$ ip link show enp0s25
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
link/ether ff:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff
从该输出中,相关部分是NO-CARRIER标志,这表明没有电缆连接到端口。
但是,当我们连接一根电缆时,输出如下所示:
$ ip link show enp0s25
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ff:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff
标志LOWER_UP显示物理层信息 - 具体来说,它告诉我们以太网电缆是否连接到端口。
4. ethtool命令
需要诊断的设备中可能没有ethtool。如果我们安装它,我们可以使用它返回许多提供有关网络的更多信息的参数。
我们需要使用sudo调用命令来检索所有的输出(否则,我们不会得到wake-on属性):
$ sudo ethtool enp0s25
Settings for enp0s25:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: Unknown!
Duplex: Unknown! (255)
Auto-negotiation: on
Port: Twisted Pair
PHYAD: 2
Transceiver: internal
MDI-X: Unknown (auto)
Supports Wake-on: pumbg
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: no
该工具返回许多标志及其状态。**我们必须寻找Link detected标志来查看是否存在物理连接。**我们可以使用grep命令来获取它:
$ sudo ethtool enp0s25 | grep "Link detected"
Link detected: no
如果有电缆连接到端口,输出将显示它:
$ sudo ethtool enp0s25 | grep "Link detected"
Link detected: yes