Mellanox CX6设置SR-IOV模式
1.背景
主机系统:rocky8.7
虚拟机系统:rocky8.7
网卡类型:Mellanox CX6-DX
2.主机环境配置
1)关闭防火墙、selinux
systemctl stop firewalld // 临时关闭防火墙
systemctl start firewalld // 临时开启防火墙
systemctl disable firewalld // 永久关闭防火墙
systemctl enable firewalld // 开启防火墙
vim /etc/selinux/config
SELINUX=disabled // 关闭selinux
2)开启iommu(SR-IOV)、内存大页
vim /etc/default/grub
//找到GRUB_CMDLINE_LINUX行双引号后面添加如下内容
intel_iommu=on iommu=pt pci=assign-busses pci=realloc
// 开启大页
default_hugepagesz=1G hugepagesz=1G hugepages=64
// 重新加载这个文件。这一步骤需要根据系统进行调整
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
// 查看是否开启内存大页(开启内存1.为了提高性能;2.mlx网卡启动vdpa或者dpdk均需要内存大页)
cat /proc/meminfo | grep -i huge
// 如果现实如下,表示已经开启了内存大页
HugePages_Total: 128
HugePages_Free: 111
// 如果没有开启。按照如上步骤开启。
reboot
之后检查是否都开启成功
cat /proc/cmdline
3)安装Mellanox OFED驱动
a.配置镜像源
如果系统不是rocky的请查看自己系统的镜像源配置过程。
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl="镜像源地址" \
-i.bak \
/etc/yum.repos.d/Rocky-*.repo
b.提前安装依赖
yum install patch make python3-unversioned-command autoconf gdb-headless lsof kernel-devel-5.10.0-136.12.0.86.oe2203sp1.aarch64 automake python3-devel gcc rpm-build
yum install createrepo
yum install pciutils-devel tcsh fuse-devel
运行ifconfig
,查看网卡是否识别。如果识别到的网卡查看网卡的驱动版本和pci号:ethtool -i <网卡的名字>
.
c.安装ofed
ofed官网下载渠道(下载前使用cat /proc/version
查看主机的版本号,要和ofed一一对应才行,否则无法编译)
https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
// 解压后安装ofed
./mlnxofedinstall --add-kernel-support --all
4)安装qemu
Step.1 安装依赖
yum install gcc gcc-c++ automake libtool zlib-devel glib2-devel bzip2-devel libuuid-devel spice-protocol spice-server-devel usbredir-devel libaio-devel
Step.2 配置
./configure --prefix=/usr/local/qemu-5.0.0
Step.3 编译
make -j96
make install
Step.4 设置软链
ln -s /usr/local/qemu-5.0.0/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
ln -s /usr/local/qemu-5.0.0/bin/qemu-system-x86_64 /usr/libexec/qemu-kvm
ln -s /usr/local/qemu-5.0.0/bin/qemu-img /usr/bin/qemu-img
参考:https://blog.csdn.net/sukysun125/article/details/89466676
5)安装libvirt
yum install libvirt
// 启动libvirt
systemctl start libvirtd
修改libvirtd服务权限,使libvirt拥有root权限。在后续vdpa中一定会用到。
vim /etc/libvirt/qemu.conf
使能user = "root"
和 group = "root"
6)安装dpdk
网上很多都是安装的dpdk-19
版本。dpdk版本之间的差异还是很大的,到dpdk-21.11
版本的时候,已经对sriov、vdpa
等模式做出了较好的性能优化(这方面可以看源码对比一下)。为了追求性能所以本文安装的是dpdk-21.11
。
dpdk下载地址:https://fast.dpdk.org/rel/
选择合适版本即可。
安装步骤:
step1:
tar -xvf <dpdk压缩包>
step2:
meson --prefix=/usr --reconfigure -Dexamples=all build
(注意:如果–prefix=/usr安装路径不加,可能会导致安装openvswitch的时候出现找不到dpdk库的问题)
step3:
// 编译
ninja -C build
// 安装
ninja install -C build
执行命令dpdk-devbind.py -s
如果有输出,表示dpdk安装成功。
7)安装openvswitch
下载地址:https://www.openvswitch.org/download/
(注意:ovs的版本和dpdk的版本有依赖性,注意两者的版本兼容)
step1:
./configure --prefix=/home/xxx/ovs-xxx/ --with-dpdk=shared
如果中途出现找不到dpdk现象,是因为前面的dpdk编译的时候没有指定路径的原因。重新加上路径编译一遍dpdk就解决了。(注意:如果不想编译到指定文件,可以使用默认的编译。)建议如果之后对ovs不在更改,建议使用下面的这个命令。这个命令和上面的同理,只不过没有添加安装路径,默认路径编译到了/usr/local/bin
中。
./configure --with-dpdk=shared
step2:编译
make -j 96
如果编译过程中dpdk库的头文件有问题,那么就是dpdk和ovs的版本不兼容,去官方文档中查看版本兼容情况。
step3:安装
make install
step4:openvswitch环境配置
cp rhel/etc_init.d_openvswitch /etc/init.d/openvswitch
cp rhel/etc_logrotate.d_openvswitch /etc/logrotate.d/openvswitch
systemctl daemon-reload
step5:启动openvswitch
service start openvswitch
(注意:dpdk需要使用大页内存,确认上面的大页内存是否配置成功)
8)虚拟vf(pf虚拟出来vf网卡)
这一步需要确定是否正确开启了sriov功能。
step1:找到mellanox网卡的pci地址
lspci | grep Mell
step2:恢复vf
echo 0 > /sys/class/net/<网卡名称>/device/sriov_numvfs
step3:开启vf
echo 2 > /sys/class/net/<网卡名称>/device/sriov_numvfs
查看是否开启成功lspci | grep Mell
会多出两张mellanox类型网卡
step4:设置pf为eswitch模式
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=" "
ovs-vsctl --no-wait set Open_vSwitch . other_config={}
systemctl restart openvswitch
cat /sys/class/net/$IFNAME/device/sriov_numvfs
2
# 设置mac地址
ip link set $IFNAME vf 0 mac ${VF1MAC}
ip link set $IFNAME vf 1 mac ${VF2MAC}
# 解除驱动
echo ${PCINUM%%.*}.2 > /sys/bus/pci/drivers/mlx5_core/unbind || true
echo ${PCINUM%%.*}.3 > /sys/bus/pci/drivers/mlx5_core/unbind || true
# 设置eswitch模式
devlink dev eswitch set pci/$PCINUM mode switchdev
devlink dev eswitch show pci/$PCINUM
# # pci/0000:43:00.0: mode switchdev inline-mode none encap-mode basic
# 绑定驱动
echo ${PCINUM%%.*}.2 > /sys/bus/pci/drivers/mlx5_core/bind
echo ${PCINUM%%.*}.3 > /sys/bus/pci/drivers/mlx5_core/bind
# 气动设备
ip link set <网卡> up
# 将代表口添加到网桥上。
ovs-vsctl add-port ovs-sriov ${IFNAME}
ovs-vsctl add-port ovs-sriov ${IFNAME}_0
ovs-vsctl add-port ovs-sriov ${IFNAME}_1
此时配置完之后会出现2个代表口和2个vf口。
3.ovs-kernel
Step.1:创建网桥
ovs-vsctl add-br ovs-br0
Step.2:qemu中配置网络设备
打开qemu
的xml
文件:virsh edit vm1
在device中添加如下命令:
<interface type='bridge'>
<mac address='52:54:00:4e:60:10'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</interface>
上述命令目的是在虚拟机中创建一个虚拟网卡,并将这个虚拟机网卡映射到主机上,同时绑定到主机的br0
网桥上。(上述命令最终目的是为了配置外网,外网是为了方便连接虚拟机,给虚拟机联网–下载软件包)如果不需要这一步可以省略。
Step.3:将vf网卡透传到qemu中
在device
模块中添加一下内容
<interface type='subsystem' type='pci' managed='yes'>
<source bridge='br0'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> (这个pci填写的是主机上vf的pci地址)
</interface>
开启虚拟机之后你会发现多了一张网卡,网卡类型为mlx5_core
类型的。(需要在虚拟机中安装mellanox ofed
驱动,和主机上的编译ofed
驱动步骤一样)
4.配置qemu虚拟机ip段
将两个vf分别透传到qemu中,两台虚拟机设置同一网段的ip,如下
// qemu_1
ifconfig <网卡名称> 1.1.1.1/20 up
// qemu_2
ifconfig <网卡名称> 1.1.1.2/20 up
两台虚拟机相互可以ping通,表示mellanox的sriov模式设置成功。
到此sriov模式配置结束。如果按照上述配置依然ping不通,或者中间有什么报错,请邮箱交流:947261733@qq.com。
如果对你有帮助,请麻烦点赞收藏一下~。原创不易