是否需要端口自动协商(Autonegotiation)

对于服务器或者交换机来说,是否需要开启端口的自动协商(autoneg)?
答案很明确,必须要。除非你的设备是 10 年之前的老古董,这个对于目前托管在 IDC 的机器来说基本不存在这个问题。并且,越是新的设备越是需要支持自动协商。由于目前所有的主流设备出厂默认设置即为自动协商,因此,对于工程师来说,没有任何的工作量可言,何乐而不为。
为什么要这样?请看这里(1,2 )。

随便挑台交换机看看:
#show interfaces Gi0/25 capabilities
GigabitEthernet0/25
  Model:                 WS-C2960G-48TC-L
  Type:                  10/100/1000BaseTX
  Speed:                 10,100,1000,auto
  Duplex:                half,full,auto

对于服务器来说,不管是 1G 的还是 10G 的,默认都是 auto:
# ethtool  eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supported pause frame use: Symmetric
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised pause frame use: Symmetric
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on

# ethtool  eth2
Settings for eth2:
    Supported ports: [ FIBRE ]
    Supported link modes:   1000baseT/Full
                            10000baseT/Full
    Supported pause frame use: No
    Supports auto-negotiation: Yes
    Advertised link modes:  1000baseT/Full
                            10000baseT/Full
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Speed: 10000Mb/s
    Duplex: Full
    Port: FIBRE
    PHYAD: 0
    Transceiver: external
    Auto-negotiation: on

有点比较例外。 DELL 11G 的远程卡(idrac6)基本是属于半残废级别,主要跟网卡的自动协商有关。idrac6 跟 idrac7 差别还比较大,idrac6 只有 100Mb 和 10Mb 两种;而 idrac7 则有 1000、100、10 三种:
idrac6:
# racadm -r 192.168.1.1:443   -u root -p calvin  getconfig  -g cfgNetTuning
cfgNetTuningNic100MB=1                                                       
cfgNetTuningNicFullDuplex=1
cfgNetTuningNicMtu=1500
cfgNetTuningNicAutoneg=1

idrac7:
# racadm -r 192.168.1.2:443   -u root -p calvin  getconfig  -g cfgNetTuning
cfgNetTuningNic100MB=2                                                       
cfgNetTuningNicFullDuplex=1
cfgNetTuningNicMtu=1500
cfgNetTuningNicAutoneg=1

默认情况下,两种型号的产品都是在开启 auto negotiation 的。默认是像下面这样:
Gi0/2                        connected    2          a-full  a-100 10/100/1000BaseTX
Gi0/3                        connected    2          a-full  a-100 10/100/1000BaseTX
Gi0/4                        connected    2          a-full  a-100 10/100/1000BaseTX
Gi0/5                        connected    2          a-full  a-100 10/100/1000BaseTX

但是,有时候情况不是很理想,这是我们另外一台接入层的 interface status 情况:
Gi0/19                       connected    11          a-full a-1000 10/100/1000BaseTX
Gi0/20                       connected    11          a-full a-1000 10/100/1000BaseTX
Gi0/21                       connected    11          a-full  a-100 10/100/1000BaseTX
Gi0/22                       connected    11          a-full a-1000 10/100/1000BaseTX
Gi0/23                       connected    11          a-full   a-10 10/100/1000BaseTX
Gi0/24                       connected    11          a-full a-1000 10/100/1000BaseTX
Gi0/25                       connected    11          a-full a-1000 10/100/1000BaseTX

造成的后果就是远程卡完全无法使用,并且这个在早期的 idrac6 "配合" 上一代的 2960G 更为明显。为了保险起见,还是将所有 idrac6 的 autoneg 关闭:
# racadm config -g cfgNetTuning -o cfgNetTuningNicAutoneg 0

做一个 soft reset:
# racadm racreset