Pve下配置ib虚拟化
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官网下载对应版本
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网卡应用
在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.其他
- ubuntu22.04 开启SR-IOV后,使用桥接网卡的虚拟机无法被除宿主机以外的机器访问
解决办法:
sysctl -w net.bridge.bridge-nf-call-iptables=0