如何禁用自动协商并强制特定的以太网设置?

如何禁用自动协商并强制特定的以太网设置?

我有一台 Dell r710(运行 Debian GNU/Linux 6.0),目前位于数百英里外的数据中心,以太网卡卡在 10baseT 半双工。10baseT 没问题,但我希望它是全双工的。

有问题的卡是 Broadcom BCM5709:

areion:~# lspci |grep Ethernet
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
02:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)
02:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

使用 bnx2 驱动程序/固件:

areion:~# apt-cache policy firmware-bnx2
firmware-bnx2:
  Installed: 0.28
  Candidate: 0.28
  Version table:
 *** 0.28 0
        500 http://ftp.us.debian.org/debian/ squeeze/non-free amd64 Packages
        100 /var/lib/dpkg/status

并运行 squeeze 的原始内核:

areion:~# uname -a
Linux areion 2.6.32-5-amd64 #1 SMP Wed Jan 12 03:40:32 UTC 2011 x86_64 GNU/Linux

我尝试更改以太网设置:

ethtool -s eth0 speed 10 duplex full autoneg off

但随后我失去了所有连接,必须重新启动服务器才能再次连接。为了避免不断重新启动服务器,并找出 ethtool 命令是否挂起,我改用此脚本:

#!/bin/bash

ethtool -s eth0 speed 10 duplex full autoneg off 2>&1 > ethtool.log &

sleep 10
if [ $(jobs -r |wc -l) -gt 0 ]; then
   kill %1 || kill -9 %1
else
  echo '-----------' >> ethtool.log
  ethtool eth0 >> ethtool.log
fi
dmesg |tail > dmesg-recent.log

ethtool -s eth0 autoneg on

这使我能够在运行命令后看到接口的状态:

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:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Speed: Unknown!
        Duplex: Unknown! (255)
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: off
        MDI-X: Unknown
        Supports Wake-on: g
        Wake-on: d
        Link detected: no

来自 dmesg:

[  442.865157] bnx2: eth0 NIC Copper Link is Down

看起来要么是自动协商失败了,要么是我插入的交换机正在通告 10Mbit/半双工。我被告知交换机正在以 10M 全双工运行。

这可能是驱动程序问题、硬件问题、电缆问题还是交换机问题?我是否可以远程执行任何操作来识别问题根源,或者至少排除一些可能性?

更新

关闭自动协商,并将选项设置为 10/HD、10/FD、100/HD、100/FD 等(除自动协商的 10/HD 之外的任何选项)会导致NO-CARRIER,如 所报告的ip link show dev eth0。保持自动协商开启并通告除 10/HD 之外的任何选项也是如此。除了交换机问题之外,还有其他原因吗?

答案1

最好在两端都启用自动协商。这是网络供应商(包括 Cisco)的当前建议。请参阅:http://www.cisco.com/en/US/tech/tk389/tk214/technologies_tech_note09186a0080094781.shtml

对于您的问题,您必须找出它在远程端是如何配置的。如果它是自动协商的,那么您也应该在服务器上使用自动协商。如果它设置为特定的速度和双工,您应该匹配远程端。

请记住,可以保持协商状态,并且只允许协商特定的速度和双工。此外,功能的广告也可以配置。

如果网卡已协商为 10/HD,这通常意味着远端已禁用协商并将其设置为 10/FD。您的糟糕性能是由双工不匹配引起的。

您还应该尝试使用不同的网卡。更改驱动程序不会有帮助,因为链路检测(检测载波和速度)是由 NIC 的 PHY 部分完成的。

答案2

你能在你和服务器之间放置另一个设备,比如一个可以物理更改设置的交换机吗?那可能会有帮助。

答案3

不建议禁用自动协商,但如果您仍决定禁用,则必须在两端禁用它,并将两端设置为使用完全相同的速度和双工。如果您仅在一端禁用自动协商,则另一端将被迫采用 10MB/HD。如果您无法访问以太网电缆另一端的交换机,或者该交换机不支持此类自定义,则禁用自动协商不是一种选择。在某些情况下,您可以保持自动协商处于启用状态,但告诉卡或交换机以较低的速度或半双工通告。

相关内容