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 | root@pve00:~# cat /sys/class/net/enp65s0f0/device/sriov_totalvfs |
开启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 | SR-IOV for BCM57810 |
然而最终因为各种考虑, 还是取消了SR-IOV直接直通给TrueNAS了, 所以以下记录仅作为记录, 日后万一有需求了,做参考
防坑记录(注意事项)
- 如果要给VM使用, 需要在VM启动前准备好VF, 包括开VF和设置MAC
- 如果vm里要给vf设置mac地址,就别在host里设置mac了, vm里不支持设置和host不一样的mac
- 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, 你可以直接用最新固件. 弯路太多, 直接说结论:
- 下载OFED驱动NVIDIA官网, 注意cx3要用LTS download, 新版本已经没有cx3/pro的支持了
- 下载后解压/挂载, 我是tgz解压, cd 进去, 执行
./mlnxofedinstall --skip-distro-check
, 使用--skip-distro-check
是因为可能会因为系统小版本和你下载的不一样而报错, 另外如果没有apt-get命令, 可以修改安装脚本里的apt-get直接替换为apt - 安装完成后
/etc/init.d/openibd restart
- 然后执行
mst start
, 再执行mst status
会看到输出, 新目录/dev/mst
有两个设备/dev/mst/mt4099_pciconf0
和/dev/mst/mt4099_pci_cr0
- 从官网下载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地址, 等刷写完成 - 完成后执行
mstflint -d 01:00.0 q
可以看到版本信息1
2
3
4
5
6
7
8
9
10
11
12
13root@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 - 至此固件刷新完成, 目前就可以直接重启然后在启动rom的时候Ctrl+B修改配置支持SR-IOV了(当然是我后来才发现的,,,)
- 执行
mlxconfig -d /dev/mst/mt4099_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4
直接开启sr-iov支持 - 至此CX341A就支持SR-IOV了,当然只是支持, 要开启VF还需要额外的配置, 因为mlx4驱动较老了, 没有增加sysfs的支持, 只能在modprobe的时候调整驱动参数来启用SR-IOV
- === 以下为SR-IOV配置 ===
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
一样即可,看说明是用来探测网口的,实际效果不太明白- 这样重启后为的系统就会有6个interface, PF:
enp65s0
enp65s0d1
, VF:enp65s0v0
enp65s0v1
enp65s0d1v0
enp65s0d1v1
- 实际使用因人而异, 我是因为打算VM里bonding才每个口都开了VF
0x03 CX3 ALOM折腾记录
网卡物料号: 682148-B21, 版本rev A3, 不确定其他型号是否一样(理论应该可以)
吐槽一个, 闲鱼上买的, 最大的槽点就是, 光口笼子竟然生锈了, 这。。。
这个网卡固件到手版本(2.7xxx)太老, mlxconfig直接告诉我版本太低不支持配置, 看来还是直接升级吧
翻了好多网站没有找到HPE的升级方式, 网卡太老了, 很多资料不太好找, 最接近的servethehome答案里, 有一个固件, 我刷了后直接ping不通了, 最终还是决定要不然不升固件了要不然就自定义固件升级, 想了很多歪招, 终于自定义成功了
流程记录:
- === 备份一下网卡固件/配置 (建议按照这个来备份, 我之前找的一个资料比这个备份的少, 当然其实应该问题不大) ====
- 参考这个吧
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
29mst 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 - === 开始自定义固件 ====
- 最重要的文件就是我们缺少mlx固件文件, 在看各种资料的时候发现mellanox有一个网址还是可用的, 没有被nvidia给关了,
http://content.mellanox.com/firmware/
, 于是在各种尝试下, 找到了最接近新固件的一个版本http://content.mellanox.com/firmware/ConnectX3-rel-2_40_5030.tgz
, 2.42版本固件是真的没有找到, 这个理论也不差多少 - 下一个难题是要找到支持自定义固件的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包直接安装之后, 继续下面操作 - 解压固件
tar -xvzf ConnectX3-rel-2_40_5030.tgz -C cx3
- 复制配置
cd cx3;cp ../orig_firmware.ini ./hpe.ini
- 生成固件
mlxburn -fw fw-ConnectX3-rel.mlx -conf hpe.ini --wrimage test-hpe.bin
- 验证一下
flint -i test-hpe.bin verify
- 刷入固件
flint -d 01:00.0 -i test-hpe.bin burn
- 确认一下
mlxconfig -d /dev/mst/mt4099_pciconf0 q
版本是最新版本
至此折腾结束, 把蜗牛星际钻了个孔用来透出来光口, 不完美的完成了万兆
坑 (TODO)
CX3 ALOM为什么不配置SR-IOV, 因为用mlxconfig配置的时候会报错, 不支持开启sriov, 用了官方的文档改ini也不行, 所以暂时放弃了, 现在被我插ESXi里桥接用, mtu9000后10gb测试正常
0x04 配置
目前配置:
- 530FLR用在EPYC
- 为了测试LACP, CX341A临时用在ESXi上, 直通给Debian
- 交换机里配置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
21auto 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 - 后来发现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首部”。
对于测试的结果,其含义如下。
- 如果正常回复,说明数据包大小不超过网络允许最大MTU;
- 如果没正常回复,说明数据包大小超过了网络限定的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
0x06 结束
重点记录一下网卡固件的使用, 备忘
0x07 参考
- Mellanox HowTo Configure SR-IOV VFs on Different ConnectX-3 Ports
- Mellanox HowTo Configure SR-IOV for ConnectX-3 with KVM (Ethernet)
- serverthehome Looking for a Connectx-3 custom firmware package
- serverthehome HP 10Gb MLX 1P SFP+ CX3 ALOM Adapter FW update?
- NVIDIA Single Root IO Virtualization (SR-IOV)
- NVIDIA NVIDIA Firmware Tools (MFT)
- Blog iPerf now available on ESXi