1. 启用IOMMO功能

1
nano /etc/default/grub

修改成如下

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off pci=assign-busses pcie_acs_override=downstream"

然后更新grub

1
update-grub

2

1
nano /etc/modules

添加以下内容

1
2
3
4
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

然后更新并重启

1
2
update-initramfs -u
reboot

3

检查IOMMO功能是否开启

1
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

2

以上画面就是开启了(有IOMMU enabled
如果没有出现,那么在/etc/modprobe.d/的任意一个.conf下
例如nano /etc/modprobe.d/pve-blacklist.conf
增加这些内容

1
options vfio_iommu_type1 allow_unsafe_interrupts=1

ifconfig -a或者ip addr可以看到所有的网卡名
查看是否支持SR-IOV

1
lspci -s 01:00.1 -vvv | grep Capabilities

有SR-IOV 就是支持

查看所有网卡

1
lspci|grep Eth  

查看网口最大支持的VF网口数量

1
cat /sys/bus/pci/devices/0000:04:00.0/sriov_totalvfs

添加VF网口

1
echo 16 > /sys/class/net/enp4s0f0/device/sriov_numvfs

正常情况下无任何回显
再次查看

1
dmesg | grep enp4s0f0

查看sriov网卡

开机启动sriov
创建系统服务:

1
nano /etc/systemd/system/sriov.service

使用nano命令创建一个SR-IOV服务把参数写进里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Script to enable SR-IOV on boot

[Service]
Type=oneshot
#start SR-IOV
ExecStart=/usr/bin/bash -c '/usr/bin/echo 16 > /sys/class/net/enp4s0f0/device/sriov_numvfs'
#set VF MAC
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 0 mac 00:54:32:00:00:00'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 1 mac 00:54:32:00:00:01'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 2 mac 00:54:32:00:00:02'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 3 mac 00:54:32:00:00:03'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 4 mac 00:54:32:00:00:03'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 5 mac 00:54:32:00:00:03'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 vf 5 mac 00:54:32:00:00:03'

[Install]
WantedBy=multi-user.target

注册开机启动服务

1
2
systemctl daemon-reload
systemctl enable sriov.service

使用命令ip a查看网卡信息,查看MAC地址是否绑定正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[Unit]
Description=Script to enable SR-IOV on boot

[Service]
Type=simple
#start SR-IOV
ExecStartPre=/usr/bin/bash -c '/usr/bin/echo 16 > /sys/class/net/enp4s0f0/device/sriov_numvfs'
#set VF MAC
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 0 mac 00:54:00:00:00:00'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 1 mac 00:54:00:00:00:01'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 2 mac 00:54:00:00:00:02'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 3 mac 00:54:00:00:00:03'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 4 mac 00:54:00:00:00:04'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 5 mac 00:54:00:00:00:05'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 6 mac 00:54:00:00:00:06'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 7 mac 00:54:00:00:00:07'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 8 mac 00:54:00:00:00:08'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 9 mac 00:54:00:00:00:09'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 10 mac 00:54:00:00:00:10'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 11 mac 00:54:00:00:00:11'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 12 mac 00:54:00:00:00:12'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 13 mac 00:54:00:00:00:13'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 14 mac 00:54:00:00:00:14'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp4s0f0 vf 15 mac 00:54:00:00:00:15'
#set PF up
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0 up'
#set VF up
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v1 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v2 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v3 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v4 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v5 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v6 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v7 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v8 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v9 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v10 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v11 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v12 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v13 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v14 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v15 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp4s0f0v15 up'
Restart=on-failure
[Install]
WantedBy=multi-user.target