ethtool 的乐趣

现在是时候坦诚一点了。开源社区在为软件包想出一些非常晦涩的名称方面确实做得过火了。让我们以这个软件包列表为例:emacs、gimp、gcc、mutt、grub、kyle rankin、parted、tar、mutt、vim。十分之九的情况下,普通人看到这个列表都会对每个软件包的作用感到非常困惑。这正是开源社区中软件命名的美妙(和野蛮)之处。但偶尔也会有一个工具出现在我的屏幕上,它的名字如此直白,以至于我不得不运行“man”来确保我的眼睛没有欺骗我。在这种情况下,它是 ethtool。是的,一个简单的名字,却是一个如此强大的实用程序。这个名字本身就告诉你它的作用,一个以太网工具。哒哒!就是这样,以太网工具。

Ethtool 的作用是允许您修改 Linux 内部的以太网适配器设置。我今天将要写的内容不是以太网适配器的细节(合并、设置环、寄存器转储等)。但我将要讨论的是我在过去十年左右学到的一些非常好的技巧和窍门。

那么,事不宜迟,让我们开始吧。首先,我们需要确定您正在使用哪个以太网适配器。

 ifconfig 

但请记住,ethtool 仅适用于物理以太网适配器。这意味着 bond0、tun0 和任何其他非物理网络设备的网络设备都无法与 ethtool 一起使用。

现在您知道了您的设备,让我们玩得开心吧,好吗?注意:大多数 Linux 内核将以太网设备标记为 ethX,其中 X 是物理以太网接口的编号(从 0 开始)。

驱动程序信息和统计信息

我知道我知道,先从最少使用的东西开始。但是,嘿,有人可能会觉得这很有用,对吧?在处理内核级问题时,我可能在 10 多年中不得不查询驱动程序信息十几次,但总有人会在他们生命中的某个时刻遇到这种情况,让我告诉你,只需运行一个命令,比挖掘 lsmod 并希望模块正确地拾取了驱动程序要容易得多。

 ethtool -i ethX 
示例输出

driver: r8169 
version: 2.3LK-NAPI 
firmware-version:
bus-info:0000:02:00.0 

收集统计信息对于排查网卡的 rx/tx 问题也很有用。通过运行以下命令,您将获得有关网卡的统计信息。

 ethtool -S ethX 
 
	NIC statistics:
     tx_packets: 148683 
     rx_packets: 179489 
     tx_errors: 0 
     rx_errors: 0 
     rx_missed: 0 
     align_errors: 0 
     tx_single_collisions: 0 
     tx_multi_collisions: 0 
     unicast: 116884 
     broadcast: 25361 
     multicast: 61674 
     tx_aborted: 0 
     tx_underrun: 0

从这里您可以看到已发送、已接收和错误数据包的列表。这在网络故障排除期间可能很有用,并结合其他网络实用程序(如 tcpdump)。

追踪您的网卡

我相信你们中的许多人都遇到过这种情况,因为我知道我也遇到过。有没有服务器有超过 2 个网卡?举手。有没有超过两个?有没有必须追踪在 Linux 中记录为 ethX 的物理网卡?当然,您可以采用硬方法:从 ifconfig 获取 MAC 地址,将所有电缆插入托管交换机,然后转储交换机上的表以查找 MAC 地址的去向。或者,使用 ethtool 跟踪闪烁的灯。这个小开关已经无数次拯救了我的命,尤其是在设置防火墙/路由器设备时。

ethtool -p ethX [N] *其中 [N] 是闪烁的秒数。 ethtool -p eth0 15 以太网设备 0 闪烁 15 秒

看那里!以太网适配器背面的闪烁灯。无需搜索来弄清楚物理适配器上的 eth0 和 eth1 是什么。“ZO RELAXEN UND WATSCHEN DER BLINKENLICHTEN。”

测试您的以太网适配器

现在,这是我以前从未用过的,因为以太网适配器发生故障的情况很少见。但尽管如此,这仍然是系统管理员工具箱中一个有用的开关。这将对您的硬件以太网接口运行一些基本测试。此测试有两个选项,在线测试(测试 nvram 和链路测试)和离线测试(寄存器、内存、环回、中断)。离线测试很可能会在测试期间使您的以太网连接离线,因此如果您要针对生产服务器或您仅具有远程访问权限的计算机运行此测试,请注意这一点。

 ethtool -t ethX [offline|online] 
*注意:某些以太网设备不支持在线或离线测试。在此博客文章中,我发现 4 个 NIC 不支持测试,但其中一半支持测试。
The test result is PASS 
The test extra info: 
nvram test     (online)          0 
link test      (online)          0 
register test  (offline)         0 
memory test    (offline)         0 
loopback test  (offline)         0 
interrupt test (offline)         0 
更改以太网设置 - 如果您在没有开关的情况下运行 ethtool ethX,您将获得以太网设备的设置,如下所示
 Settings for eth0:
	Supported ports: [ TP MII ] 
	Supported link modes:   10baseT/Half
				10baseT/Full 100baseT/Half 100baseT/Full
				1000baseT/Half 1000baseT/Full
	Supports auto-negotiation: Yes 
	Advertised link modes:  10baseT/Half
				10baseT/Full 100baseT/Half 100baseT/Full
				1000baseT/Half 1000baseT/Full
	Advertised pause frame use: No 
	Advertised auto-negotiation: Yes Link
	partner advertised link modes:	10baseT/Half 10baseT/Full
                         	        100baseT/Half 100baseT/Full
	Link partner advertised pause frame use: No 
	Link partner advertised auto-negotiation: Yes 
	Speed: 100Mb/s Duplex: Full 
	Port: MII 
	PHYAD:0
	Transceiver: internal 
	Auto-negotiation: on 
	Supports Wake-on: pumbg
	Wake-on: g 
	Current message level: 0x00000033 (51) 
	Link detected: yes

这需要处理很多内容,但可以保证 ethtool 只是逐行打印出来,尽可能多地占用空间。它可以总结如下:设备支持 TP 和 MII,高达 1000baseT/Full,自动协商。合作伙伴(交换机)支持高达 100baseT/Full,以及自动协商。设备的实际设置:100Mb/s,全双工,运行 MII,物理地址 0,设置为自动协商,WoL 已启用并且检测到链路。当然还有更多部分,但这些几乎是您需要知道的重要信息。

当我的设备出现故障时,我倾向于运行:ethtool ethX,检查支持的链路模式、链路合作伙伴通告的链路模式以及实际速度和双工。如果我的支持的链路模式设置较低(例如,由于某种原因,设置为 10/半双工),但我的交换机支持 1000baseT/Full,那么我将使用 ethtool -s ethX 将我的以太网设置更改为 1000baseT/Full。您从 ethtool ethX 中看到的几乎任何内容都可以通过 ethtool -S ethX 进行更改。在这种情况下,您将使用以下命令

ethtool -S eth0 speed 1000 duplex full autoneg on

注意:我设置了 autoneg on 只是以防万一。设备在启动时应该已自动协商正确,但实际上并没有。因此,为了我自己的理智,我倾向于只打开自动协商。

您还可以使用此开关设置网络唤醒。我今天不会深入探讨网络唤醒,因为我在个人博客 www.jaysonbroughton.com 上对此进行了大量记录。

结论

我希望您现在已经弄清楚这只是 ethtool 的基本介绍,而不是以太网标准的完整课程,因为我遗漏了一些信息,并根据我使用以太网实用程序的多年经验替换了我认为必要的信息。您可以使用 ethtool 做更多的事情,并且与其他此类工具结合使用,这可以成为系统管理员工具箱中一种致命的工具。

加载 Disqus 评论