首先查询网卡是否支持SR IOV,可以查看这边文章《PVE查询网卡是否支持SR-IOV》
一、打开IOMMU
打开 /etc/default/grub 文件,在GRUB_CMDLINE_LINUX_DEFAULT行添加以下内容
pci=assign-busses是因为部署SR IOV的时候报错”Cannot allocate memory“
GRUB_CMDLINE_LINUX_DEFAULT=" intel_iommu=on pci=assign-busses pcie_acs_override=downstream"
更新grub
update-grub
在/etc/modules文件里添加如下内容
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
更新
update-initramfs -u -k all
重启
reboot
检查IOMMO功能是否开启
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
如果没有出现,那么在/etc/modprobe.d/的任意一个.conf文件中增加这些内容(不安全中断)
options vfio_iommu_type1 allow_unsafe_interrupts=1
二、测试SR-IOV网卡生成
可以先进行测试
譬如在 enp2s0f0 网卡上开4个VF
echo 4 > /sys/class/net/enp2s0f0/device/sriov_numvfs
成功不会有任何反馈,回到PVE节点网络查看网络列表是否有VF网卡出现,也可以使用
lspci
查看pci设备中是否有vf网卡
三、注册系统服务
首先创建启动脚本
cd /etc/systemd/system
vi sriov.service
示例是在i350-T4(系统名称enp2s0)的0号和1号口上分别开5个vf网卡、固化MAC地址防止重启MAC随机变动并且设置所有PF和VF为UP状态
[Unit]
Description=Script to enable SR-IOV on boot
[Service]
Type=simple
#start SR-IOV
ExecStartPre=/usr/bin/bash -c '/usr/bin/echo 5 > /sys/class/net/enp2s0f0/device/sriov_numvfs'
ExecStartPre=/usr/bin/bash -c '/usr/bin/echo 5 > /sys/class/net/enp2s0f1/device/sriov_numvfs'
#set VF MAC
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f0 vf 0 mac 00:54:00:00:00:00'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f0 vf 1 mac 00:54:00:00:00:01'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f0 vf 2 mac 00:54:00:00:00:02'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f0 vf 3 mac 00:54:00:00:00:03'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f0 vf 4 mac 00:54:00:00:00:04'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f1 vf 0 mac 00:54:00:00:01:00'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f1 vf 1 mac 00:54:00:00:01:01'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f1 vf 2 mac 00:54:00:00:01:02'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f1 vf 3 mac 00:54:00:00:01:03'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp2s0f1 vf 4 mac 00:54:00:00:01:04'
#set PF up
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f1 up'
#set VF up
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v1 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v2 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v3 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v4 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f1v0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f1v1 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f1v2 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f1v3 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f1v4 up'
Restart=on-failure
[Install]
WantedBy=multi-user.target
注册开机启动服务
systemctl daemon-reload
systemctl enable sriov.service
重启
reboot
四、备注地址线
使用命令
dmesg | grep enp*s*f*
查看对应PF和VF地址线,做好PVE界面里面的备注,这样就不容易搞混