Pve下配置ib虚拟化

2024-06-25
2分钟阅读时长

1. 安装proxmox 7.2

为什么要安装proxmox 7.2 而不是最新版本?

因为最新版本的proxmox的kernel是debian12.5 ,mellanox目前没有支持debian12.5的安装包,且proxmox ≥ 8 的控制 web页面网络开关的程序由 ifupdown 升级为了ifupdown2 ,mellanox即使最新的驱动 也还是用了 ifupdown 这个老的版本,这两个版本的程序是冲突的,不能同时存在,所以我们就往下找还有没有mellanox支持的kernel所兼容的proxmox,那么最合适的是proxmox7.2 , 它的kernel版本是debian11.3 ,mellanox 的23的lts驱动也恰好支持

使用bmc的kvm 安装过程中,有的机器会遇到 xorg error 的问题(xorg 渲染的问题,pve8以上才解决这个问题),然后它会自动进入debug模式,

使用 nano 新建 /etc/X11/xorg.conf.d/xorg.conf ,写入以下内容:

Section "Device"
Identifier "Card0"
Driver "fbdev"
BusID "pci0:01:0:0:"
EndSection

然后执行

xinit — -dpi 96 >/dev/tty2 2>&1

即可进入它的gui安装界面,安装过程不再赘述

2. 开启sr-iov功能

修改 /etc/default/grub 中

GRUB_CMDLINE_LINUX=""

改为

GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt pci=assign-busses pci=realloc"

执行

update-grub

重启机器

3. 安装ib驱动

进入mellanox官网下载对应版本

image-20241115152414629

3.1 下载驱动包

wget https://content.mellanox.com/ofed/MLNX_OFED-23.10-2.1.3.1/MLNX_OFED_LINUX-23.10-2.1.3.1-debian11.3-x86_64.tgz
tar -xzvf MLNX_OFED_LINUX-23.10-2.1.3.1-debian11.3-x86_64.tgz
cd MLNX_OFED_LINUX-23.10-2.1.3.1-debian11.3-x86_64/

3.2 生成本地 Repo

./mlnx_add_kernel_support.sh -m $(pwd)

cd /tmp/
tar -xzvf MLNX_OFED_LINUX-23.10-2.1.3.1-debian11.3-x86_64-ext.tgz

cd /usr/local/src
mv /tmp/MLNX_OFED_LINUX-23.10-2.1.3.1-debian11.3-x86_64-ext ./

3.3 apt 添加本地 Repo

cd /etc/apt/sources.list.d
echo "deb [trusted=yes] file:/usr/local/src/MLNX_OFED_LINUX-23.10-2.1.3.1-debian11.3-x86_64-ext/DEBS ./" > mlnx_ofed.list

3.4 安装 mlnx-ofed 驱动

apt install mlnx-ofed-basic -y
mst start
/etc/init.d/openibd restart
#等待几分钟再重启机器
reboot

4. 开启ib虚拟化

4.1 启动Mellanox Framework Tools服务

mst start

4.2 定位ib设备

mst status

4.3 查询该ib设备信息

mlxconfig -d /dev/mst/mt4129_pciconf0 q

SRIOV_EN :启动虚拟化 NUM_OF_VFS: 虚拟化网卡的数量

4.4 刷写ib固件的配置

网上教程还需用 类似下面的命令刷写ib的固件配置,然后重启机器,但我的这里的值不是0,所以不用执行类似下面的命令

mlxconfig -d /dev/mst/mt4129_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=24

4.5 设置VF的数量

echo 16 > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs

设置完后,使用 lspci | grep Mellanox即可看到多出16个虚拟的ib网卡设备

vf 是 Virtual Function的缩写 ,其实就是IB虚拟网卡的意思

4.6 设置VF参数

进入 /sys/class/infiniband/mlx5_0/device/sriov 目录, 可以看到有名字 0 到 16 的16个目录,每个目录里面都有3个文件,名字分别是 node policy port ,

这3个文件定义了每张虚拟的IB网卡的参数,

1.port 的 GUID(默认为0)。

2.node的 GUID(默认为0)。

3.policy (管理状态)(默认关闭)

我们给第一个VF的node和port分别设置不一样的guid,策略打开

echo 11:22:33:44:77:66:77:56 > /sys/class/infiniband/mlx5_0/device/sriov/0/node
echo 11:22:33:44:77:66:77:57 > /sys/class/infiniband/mlx5_0/device/sriov/0/port
echo Follow > /sys/class/infiniband/mlx5_0/device/sriov/0/policy

给第二个VF也设置

echo 11:22:33:44:77:66:88:90 > /sys/class/infiniband/mlx5_0/device/sriov/1/node
echo 11:22:33:44:77:66:89:90 > /sys/class/infiniband/mlx5_0/device/sriov/1/port
echo Follow > /sys/class/infiniband/mlx5_0/device/sriov/1/policy

设置完后我们cat node和port的内容还是显示为0

我们需要将虚拟的ib网卡的pci设备地址写到bind文件里来刷新固件里的vf guid,通过 ibdev2netdev -v命令可以查到每个VF的pci地址

echo 0000:31:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
echo 0000:31:00.1 >  /sys/bus/pci/drivers/mlx5_core/bind

echo 0000:31:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind
echo 0000:31:00.2 > /sys/bus/pci/drivers/mlx5_core/bind

此时node 和port里的内容都被更新了,且执行 ibstat 能看到网卡都是活跃的

5. 虚拟的ib网卡应用

image-20241115152424349

在pve里直接添加对应pci设备即可,然后虚拟机里正常装ib驱动

6.持久化

新建/etc/ib-virtual.sh

mst start
echo 16 > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
# set vf0
echo 22:22:33:44:77:66:77:01 > /sys/class/infiniband/mlx5_0/device/sriov/0/node
echo 22:22:33:44:77:66:77:02 > /sys/class/infiniband/mlx5_0/device/sriov/0/port
echo Follow > /sys/class/infiniband/mlx5_0/device/sriov/0/policy
echo 0000:31:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
echo 0000:31:00.1 >  /sys/bus/pci/drivers/mlx5_core/bind

新建rc-local服务

cat > /etc/systemd/system/rc-local.service <<EOF
[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
EOF

新建rc-local文件

cat > /etc/rc.local <<EOF
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/etc/virtual.sh &
exit 0
EOF

添加权限并设置开机自启

chmod +x /etc/rc.local
systemctl enable rc-local
systemctl start rc-local.service

7.其他

  1. ubuntu22.04 开启SR-IOV后,使用桥接网卡的虚拟机无法被除宿主机以外的机器访问

解决办法:

sysctl -w net.bridge.bridge-nf-call-iptables=0
下一页 Centos7部署ovs