使用 ethtool 在 Linux 中检查网络接口设置

CompTIABeginner
立即练习

介绍

在本实验中,你将学习如何在 Linux 环境中使用 ethtool 命令行工具来检查和管理网络接口设置。你将首先安装该工具并识别你的主要网络接口。在此之后,你将练习查看当前接口的速度和双工模式,手动将这些参数设置为特定的配置,例如 10Mbps 半双工,然后将接口恢复到其默认的自动协商状态。

通过完成这些步骤,你将获得诊断物理层网络问题的实践技能。本实验最后将教你如何分析网卡的所支持的链路模式(supported link modes),这对于解决由网络设备之间的速度或双工不匹配引起潜在性能问题至关重要。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 98%。获得了学习者 100% 的好评率。

安装 ethtool 并识别你的网络接口

在此步骤中,你将开始安装 ethtool,这是一个用于检查和修改网络接口控制器参数的关键命令行实用程序。在确保该工具可用后,你将学习如何识别系统中主要网络接口的名称,这是进行任何后续网络分析的前提。

首先,让我们更新软件包列表并安装 ethtool。在安装新软件包之前运行 apt update 是一个好习惯,以确保你从仓库中获取到最新可用的版本。

打开一个终端,它应该已经在你的 ~/project 目录中打开。执行以下命令:

sudo apt update
sudo apt install ethtool -y

-y 标志会自动对安装提示回答“是”,从而使过程无需交互。你应该会看到输出显示正在读取软件包列表并安装 ethtool

现在 ethtool 已经安装完毕,你需要确定要检查哪个网络接口。一个系统可能拥有多个接口,例如回环接口(lo)、有线以太网接口(eth0enp0s3)以及其他接口。ip 命令是显示和操作网络设备、地址和路由的现代标准。

要列出所有网络接口及其配置,请使用 ip a 命令(ip addr 的简写):

ip a

你将看到所有网络接口的列表。寻找一个不是 lo(回环接口)并且状态为 UP 的接口。这通常是你的主要网络连接。接口名称通常是 eth0 或以 enp 开头的名称。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:b1:ae brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.232/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159922sec preferred_lft 1892159922sec
    inet6 fe80::216:3eff:fe01:b1ae/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:da:5e:55:d4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

从上面的示例输出中,主要网络接口名称是 eth0。你可能还会看到其他接口,如 docker0,但对于本实验,我们将重点关注 eth0。记下你的接口名称,因为在接下来的步骤中会用到它。你现在已经成功安装了必要的工具并识别了你的目标网络接口。

使用 ethtool 查看当前接口速度和双工模式

在此步骤中,你将使用刚刚安装的 ethtool 工具来检查网络接口的当前运行状态。具体来说,你将关注两个关键参数:速度 (Speed)双工模式 (Duplex)

网络接口卡(NIC)以特定的速度(例如,10 Mbps、100 Mbps、1000 Mbps)和两种双工模式之一运行:

  • 半双工 (Half-duplex):接口在给定时间内只能发送或接收数据,但不能同时进行。
  • 全双工 (Full-duplex):接口可以同时发送和接收数据,这显著提高了吞吐量。

现代网络几乎总是使用一种称为自动协商 (auto-negotiation) 的过程,其中网卡和连接的网络设备(如交换机)会自动通信,以确定双方都支持的最高可能速度和双工模式。

现在,让我们查看你在上一步中识别的网络接口的这些设置(我们将使用 eth0 作为示例)。在你的终端中,运行以下命令。如果你的接口名称不同,请记住将其替换为你的实际接口名称。

ethtool eth0

按下 Enter 后,你将看到关于该接口的详细信息。在某些虚拟环境中,你可能会看到许多“Not reported”或“Unknown”的值,这表明虚拟网络接口的功能有限。对于本实验环境来说,这是正常的。

Settings for eth0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
netlink error: Operation not permitted
        Link detected: yes

