0x00 前提

万兆的起源是发现了FLR和OCP, 虽然发现的时候已经很晚了, 价格上还是比较有优势的, 假垃圾佬上线.

我的万兆配置:
交换机: H3C S5130S-28S-SI
EPYC机器(PVE+TrueNAS): 530FLR 双口LACP
蜗牛星际(G4560 + ESXi 7): CX3 ALOM直接虚拟交换机(本来想用CX341A,发现厚度超了, 341a就暂时吃灰了)
测试环境: PVE(EPYC) + ESXi(蜗牛G4560)

注: 以下大多数配置记录都是在Debian10/11或TrueNas里配置

0x01 主力NAS 530FLR记录

先说530FLR, 芯片BCM57810s, 买来后发现直接就支持SRIOV的固件, 所以没有折腾刷固件, 直接启动rom里修改配置就ok

1
2
root@pve00:~# cat /sys/class/net/enp65s0f0/device/sriov_totalvfs
16

开启sriov的命令很简单也很通用, 直接sysfs就可以: echo 2 > /sys/class/net/enp65s0f0/device/sriov_numvfs
设置VF的mac才能正常使用, ip link set <PF iface> vf <VF id> mac <macaddr>

当时写在启动hook里的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# SR-IOV for BCM57810
echo "reset SR-IOV for enp65s0"
echo 0 > /sys/class/net/enp65s0f0/device/sriov_numvfs
echo 0 > /sys/class/net/enp65s0f1/device/sriov_numvfs
echo "set numvfs for enp65s0"
echo 2 > /sys/class/net/enp65s0f0/device/sriov_numvfs
echo 2 > /sys/class/net/enp65s0f1/device/sriov_numvfs
#
## SET MAC (TrueNas vf not set)
## ip link set <PF iface> vf <VF id> mac <macaddr>
#ip link set enp65s0f0 vf 0 mac 38:63:bb:41:df:b0
ip link set enp65s0f0 vf 1 mac 38:63:bb:41:df:b1
#ip link set enp65s0f1 vf 0 mac 38:63:bb:41:df:c0
ip link set enp65s0f1 vf 1 mac 38:63:bb:41:df:c1

然而最终因为各种考虑, 还是取消了SR-IOV直接直通给TrueNAS了, 所以以下记录仅作为记录, 日后万一有需求了,做参考

防坑记录(注意事项)

  1. 如果要给VM使用, 需要在VM启动前准备好VF, 包括开VF和设置MAC
  2. 如果vm里要给vf设置mac地址,就别在host里设置mac了, vm里不支持设置和host不一样的mac
  3. Debian10里测试正常, 到了TrueNas的bonding, 会有更改mac的操作, 会报错enp1s0设置mac地址失败,不知道是不是包还是操作不一样(比如一个是设置混杂一个直接设置mac?),最终还是把host里的set mac给取消了, 让vm自己搞去吧

实际看了bnx2x驱动后发现,理论上是可以支持VM里设置MAC的:
对VF设置mac,流程:ndo_set_mac_address -> bnx2x_vfpf_config_mac -> 发送CHANNEL_TLV_SET_Q_FILTERS给PF(bnx2x_send_msg2pf), PF收到msgbnx2x_vf_mbx_request -> bnx2x_vf_mbx_set_q_filters -> bnx2x_filters_validate_mac, 在bnx2x_filters_validate_mac里, 发现mac已经被初始化过后, 会直接返回EPERM, 所以直接在最后的判断里跳过, 或者参考intel的驱动增加trust mode(struct vf_data_storage->trusted)支持就能对vfip link set xx vf xx trust on支持vm里改mac了,当然这只是理论上,暂时没有强烈sriov需求, 以后再考虑吧, 说不定啥时候驱动就更新了

0x02 CX341A折腾记录

想了解怎么自定义固件, 可以翻一下下一节的CX3 ALOM记录

