根据 R86S 官方手册说明,PVE 下只能 SR-IOV 直通网卡,而不能直接网卡 PCIE。我试过了,确实不行,IRQ 会冲突。
本文记录了我是怎么开启的 SR-IOV 功能,还有一些小坑。然后,用 RouterOS 的同学,不用试了,没法加进Bridge的(。
然而我就是用 RouterOS 的,这对我来说虽然成功了,但是用处不大(。
0x00 准备工作
安装工具
首先去安装 MFT 网卡工具,这里有两种选择都可以用
- 去官网下载,注意目前支持的最新稳定版本是
mft-4.22.1-417
,4.29 装上去会启动不了 - 使用 APT 安装开源 MFT,省时省力
如果从官网安装,需要额外从 APT 安装 headers apt install -y pve-headers-$(uname -r)
1 | wget https://www.mellanox.com/downloads/MFT/mft-4.22.1-417-x86_64-deb.tgz # 下载 |
官网工具在使用前需要启动 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 | mstflint -d 04:00.0 query |
执行后会显示卡的信息,比如博主的是这样的,下面是两个工具的输出
1 | root@pve-home:~# mlxfwmanager -d 04:00.0 --query |
可以前往 官网 查看最新固件版本
截至编写时,最新固件是 2.42.5
更新固件(如果需要)
如果你的网卡固件比这个旧,则需要更新固件
注意上文的 PSID
如果不知道卡的型号的话可以根据 PSID
下载固件
1 | wget https://http://www.mellanox.com/downloads/firmware/xxx.zip # 下载固件 |
然后重启设备
打开 BIOS 中的 SR-IOV 选项
需要在 BIOS 中打开这个选项,现在的大部分设备都有,R86S 也不例外
查看配置信息
使用下面的指令查看配置信息
1 | mstconfig -d 04:00.0 query |
可以看到像下面这样的信息
1 | Device #1: |
0x01 网卡配置
启用网卡 SR-IOV
在上文的信息查询中,可以看 SRIOV_EN
处于关闭状态
1 | Configurations: Next Boot |
使用配置指令开启它
1 | mstconfig -d 04:00.0 set SRIOV_EN=1 |
然后配置 SR-IOV 虚拟接口数量,我只想把这个网口直通给单个虚拟机,我就设置为 1
1 | mstconfig -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
1 | 启用内核空闲循环调整 来源 [2][3] |
文档中还给了 中断亲和性
调优,如需要可以看 [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+/固件/刷新固件 | 电脑硬件学习笔记
杰哥的{运维,编程,调板子}小笔记
升级 Mellanox 网卡固件
CQzhangyu
Mellanox网卡开启SR-IOV
官网文档
[2] 官网支持 | ConnectX-3/Pro Tuning For Linux (Idle Loop and IP Forwarding)
[3] 官方文档 | NVIDIA MLNX_EN Documentation