仔细观察输出。本步骤的关键行是:

  • Speed: Unknown!: 驱动程序未报告当前速度。
  • Duplex: Unknown! (255): 双工模式也未报告。
  • Auto-negotiation: off: 这很重要。它显示接口未设置为自动协商,这就是为什么我们将在下一步手动设置速度和双工模式。
  • netlink error: Operation not permitted: 此错误在权限受限的容器化或虚拟环境中很常见。它不会阻止我们完成实验。

Link detected: yes 行确认与网络的物理连接是活动的。这些设置是物理层(Layer 1)如何运行的基础。

手动将接口速度设置为 10Mbps 半双工

在此步骤中,你将学习如何手动覆盖自动协商的设置。虽然自动协商是现代网络的标准,但在极少数情况下,例如连接到旧的遗留硬件或排除特定的链路问题时,你可能需要强制设置特定的速度和双工模式。

重要提示: 手动设置这些参数如果操作不当,可能会导致网络连接问题。强制设置与电缆另一端的设备(例如交换机端口)不匹配的参数,可能会导致双工不匹配 (duplex mismatch),从而严重降低网络性能,或者可能导致链路完全失效。在此虚拟环境中,尝试此更改应该是安全的。

要更改设置,你将使用带有 -s 标志的 ethtool 命令,-s 代表“settings”(设置)。此操作需要管理员权限,因此你必须使用 sudo

让我们尝试将接口速度设置为 10 Mbps,双工模式设置为半双工。如果你的接口名称不同,请记住将其替换为你的接口名称。

sudo ethtool -s eth0 speed 10 duplex half

此命令在成功时不会产生任何输出。要确认更改是否已应用,你必须使用上一步中的命令再次检查接口设置:

ethtool eth0

现在,检查输出。查找 SpeedDuplex 行。即使存在初始错误,你也会看到设置速度和双工的命令已成功执行。

Settings for eth0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 10Mb/s
        Duplex: Half
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
netlink error: Operation not permitted
        Link detected: yes

你现在应该看到 Speed: 10Mb/sDuplex: Half。同时也要注意 Auto-negotiation 仍然是 off,这是预期的,因为你已手动设置了参数。这证实了你可以成功修改网络接口设置。

使用 ethtool -k 查看和修改卸载功能

在此步骤中,你将学习如何检查和修改网络卸载功能。这些是高级网卡功能,允许硬件执行原本由 CPU 处理的任务,例如计算校验和或分段数据。卸载这些任务可以提高网络性能。

首先,让我们使用 -k(或 --show-features)标志来查看接口的当前卸载设置。

ethtool -k eth0

你将看到一个功能列表,其中一些是 on(开启),一些是 off(关闭)。[fixed] 状态表示该设置无法由用户更改。

Features for eth0:
rx-checksumming: on [fixed]
tx-checksumming: on
        tx-checksum-ipv4: off [fixed]
        tx-checksum-ip-generic: on
        tx-checksum-ipv6: off [fixed]
        tx-checksum-fcoe-crc: off [fixed]
        tx-checksum-sctp: off [fixed]
scatter-gather: on
        tx-scatter-gather: on
        tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-ecn-segmentation: on
        tx-tcp-mangleid-segmentation: off
        tx-tcp6-segmentation: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
... (输出很长,可能会有所不同)

现在,让我们练习修改其中一个设置。我们将暂时禁用 TX 校验和。此操作需要管理员权限,因此你必须使用 sudo-K(或 --features)标志。

sudo ethtool -K eth0 tx-checksumming off

该命令现在会报告它所做的更改。请注意,禁用 tx-checksumming 会自动禁用其他相关功能。这是因为某些功能依赖于其他功能。

Actual changes:
tx-checksum-ip-generic: off
tx-tcp-segmentation: off [not requested]
tx-tcp-ecn-segmentation: off [not requested]
tx-tcp6-segmentation: off [not requested]