买了CX341A的改双口版本, 折腾了半天, 走了很多弯路, google找cx3刷固件的流程, 很多资料还是会给出有fw-ConnectX3-rel.mlx自定义固件的方法,实际上最新的固件工具里都已经取消自定义的支持了, 在一个官方支持里有说明, 是说为了更快速支持,减少问题产生, 所以对于CX341A, 你可以直接用最新固件. 弯路太多, 直接说结论:

  1. 下载OFED驱动NVIDIA官网, 注意cx3要用LTS download, 新版本已经没有cx3/pro的支持了
  2. 下载后解压/挂载, 我是tgz解压, cd 进去, 执行./mlnxofedinstall --skip-distro-check, 使用--skip-distro-check是因为可能会因为系统小版本和你下载的不一样而报错, 另外如果没有apt-get命令, 可以修改安装脚本里的apt-get直接替换为apt
  3. 安装完成后/etc/init.d/openibd restart
  4. 然后执行mst start, 再执行mst status会看到输出, 新目录/dev/mst有两个设备/dev/mst/mt4099_pciconf0/dev/mst/mt4099_pci_cr0
  5. 从官网下载341的固件nvidia, 直接下载最新固件, 然后执行flint -d 01:00.0 -i fw-ConnectX3-rel-2_42_5000-MCX341A-XCC_Ax-UEFI-14.11.45-FlexBoot-3.4.752.bin burn 其中01:00.0表示lspci里你的网卡pci地址, 等刷写完成
  6. 完成后执行mstflint -d 01:00.0 q 可以看到版本信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    root@debian10:~# mstflint -d 01:00.0 q
    Image type: FS2
    FW Version: 2.42.5000
    FW Release Date: 5.9.2017
    Product Version: 02.42.50.00
    Rom Info: type=UEFI version=14.11.45 cpu=AMD64
    type=PXE version=3.4.752
    Device ID: 4099
    Description: Node Port1 Port2 Sys image
    GUIDs: 0002c90300056aa8 0002c90300056aa9 0002c90300056aaa 0002c90300056aab
    MACs: 0002c9dc8b5c 0002c9dc8b5d
    VSD:
    PSID: MT_1680110023
  7. 至此固件刷新完成, 目前就可以直接重启然后在启动rom的时候Ctrl+B修改配置支持SR-IOV了(当然是我后来才发现的,,,)
  8. 执行mlxconfig -d /dev/mst/mt4099_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4 直接开启sr-iov支持
  9. 至此CX341A就支持SR-IOV了,当然只是支持, 要开启VF还需要额外的配置, 因为mlx4驱动较老了, 没有增加sysfs的支持, 只能在modprobe的时候调整驱动参数来启用SR-IOV
  10. === 以下为SR-IOV配置 ===
  11. vim /etc/modprobe.d/mlx4.conf 写一行options mlx4_core port_type_array=2,2 num_vfs=0,0,4 probe_vf=0,0,4, 这个参数意义参考官方文档NVIDIA SR-IOV文档(貌似有很多pdf版本, 其实都差不多), 我解释一下我的参数: port_type_array=2,2表示两个网口都以太网模式, num_vfs=0,0,4表示生成4个双口vf,也就是网口1有2个vf网口2有2个vf, probe_vf直接配置和num_vfs一样即可,看说明是用来探测网口的,实际效果不太明白
  12. 这样重启后为的系统就会有6个interface, PF: enp65s0 enp65s0d1, VF:enp65s0v0 enp65s0v1 enp65s0d1v0 enp65s0d1v1
  13. 实际使用因人而异, 我是因为打算VM里bonding才每个口都开了VF

0x03 CX3 ALOM折腾记录

网卡物料号: 682148-B21, 版本rev A3, 不确定其他型号是否一样(理论应该可以)

吐槽一个, 闲鱼上买的, 最大的槽点就是, 光口笼子竟然生锈了, 这。。。
这个网卡固件到手版本(2.7xxx)太老, mlxconfig直接告诉我版本太低不支持配置, 看来还是直接升级吧

翻了好多网站没有找到HPE的升级方式, 网卡太老了, 很多资料不太好找, 最接近的servethehome答案里, 有一个固件, 我刷了后直接ping不通了, 最终还是决定要不然不升固件了要不然就自定义固件升级, 想了很多歪招, 终于自定义成功了

