如何在 Linux 中检查以太网端口的物理状态?

Jad*_*ias 77 networking linux ethernet

我想检查指定的 ethX 是否物理上启动或关闭。我如何使用命令行执行此操作?

小智 78

$ ethtool <eth?>

例如:

$ ethtool eth0
Run Code Online (Sandbox Code Playgroud)

提供:

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
Run Code Online (Sandbox Code Playgroud)


小智 53

检查/sys/class/net/eth0/operstate此目录中的其他文件。

据我所知,这是特定于 Linux 2.6+ 的,但它为内核驱动程序提供了一个干净的接口。

sys可以在此处找到文件系统这部分的完整文档:

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-net

  • /sys/class/net/eth0/carrier 对我来说是这个问题的完美答案。 (10认同)

Kur*_*urt 36

ethtool [interface]

最后一行显示了你想要的:

# ethtool eth0
eth0 的设置:
        支持的端口:[ TP ]
        支持的链路模式:10baseT/Half 10baseT/Full 
                                100baseT/半 100baseT/全 
                                1000baseT/全 
        支持自动协商:是
        广告链接模式:10baseT/Half 10baseT/Full 
                                100baseT/半 100baseT/全 
                                1000baseT/全 
        广告自动协商:是
        速度:1000Mb/s
        双工:全
        端口:双绞线
        菲亚德:0
        收发器:内部
        自动协商:开
        支持唤醒:g
        唤醒:d
        当前消息级别:0x00000037 (55)
        检测到链接:是

  • 如果你检查这个: http://en.wikipedia.org/wiki/OSI_model 。您将看到最后一行是关于另一层:链路层。我刚刚测试了这个。使用坏电缆时,物理层已启动,但链路层未启动。然后我切换到另一根电缆,所有层都出现了。 (4认同)

goo*_*goo 28

ip link show
Run Code Online (Sandbox Code Playgroud)

是另一个。好老

ifconfig dev_name
Run Code Online (Sandbox Code Playgroud)

或者

ifconfig -a
Run Code Online (Sandbox Code Playgroud)

还会告诉您界面是否已启动。注意:使用这些方法时要小心,因为它们可能会显示有关链接状态的过时信息。

  • 我相信 ifconfig 有时会显示过时的数据。它可以在链接断开时显示 UP,但 ethtool 界面将始终显示正确的信息 AFAIK。 (4认同)
  • 我认为@sed_and_done 是对的。在 Red Hat VM 上,如果我断开 NIC 的连接,ethtool 会立即显示“检测到链接:no”而不是“检测到链接:是”,并且 **ip link show** 显示“&lt;NO-CARRIER,BROADCAST,MULTICAST,UP” &gt;` 而不是 `&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;`,但 **ifconfig -a** 显示的是 `UP BROADCAST MULTICAST MTU:1500 Metric:1`,这与连接 NIC 时相同。 (2认同)

lep*_*ole 18

dmesg | grep eth
Run Code Online (Sandbox Code Playgroud)

你应该看到所有的状态变化


Ala*_*dae 9

您也可以使用 mii-tool 查看链接是否已启动并检查协商速度。

# mii-tool
eth0:协商 100baseTx-FD,链接正常

  • mii-tool 已弃用,不适用于 GbE 接口。 (4认同)
  • @DaveCheney `# mii-tool eth0:协商 1000baseT-FD 流量控制,链接正常` (2认同)

iwa*_*rue 7

要快速添加到@ goo的答案中,您可以将ip link或解释ip link show INTERFACE如下。

这是一个在管理上处于开启状态但在物理上处于关闭状态的端口:

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000

换句话说,UP您可以看到表示系统已配置为尝试使用 NIC 进行网络连接。在NO-CARRIER这里告诉你什么阻止网络从工作的问题。

这是一个在管理上关闭的端口(它的物理层在技术上是“向上”的 - 它是一个虚拟机):

3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

最后,这个端口工作正常:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP mode DEFAULT group default qlen 1000

它是管理上的UPLOWER_UP表示物理层正在工作(即有载波),第二个UP确认(实际上)IP 层已启动。