igozhang

——

    物理机更换 Bond 网卡

    主机: node-a01(基地A)
    时间: 2026-06-23
    操作: 10Gb 双口网卡硬件更换、bond0 配置同步、bnxt_en 驱动升级


    ENV

    类别 信息
    操作系统 Rocky Linux 9.3(el9_3
    内核 5.14.0-362.8.1.el9_3.x86_64
    网络管理 NetworkManager(nmcli
    Bond 配置路径 /etc/NetworkManager/system-connections/*.nmconnection
    Bond 接口 bond0,IP 8.8.243.101/24
    Bond 模式 active-backup(fault-tolerance)

    1. 更换前后对比

    项目 更换前 更换后(当前)
    芯片型号 BCM57810 NetXtreme II 10Gb BCM57412 NetXtreme-E 10Gb RDMA
    PCI 槽位 01:00.0 / 22:00.0 不变
    接口名 ens1f0 / ens2f0 ens1f0np0 / ens2f0np0
    驱动模块 bnx2x bnxt_en(kmod 外置驱动)
    驱动版本(ethtool version 5.14.0-362.8.1.el9_3.x86_64(内核 in-tree) 1.10.3-234.0.154.0
    驱动 RPM kmod-bnxt_en-1.10.3-234.0.154.0.rocky9u3.x86_64
    固件版本 mbi 7.15.42 / bc 7.15.23 234.0.150.0 / pkg 234.1.124.0
    Bond slaves ens1f0 ens2f0 ens1f0np0 ens2f0np0
    Active slave ens2f0 ens1f0np0
    Primary slave ens2f0 ens1f0np0(第一个 slave,默认主用)
    链路 双口 10G Full UP 双口 10G Full UP
    Bond 状态 UP UP

    说明: 换卡初装时使用内核自带 in-tree bnxt_enversion 显示内核版本;安装 Broadcom kmod 包并重启后,version 显示独立驱动版本 1.10.3-234.0.154.0

    参考节点(基地B node-a02,未更换): BCM57810 / bnx2x / 接口 ens1f0 ens2f0 / primary=ens2f0。


    2. 更换操作

    2.1 更新 bond slave 接口名

    网卡型号变更后 udev 接口名变化,需同步 NetworkManager slave 连接:

    sudo nmcli con mod bond-slave-ens1f0 connection.interface-name ens1f0np0
    sudo nmcli con mod bond-slave-ens2f0 connection.interface-name ens2f0np0
    sudo nmcli con reload
    sudo nmcli con up bond-slave-ens1f0
    sudo nmcli con up bond-slave-ens2f0
    sudo nmcli con up bond0
    

    2.2 Primary 策略

    主用口沿用 第一个 slaveens1f0np0),与当前 active 一致,无需额外修改 bond.options。

    2.3 升级 bnxt_en 驱动

    换卡后安装 Broadcom 外置驱动模块,需重启生效

    sudo rpm -ivh kmod-bnxt_en-1.10.3-234.0.154.0.rocky9u3.x86_64.rpm
    sudo reboot
    

    重启后验证:

    ethtool -i ens2f0np0
    modinfo bnxt_en | grep -E '^version|^filename'
    

    更新后 ethtool -i 输出:

    driver: bnxt_en
    version: 1.10.3-234.0.154.0
    firmware-version: 234.0.150.0/pkg 234.1.124.0
    bus-info: 0000:22:00.0
    supports-priv-flags: yes
    

    3. 验证

    3.1 Bond 状态

    cat /proc/net/bonding/bond0
    ip a show bond0
    

    结果:

    Bonding Mode: fault-tolerance (active-backup)
    Primary Slave: ens1f0np0
    Currently Active Slave: ens1f0np0
    slaves: ens1f0np0 ens2f0np0
    bond0: UP,8.8.243.101/24
    

    3.2 连通性

    ping -c 3 8.8.243.1
    curl -I http://monitor.igozhang.cn/health
    

    3.3 网卡与统计一键检查

    sudo bash <<'EOF'
    BOND="${BOND:-bond0}"
    sval(){ v=$(ethtool -S "$1" 2>/dev/null|grep -v '\['|grep "$2:"|head -1|cut -d: -f2); v="${v// /}"; echo "${v:-0}"; }
    stats(){ local n=$1 d=$2 r=$(sval $n recoverable_errors) u=$(sval $n unrecoverable_errors)
      case "$d" in
        bnxt_en) echo "  rx_disc=$(sval $n rx_total_discard_pkts)  rx_fcs=$(sval $n rx_fcs_err_frames)  recoverable=$r  unrecoverable=$u  link_down=$(sval $n link_down_events)";;
        bnx2x|bnx2) echo "  rx_disc=$(sval $n rx_discards)  rx_crc=$(sval $n rx_crc_errors)  recoverable=$r  unrecoverable=$u  rx_brb_disc=$(sval $n rx_brb_discard)";;
        *) echo "  recoverable=$r  unrecoverable=$u";;
      esac; }
    S=$(cat /sys/class/net/$BOND/bonding/slaves|xargs)
    IP=$(ip -br addr show $BOND|awk '{print $3}')
    A=$(tr -d ' \n' </sys/class/net/$BOND/bonding/active_slave 2>/dev/null)
    M=$(grep 'Bonding Mode' /proc/net/bonding/$BOND|head -1|cut -d: -f2-|xargs)
    echo "=== $(hostname) $(date '+%F %T') | $BOND ${IP:-no-ip} ==="
    echo "mode=$M  active=$A  slaves=$S"
    for n in $S; do
      b=$(ethtool -i $n|awk '/bus-info/{print $2}')
      d=$(ethtool -i $n|awk '/^driver/{print $2}')
      fw=$(ethtool -i $n|awk '/firmware-version/{print $2}')
      dv=$(ethtool -i $n|awk '/^version/{print $2}')
      md=$(lspci -s $b|sed 's/.*: //')
      sp=$(ethtool $n 2>/dev/null|awk -F: '/Speed/{gsub(/ /,"",$2);print $2}')
      lk=$(ethtool $n 2>/dev/null|awk -F: '/Link detected/{print $2}'|tr -d ' ')
      echo "=== $n ==="
      echo "  pci=$b  model=$md"
      echo "  driver=$d  fw=$fw  drv_ver=$dv"
      echo "  link=${sp:-?} / ${lk:-?}"
      echo "  stats:"; stats $n $d; echo
    done
    EOF
    

    更换后检查结果(node-a01,驱动升级后):

    === node-a01 ... | bond0 8.8.243.101/24 ===
    mode=fault-tolerance (active-backup)  active=ens1f0np0  slaves=ens1f0np0 ens2f0np0
    
    === ens1f0np0 ===
      pci=0000:01:00.0  model=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (rev 01)
      driver=bnxt_en  fw=234.0.150.0/pkg  drv_ver=1.10.3-234.0.154.0
      link=10000Mb/s / yes
      stats: rx_disc=0  rx_fcs=0  recoverable=0  unrecoverable=0  link_down=4
    
    === ens2f0np0 ===
      pci=0000:22:00.0  model=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (rev 01)
      driver=bnxt_en  fw=234.0.150.0/pkg  drv_ver=1.10.3-234.0.154.0
      link=10000Mb/s / yes
      stats: (同上)
    

    4. 后续换卡 SOP 要点

    角色 建议
    运维 换卡后核对 ip anmcli con show 接口名;NM 操作使用 sudo;BCM57412 建议安装 kmod-bnxt_en 并重启;更新后 ethtool -i 确认 version 为驱动版本号

    5. Bond 配置参数(更换后)

    参数 说明
    bond.mode active-backup 双链路热备
    bond.primary ens1f0np0 第一个 slave 为主用口
    bond.miimon 100 链路监测间隔(ms)
    slave 连接 bond-slave-ens1f0 → ens1f0np0 NM interface-name 已同步
    slave 连接 bond-slave-ens2f0 → ens2f0np0 NM interface-name 已同步
    驱动包 kmod-bnxt_en-1.10.3-234.0.154.0 外置驱动,重启后生效

    MP3