编辑文件/etc/default/grub
修改行GRUB_CMDLINE_LINUX_DEFAULT=“quiet”
使其为GRUB_CMDLINE_LINUX_DEFAULT=“quiet intel_iommu=on iommu=pt”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
update-grub
dmesg | grep -e DMAR -e IOMMU
DMAR: IOMMU enabled
vi /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
update-initramfs -u -k all
cat /etc/kernel/cmdline
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet intel_iommu=on iommu=pt
reboot
|
打开 /etc/default/grub 文件,在GRUB_CMDLINE_LINUX_DEFAULT行添加以下内容
pci=assign-busses是因为部署SR IOV的时候报错”write error: Cannot allocate memory“
编辑文件/etc/default/grub
修改行GRUB_CMDLINE_LINUX_DEFAULT=“quiet”
使其为GRUB_CMDLINE_LINUX_DEFAULT=“quiet intel_iommu=on iommu=pt pci=assign-busses pcie_acs_override=downstream”
1
2
3
4
5
6
7
|
cat /etc/kernel/cmdline
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet intel_iommu=on iommu=pt pci=assign-busses pcie_acs_override=downstream
cat /sys/bus/pci/devices/0000:01:00.1/sriov_totalvfs
echo 7 > /sys/class/net/ens3f1/device/sriov_numvfs
|
vi /etc/systemd/system/sriov.service
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
48
49
50
51
52
53
54
55
56
57
58
59
60
|
[Unit]
Description=Script to enable SR-IOV on boot
[Service]
Type=simple
#start SR-IOV
ExecStartPre=/usr/bin/bash -c '/usr/bin/echo 7 > /sys/class/net/ens3f0/device/sriov_numvfs'
ExecStartPre=/usr/bin/bash -c '/usr/bin/echo 7 > /sys/class/net/ens3f1/device/sriov_numvfs'
#set VF MAC
# 0000:02:10.0
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 0 mac 08:08:00:00:00:00'
# 0000:02:10.4
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 1 mac 08:08:00:00:00:01'
# 0000:02:11.0
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 2 mac 08:08:00:00:00:02'
# 0000:02:11.4
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 3 mac 08:08:00:00:00:03'
# 0000:02:12.0
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 4 mac 08:08:00:00:00:04'
# 0000:02:12.4
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 5 mac 08:08:00:09:00:05'
# 0000:02:13.0
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f0 vf 6 vlan 9 mac 08:08:00:09:00:06'
# 0000:02:10.1
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 0 mac 08:08:00:00:01:00'
# 0000:02:10.5
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 1 mac 08:08:00:00:01:01'
# 0000:02:11.1
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 2 mac 08:08:00:00:01:02'
# 0000:02:11.5
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 3 mac 08:08:00:00:01:03'
# 0000:02:12.1
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 4 mac 08:08:00:00:01:04'
# 0000:02:12.5
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 5 mac 08:08:00:09:01:05'
# 0000:02:13.1
#ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev ens3f1 vf 6 vlan 9 mac 08:08:00:09:01:06'
#set PF up
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1 up'
#set VF up
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v1 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v2 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v3 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v4 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v5 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f0v6 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v0 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v1 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v2 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v3 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v4 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v5 up'
# ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set ens3f1v6 up'
#ExecStart=/usr/bin/bash -c '/usr/bin/ip addr add 10.8.0.222/24 dev ens3f1v4'
Restart=on-failure
[Install]
WantedBy=multi-user.target
|
systemctl daemon-reload
systemctl enable sriov.service
reboot
dmesg | grep ensf
0000:02:10.0 ens3f0v0 08:08:00:00:00:00 10.8.0.249 - wan0
0000:02:10.4 ens3f0v1 08:08:00:00:00:01
0000:02:11.0 ens3f0v2 08:08:00:00:00:02 10.8.0.2 - dsm
0000:02:11.4 ens3f0v3 08:08:00:00:00:03
0000:02:12.0 ens3f0v4 08:08:00:00:00:04
0000:02:12.4 ens3f0v5 08:08:00:09:00:05
0000:02:13.0 ens3f0v6 08:08:00:09:00:06
0000:02:10.1 ens3f1v0 08:08:00:00:01:00 10.8.0.253 - gw
0000:02:10.5 ens3f1v1 08:08:00:00:01:01
0000:02:11.1 ens3f1v2 08:08:00:00:01:02
0000:02:11.5 ens3f1v3 08:08:00:00:01:03
0000:02:12.1 ens3f1v4 08:08:00:00:01:04 10.8.0.222 - backup manage of pve
0000:02:12.5 ens3f1v5 08:08:00:09:01:05 10.8.9.1 - lan9
0000:02:13.1 ens3f1v6 08:08:00:09:01:06 10.8.9.2 - dsm
直通PIC网卡时,注意不要勾选All Functions,勾了All Functions以后所以的VF都会被分配到这一个虚拟机里。
nano /etc/network/interfaces
auto ens16
iface ens16 inet dhcp
带vlan9的vf直通到openwrt9(含vmbr0.9)中会导致无法访问外网,因为两个vlan9冲突,删除vf后也没用,最后只能恢复备份。
经测试,成功方案为:从openwrt9中删除vmbr0.9,直接用vlan9的vf做lan,而且这样还可以给vlan9的AP做dhcp网关(之前vmbr0.9的无法分配IP)。