要验证完整列表中的更改,你可以再次运行 ethtool -k eth0

现在,让我们重新启用它以恢复默认的、增强性能的行为。

sudo ethtool -K eth0 tx-checksumming on

同样,输出显示了实际的更改。你可能会看到,即使你请求某个功能 on,如果硬件将其固定,它仍然会保持 off。它还会显示相关功能被自动重新启用。

Actual changes:
tx-checksum-ipv4: off [requested on]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [requested on]
tx-tcp-segmentation: on [not requested]
tx-tcp-ecn-segmentation: on [not requested]
tx-tcp6-segmentation: on [not requested]
tx-checksum-fcoe-crc: off [requested on]
tx-checksum-sctp: off [requested on]

通过完成此步骤,你已学会如何检查和修改网卡的硬件卸载功能,并了解了功能依赖关系和硬件限制如何影响结果。

使用 ethtool -S 查看接口统计信息

在最后一步中,你将学习如何查看网络接口的详细统计信息。这是 ethtool 在日常网络故障排除中最常用的功能之一。该工具提供了大量信息,包括发送和接收的数据包数量、字节计数,以及可能最重要的错误计数。

要查看这些统计信息,请使用 -S(或 --statistics)标志。请记住将 eth0 替换为你的接口名称。

ethtool -S eth0

输出将是一个长长的计数器列表。在此环境中,网卡使用多个队列,因此统计信息是按队列报告的。让我们关注 rx_queue_tx_queue_ 数据包计数器。

NIC statistics:
     rx_queue_0_packets: 63768
     rx_queue_0_bytes: 93307801
     ...
     rx_queue_1_packets: 77180
     rx_queue_1_bytes: 111222183
     ...
     tx_queue_0_packets: 14363
     tx_queue_0_bytes: 4229599
     ...
     tx_queue_1_packets: 5287
     tx_queue_1_bytes: 1262219
     ... (许多其他统计信息)

注意:你的数字会不同,因为它们反映了自接口启动以来的所有流量。

现在,让我们生成一些网络流量来观察这些计数器的变化。我们将使用 ping 命令向本地回环地址 (127.0.0.1) 发送几个数据包,它指向的是本地机器本身。-c 4 标志告诉 ping 发送正好 4 个数据包。

ping -c 4 127.0.0.1

你将看到显示 4 个数据包被发送和接收的输出。

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.037 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.037/0.038/0.040/0.001 ms

在你生成了一些流量后,让我们再次检查统计信息:

ethtool -S eth0

再次检查 rx_queue_*_packetstx_queue_*_packets 的值。

NIC statistics:
     rx_queue_0_packets: 63879
     ...
     rx_queue_1_packets: 77227
     ...
     tx_queue_0_packets: 14460
     ...
     tx_queue_1_packets: 5328
     ... (许多其他统计信息)

你应该看到接收和发送队列的总数据包数量有所增加。由于后台系统活动,增加的数量可能比我们 ping 命令的 4 个数据包要多,但这种变化证实了接口正在正确地发送和接收数据。这是验证链路健康状况的基本技术。如果你正在排查问题并看到错误计数器在增加,这将是问题的一个明确迹象。

总结

在此实验中,你学习了如何使用 Linux 中的 ethtool 工具管理网络接口设置。你首先安装了 ethtool 包,并使用 ip a 命令识别了你的主网络接口名称。之后,你使用 ethtool 检查了接口当前的运行参数,然后手动设置了其速度和双工模式。

该实验接着指导你探索了更高级的功能。你学习了如何使用 -k-K 标志来查看和修改硬件卸载设置,例如 tx-checksumming。最后,你学习了如何使用 ethtool -S 检查详细的接口统计信息,以及如何使用 ping 生成流量来实时查看这些统计信息的改变,这提供了一种验证链路健康和排查连接问题的实用方法。