hank9999部落格

写点奇怪的东西

R86S 折腾日记二 | PVE 下给万兆网卡 CX341 开启 SR-IOV 并直通给虚拟机

hank9999's Avatar 2024-10-18

  1. 1. 0x00 准备工作
    1. 1.1. 安装工具
    2. 1.2. 查看信息
    3. 1.3. 更新固件(如果需要)
    4. 1.4. 打开 BIOS 中的 SR-IOV 选项
    5. 1.5. 查看配置信息
  2. 2. 0x01 网卡配置
    1. 2.1. 启用网卡 SR-IOV
    2. 2.2. 添加驱动启动时参数
  3. 3. 0x02 直通给虚拟机
    1. 3.1. 配置 PVE 直通 (如有需要)
  4. 4. 0x03 结语
  5. 5. 参考资料 | 特别感谢

根据 R86S 官方手册说明,PVE 下只能 SR-IOV 直通网卡,而不能直接网卡 PCIE。我试过了,确实不行,IRQ 会冲突。
本文记录了我是怎么开启的 SR-IOV 功能,还有一些小坑。然后,用 RouterOS 的同学,不用试了,没法加进Bridge的(。
然而我就是用 RouterOS 的,这对我来说虽然成功了,但是用处不大(。

0x00 准备工作

安装工具

首先去安装 MFT 网卡工具,这里有两种选择都可以用

  1. 去官网下载,注意目前支持的最新稳定版本是 mft-4.22.1-417,4.29 装上去会启动不了
  2. 使用 APT 安装开源 MFT,省时省力

如果从官网安装,需要额外从 APT 安装 headers apt install -y pve-headers-$(uname -r)

1
2
3
4
wget https://www.mellanox.com/downloads/MFT/mft-4.22.1-417-x86_64-deb.tgz  # 下载
tar -xvzf mft-4.22.1-417-x86_64-deb.tgz # 解压
cd mft-4.22.1-417-x86_64-deb
./install.sh # 安装

官网工具在使用前需要启动 mst start 使用后还要停止 mst stop

如果使用 APT 安装开源 MFT

1
apt install mstflint

查看信息

先使用 lspci 找到自己网卡

1
04:00.0 Ethernet controller: Mellanox Technologies MT27500 Family [ConnectX-3]

然后使用 mstflint(开源) 或者 mlxfwmanager(官方) 查看自己的卡信息,看看需不需要更新固件

注: mstxxxxx 指令大多是开源管理工具 mstflint 的, mlxxxxxx 大多都是官方工具的,二选一使用
注意 因为博主机器上两个都装了,我不能保证这个信息来源是正确的(不过我单开的机器装 mstflint,只有 mst 开头的指令
下文不再指出

1
2
3
mstflint -d 04:00.0 query
#
mlxfwmanager -d 04:00.0 --query

执行后会显示卡的信息,比如博主的是这样的,下面是两个工具的输出

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
30
31
32
33
root@pve-home:~# mlxfwmanager -d 04:00.0 --query
Querying Mellanox devices firmware ...

Device #1:
----------

Device Type: ConnectX3
Part Number: MCX342A-XCC_Ax
Description: ConnectX-3 EN NIC for OCP;10GbE;dual-port SFP+;PCIe3.0 x8;IPMI disabled;R6
PSID: MT_1680110023
PCI Device Name: 04:00.0
Port1 MAC: f452xxxxxxxx
Port2 MAC: f452xxxxxxxx
Versions: Current Available
FW 2.42.5000 2.42.5000
PXE 3.4.0752 3.4.0752
UEFI 14.11.0045 14.11.0045

Status: Up to date

root@pve-home:~# mstflint -d 04: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: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
MACs: f452xxxxxxxx f452xxxxxxxx
VSD:
PSID: MT_1680110023

可以前往 官网 查看最新固件版本
截至编写时,最新固件是 2.42.5

更新固件(如果需要)

如果你的网卡固件比这个旧,则需要更新固件
注意上文的 PSID 如果不知道卡的型号的话可以根据 PSID 下载固件

1
2
3
4
5
6
wget https://http://www.mellanox.com/downloads/firmware/xxx.zip  # 下载固件
unzip xxx.zip # 解压

mstflint -d 04:00.0 -i xxx.bin b # 刷入
#
mlxfwmanager -d 04:00.0 -u -i xxx.bin # 刷入

然后重启设备

打开 BIOS 中的 SR-IOV 选项

需要在 BIOS 中打开这个选项,现在的大部分设备都有,R86S 也不例外

查看配置信息

使用下面的指令查看配置信息

1
2
3
mstconfig -d 04:00.0 query
#
mlxconfig -d 04:00.0 query

可以看到像下面这样的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Device #1:
----------

Device type: ConnectX3
Device: 04:00.0

Configurations: Next Boot
SRIOV_EN False(0)
NUM_OF_VFS 8
WOL_MAGIC_EN_P1 True(1)
LOG_BAR_SIZE 3
BOOT_OPTION_ROM_EN_P1 True(1)
BOOT_VLAN_EN_P1 False(0)
BOOT_RETRY_CNT_P1 0
LEGACY_BOOT_PROTOCOL_P1 PXE(1)
BOOT_VLAN_P1 1
BOOT_OPTION_ROM_EN_P2 True(1)
BOOT_VLAN_EN_P2 False(0)
BOOT_RETRY_CNT_P2 0
LEGACY_BOOT_PROTOCOL_P2 PXE(1)
BOOT_VLAN_P2 1
IP_VER_P1 IPv4(0)
IP_VER_P2 IPv4(0)
CQ_TIMESTAMP True(1)

0x01 网卡配置

启用网卡 SR-IOV

在上文的信息查询中,可以看 SRIOV_EN 处于关闭状态

1
2
3
Configurations:                              Next Boot
SRIOV_EN False(0) # 这里是 False
NUM_OF_VFS 8

使用配置指令开启它

1
2
3
mstconfig -d 04:00.0 set SRIOV_EN=1
#
mlxconfig -d 04:00.0 set SRIOV_EN=1

然后配置 SR-IOV 虚拟接口数量,我只想把这个网口直通给单个虚拟机,我就设置为 1

1
2
3
mstconfig -d 04:00.0 set NUM_OF_VFS=1
#
mlxconfig -d 04:00.0 set NUM_OF_VFS=1

再次查看就可以看到 SRIOV_EN 是 True,NUM_OF_VFS 是 1 了
注意:配置后需要重启才能生效

添加驱动启动时参数

新建一个文件在 /etc/modprobe.d/mlx4_core.conf
编辑添加下面的内容

1
options mlx4_core port_type_array=2,2 num_vfs=1 probe_vf=0

参数解释 [1]

  • port_type_array=2,2 端口类型,表明端口分别是 以太网,以太网,不需要修改
  • num_vfs 表示虚拟接口数量, 格式为 a,b,c,a 表示第一个网口的虚拟接口数量,b 表示第二个网口的虚拟接口数量
    c 是另一个含义,这个设备直通给虚拟机后会显示两个接口,c 是这个虚拟设备的数量,直接给数字默认为 0,0,c
  • probe_vf 跟上面的 num_vfs 格式一样,这个是给宿主机暴露的网卡数量,就是在 ip 指令里看到的那个,如果不给宿主机使用可以设置为0

还可以添加一些性能优化参数 [2] [3] [4] [5]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 启用内核空闲循环调整   来源 [2][3]
# 可以调节 CPU 来获得更好的性能表现
options mlx4_core enable_sys_tune=1

# 调整内联阈值 来源 [2][3]
# 可以提高网卡 IP forwarding 下的表现
# 可调节范围 17-104,当数据小于阈值时,会将数据直接复制到硬件缓冲区,大于则会通过 PCI 读取操作读取
# 调节此选项可提高小包性能表现,但有可能会影响传输效率
# 文档中给的 0,可能是全部直接复制到硬件缓冲区
options mlx4_en inline_thold=0

# 调整多播(Multicast Group)队列对(Queue Pair)数量 来源 [2][3][4][5]
# -1 可以提高性能,激活 `设备管理的流量引导(device-managed flow steering),减少 CPU 资源占用`
# -7 可以更好的提高性能,可以激活 `更快的静态设备管理流量引导(faster static device-managed flow steering)`
# 但是不支持 VLAN 过滤!使用 VLAN 过滤请设置为 -1
options mlx4_core log_num_mgm_entry_size=-1

文档中还给了 中断亲和性 调优,如需要可以看 [2]

更新 initramfs

1
update-initramfs -u -k all

然后重启设备
再次 lspci 就能看到虚拟的设备了,现在就可以直通给虚拟机了

1
04:00.1 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]

0x02 直通给虚拟机

配置 PVE 直通 (如有需要)

编辑 /etc/default/grub 文件
GRUB_CMDLINE_LINUX_DEFAULT= 这里行添加 intel_iommu=on pci=assign-busses iommu=pt

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pci=assign-busses iommu=pt"

执行 update-grub 更新引导,重启就可以直通了

如果已经配置过了直通,那么把这个虚拟的 PCI 设备直接直通就行了
注意!!不要选 全部功能,选择 .x 的设备,而不是主设备 否则他会卸载驱动尝试把整个原始设备直通进去,然后就寄了,重启吧

注意:使用 RouterOS 的同学 7.16 版本无法正常加载为网络接口,但是在 PCI 列表里,请升级到最新的 7.17beta
直通进去之后,就可以在系统里里看到对应的设备了

0x03 结语

开启 SR-IOV 到这里就结束了,然后就可以皆大欢喜的跑在 RouterOS 上了吗?
很显然,都这样说了,肯定是不行的。他没法加到 Bridge 里做交换,只能分一个 IP 做路由。
给接口分配一个地址,然后用 Ping 工具测试在那个接口上可以联通的IP,是可以 Ping 通的。
假如你在 RouterOS 里有其他的接口是在一个网段的话,这不好实现。
在 OpenWRT 或其他系统上,是有解决方案的 [1][6],有脚本可以跑,甚至还有 内核模块,但是在 RouterOS 上就不好解决了。

最后希望这篇博文能够为你在配置自己的 HomeLab/R86S/PVE/CX341/SR-IOV 时,提供一些帮助。

参考资料 | 特别感谢

以下文章在我学习过程中给予了很多帮助

LoveSyKun
[1] PVE 下 R86S 的 CX341 万兆网卡开启 SR-IOV、直通虚拟机、加入软网桥、硬 VLAN 拨号、20G 端口聚合

skyao
配置 CX-3 网卡以开启 SR-IOV | PVE学习笔记
网卡/HP544+/固件/刷新固件 | 电脑硬件学习笔记

PS: 这位博主写了一整套 PVE 指南,还有硬件指南,非常值得学习(
PVE 学习笔记
电脑硬件学习笔记

杰哥的{运维,编程,调板子}小笔记
升级 Mellanox 网卡固件

CQzhangyu
Mellanox网卡开启SR-IOV

官网文档
[2] 官网支持 | ConnectX-3/Pro Tuning For Linux (Idle Loop and IP Forwarding)
[3] 官方文档 | NVIDIA MLNX_EN Documentation

DPDK 指南
[4] DPDK 指南 | MLX4 poll mode driver library

[5] Support for ibverbs

佛西博客
[6] 网卡sriov之后,在pf或者vf上绑定网桥,无法上网

本文作者 : hank9999
版权声明 :本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!
本文链接 : https://blog.hank.ltd/r86s-logbook-2-setup-sr-iov-for-cx341-pve/