我的情况是,我的 PHY 具有 10/100/1000 功能,但仅支持 10/100。
默认行为是使用自动协商来查找最佳模式。在另一端,使用具有千兆位能力的路由器会导致一个非工作接口。我猜自动协商永远不会收敛。我听说有人尝试过 100Mbps 交换机,效果很好。
我可以使用它,ethtool
但这非常令人沮丧:
ethtool -s eth1 duplex full speed 100 autoneg off
我想做的是保留自动协商,但从选择中撤回 1000baseT/Full,以便它最终以 100Mbps 无缝运行。有什么方法可以使用ethtool
或内核选项来实现这一点吗? (在我的 2.6.32 内核上没有找到任何东西......)
(假设某个奇怪的家伙拿着一个 10Mbps 交换机来找我,我需要这个 eth 来与这个来自另一个世纪的交换机一起工作)
答案1
自动协商的问题是,如果您从一端将其关闭,另一端可以检测速度,但不能检测双工模式,默认为一半。然后你会得到双工不匹配,这几乎与链路不工作相同。因此,如果您在一端禁用自动协商,则实际上也必须在另一端禁用它。
(还有一个问题是,自动协商实际上并不测试电缆,而只是测试端点可以执行的操作。这可能会导致电缆上只有两对的千兆位链路,并且无法支持 1000Base-T。)
但 ethtool 似乎能够告诉驱动程序要宣传什么速度/双工模式。ethtool -s eth1 advertise 0x0f
将允许所有 10/100 模式,但不允许 1G。
advertise N
Sets the speed and duplex advertised by autonegotiation. The
argument is a hexadecimal value using one or a combination of
the following values:
0x001 10baseT Half
0x002 10baseT Full
0x004 100baseT Half
0x008 100baseT Full
0x010 1000baseT Half (not supported by IEEE standards)
0x020 1000baseT Full
答案2
我遇到了类似的问题,您的回答帮助我设置了正确的自动调整。问题是现在我想返回到以前的配置,我有更多的选择:
- 1000baseT/完整
- 10000baseT/完整
- 1000baseX/完整
- 10000baseSR/完整
- 10000baseLR/完整
现在我可以设置:
ethtool -s eth0 advertise 0x1000
但这只给了我10G。我可以设置
ethtool -s eth0 advertise 0x020
但同样,这将导致只有 1000baseT。
ethtool 手册页指出我们可以将它们结合起来,但我不知道如何结合。我尝试了多种组合,但我无法破译这个组合。
所以就在这篇文章之后我顿悟了。很简单,您需要对这些值进行求和。将 Bath 转换为十进制添加它们并将结果转换回十六进制。或者如果您知道如何的话,可以直接使用十六进制进行操作。程序员计算器可以帮助...
对我来说结果是:
ethtool -s eth0 advertise 0x1020
这会导致恢复原始情况:
Supported link modes: 1000baseT/Full
10000baseT/Full
1000baseX/Full
10000baseSR/Full
10000baseLR/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 1000baseT/Full
10000baseT/Full
1000baseX/Full
10000baseSR/Full
10000baseLR/Full
我希望这对某人有用。