一、SR-IOV介绍
SR-IOV(Single Root I/O Virtualization)技术可以实现单个物理网卡能够提供多个网卡的接口和功能,从而让每个虚拟机都能直接和物理网卡通信,获得接近物理网卡的网络性能。启用SR-IOV降低了IO延迟和对CPU的占用,让每一个虚拟机都可以获得接近原生的IO性能,尤其是虚拟机数量增多网络负载较大的时候会很明显。虽然SR-IOV和直通差不多,但是直通一个硬件只能分配给一个虚拟机。而SR-IOV可以将物理网卡拆分出多个VF,分配给多个虚拟机。
二、开启IOMMU
#编辑/etc/default/grub
nano /etc/default/grub
在 GRUB_CMDLINE_LINUX_DEFAULT 这一行后面根据所使用的平台加上相应命令
Intel平台:
intel_iommu=on iommu=pt
AMD平台:
amd_iommu=on iommu=pt
修改完 ctrl + x 保存 紧接着更新grub
update-grub
添加如下vfio modules 到 /etc/modules
nano /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
更新模块并重启
update-initramfs -u -k all
reboot
三、启用网卡SR-IOV
先看下网卡是否支持SR-IOV
lspci | grep -i eth
#查看网卡Businfo信息
lspci -s 02:00.0 -v
这里可以看出我的网卡是支持SR-IOV的, 也可以输入命令测试能否正常开启
#临时创建两个VF, 我的网卡名是 enp2s0f0
echo 2 > /sys/class/net/enp2s0f0/device/sriov_numvfs
#列出网卡,看看有没有多出的 “ Virtual Function ” 的网卡
lspci | grep Eth
确认网卡可以正常启用SR-IOV后,就编辑一个服务在开机帮我们创建VF。在/etc/systemd/system 新建一个名为sriov-net.service的文件
nano /etc/systemd/system/sriov-net.service
[Unit]
Description=Script to enable SR-IOV on boot
[Service]
Type=oneshot
# Starting SR-IOV-1
ExecStart=/usr/bin/bash -c '/usr/bin/echo 10 > /sys/class/net/enp2s0f0/device/sriov_numvfs'
#Setting static MAC for VFs-1
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 0 mac 81:55:00:00:00:a0'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 1 mac 81:55:00:00:00:a1'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 2 mac 81:55:00:00:00:a2'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 3 mac 81:55:00:00:00:a3'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 4 mac 81:55:00:00:00:a4'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 5 mac 81:55:00:00:00:a5'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 6 mac 81:55:00:00:00:a6'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 7 mac 81:55:00:00:00:a7'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 8 mac 81:55:00:00:00:a8'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 vf 9 mac 81:55:00:00:00:a9'
#set PF up
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0 up'
#set VF up
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v0 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v1 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v2 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v3 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v4 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v5 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v6 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v7 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v8 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2s0f0v9 up'
[Install]
WantedBy=multi-user.target
echo 12 中的12为需要虚拟的网卡数量 enp2s0f0 为需要虚拟的网卡
每个VF后的mac 81:55:00:00:00:a0 可以删掉,我这样设置是为了固定MAC地址,不然每次开机时随机的
#重载服务
systemctl daemon-reload
#设置成开机启动
systemctl enable sriov-net.service
#重启
reboot
重启后在PVE后台查看SR-IOV已生效
评论区