流程记录:

  1. === 备份一下网卡固件/配置 (建议按照这个来备份, 我之前找的一个资料比这个备份的少, 当然其实应该问题不大) ====
  2. 参考这个吧
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #mst status
    #MST devices:
    #------------
    #mt4099_pci_cr0
    #mt4099_pciconf0

    #1. Save basic info such as GUIDs, MACs, etc.:

    flint -d <device> query full > flint_query.txt

    #2. Save low-level flash chip info:

    flint -d <device> hw query > flint_hwinfo.txt

    #3. Save existing FW:

    flint -d <device> ri orig_firmware.bin

    #4. Save existing FW configuration:

    flint -d <device> dc orig_firmware.ini

    #5. Save existing PXE ROM image (if any):

    flint -d <device> rrom orig_rom.bin

    #6. Save existing PCI VPD (vital product data):

    mlxburn -d <device> -vpd > orig_vpd.txt
  3. === 开始自定义固件 ====
  4. 最重要的文件就是我们缺少mlx固件文件, 在看各种资料的时候发现mellanox有一个网址还是可用的, 没有被nvidia给关了, http://content.mellanox.com/firmware/, 于是在各种尝试下, 找到了最接近新固件的一个版本http://content.mellanox.com/firmware/ConnectX3-rel-2_40_5030.tgz, 2.42版本固件是真的没有找到, 这个理论也不差多少
  5. 下一个难题是要找到支持自定义固件的MFT, 通过文档发现4.9的版本mft是可以自定义固件的,经过尝试找到了这个https://linux.mellanox.com/public/repo/mlnx_ofed/4.3-3.0.2.1/ubuntu18.04/x86_64/mft-4.9.0-38.amd64.deb https://linux.mellanox.com/public/repo/mlnx_ofed/4.3-3.0.2.1/ubuntu18.04/x86_64/kernel-mft-dkms_4.9.0-38_all.deb这两个deb包直接安装之后, 继续下面操作
  6. 解压固件tar -xvzf ConnectX3-rel-2_40_5030.tgz -C cx3
  7. 复制配置cd cx3;cp ../orig_firmware.ini ./hpe.ini
  8. 生成固件mlxburn -fw fw-ConnectX3-rel.mlx -conf hpe.ini --wrimage test-hpe.bin
  9. 验证一下flint -i test-hpe.bin verify
  10. 刷入固件flint -d 01:00.0 -i test-hpe.bin burn
  11. 确认一下mlxconfig -d /dev/mst/mt4099_pciconf0 q版本是最新版本

至此折腾结束, 把蜗牛星际钻了个孔用来透出来光口, 不完美的完成了万兆
蜗牛改造

坑 (TODO)

CX3 ALOM为什么不配置SR-IOV, 因为用mlxconfig配置的时候会报错, 不支持开启sriov, 用了官方的文档改ini也不行, 所以暂时放弃了, 现在被我插ESXi里桥接用, mtu9000后10gb测试正常

0x04 配置

目前配置:

  1. 530FLR用在EPYC
  2. 为了测试LACP, CX341A临时用在ESXi上, 直通给Debian
  3. 交换机里配置4个光口两个一组LACP, 分别接两个机器, Debian里全部配置layer3+4成类似
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    auto enp1s0f0
    iface enp1s0f0 inet manual

    auto enp1s0f1
    iface enp1s0f1 inet manual

    auto bond0
    iface bond0 inet manual
    bond-slaves enp1s0f0 enp1s0f1
    bond-miimon 100
    bond-mode 802.3ad
    bond-xmit-hash-policy layer3+4
    mtu 9000

    auto br0
    iface br0 inet static
    address 192.168.3.123/24
    gateway 192.168.3.1
    bridge-ports bond0
    bridge-stp off
    mtu 9000
  4. 后来发现CX341A太厚, 目前还是在蜗牛里用了CX3 ALOM单口万兆, ESXi桥接, 配置MTU9000后, 测速9.8+gbps

0x05 测试

ping测试MTU生效

使用类似如下命令,可测试本地网卡MTU是否大于网络MTU。
ping -s 8900 -M do 192.168.10.22
通过上述命令,发送大小包大小是8900(+28)=8928字节,禁止路由器拆分数据包。 至于(+28)字节,是因为8字节的“ICMP回显示请求和回显应答报文格式长度”,以及20字节的“IP首部”。
对于测试的结果,其含义如下。

  1. 如果正常回复,说明数据包大小不超过网络允许最大MTU;
  2. 如果没正常回复,说明数据包大小超过了网络限定的MTU大小,需要减小探测包大小再次尝试。

iperf3测试

一端iperf3 -s另一端iperf3 -c 192.168.3.159, 这样测试万兆就够了

如果是LACP的测速, 需要客户端配置iperf3 -c 192.xxx -P5, 多线程测速, 如果配置了Layer3+4, 就能达到19.8+Gbps的速度.

ESXi7的shell里也可以直接/usr/lib/vmware/vsan/bin/iperf3, 需要提前关闭防火墙esxcli network firewall set --enabled false

iperf3结果

0x06 结束

展示

展示2

交换机端口展示

重点记录一下网卡固件的使用, 备忘

0x07 参考

  1. Mellanox HowTo Configure SR-IOV VFs on Different ConnectX-3 Ports
  2. Mellanox HowTo Configure SR-IOV for ConnectX-3 with KVM (Ethernet)
  3. serverthehome Looking for a Connectx-3 custom firmware package
  4. serverthehome HP 10Gb MLX 1P SFP+ CX3 ALOM Adapter FW update?
  5. NVIDIA Single Root IO Virtualization (SR-IOV)
  6. NVIDIA NVIDIA Firmware Tools (MFT)
  7. Blog iPerf now available on ESXi

评论