关于SR-IOV

SR-IOV(Single-Root I/O Virtualization,单根 I/O 虚拟化)是 PCI-SIG 推出的一项标准,定义了一种 PCIe 设备虚拟化技术的标准机制,是 “虚拟通道” 的一种技术实现,用于将一个 PCIe 设备虚拟成多个 PCIe 设备,每个虚拟 PCIe 设备都具有自己的 PCIe 配置空间,如同物理 PCIe 设备一样为上层软件提供服务。

SR-IOV 技术是一种基于物理硬件的虚拟化解决方案,可以提高物理 I/O 设备(常见的是网络适配器)的性能与可扩展性。SR-IOV 技术允许在虚拟机之间高效共享 PCIe 设备,由于 SR-IOV 技术是基于硬件实现的,可以使虚拟机获得与宿主机媲美的 I/O 性能。

SR-IOV 虚拟出来的通道分为两个类型:

PF(Physical Function,物理功能):管理 PCIe 设备在物理层面的通道功能,可以看作是一个完整的 PCIe 设备,包含了 SR-IOV 的功能结构,具有管理、配置 VF 的功能。

VF(Virtual Function,虚拟功能):是 PCIe 设备在虚拟层面的通道功能,即仅仅包含了 I/O 功能,VF 之间共享物理资源。VF 是一种裁剪版的 PCIe 设备,仅允许配置其自身的资源,虚拟机无法通过 VF 对 SR-IOV 网卡进行管理。所有的 VF 都是通过 PF 衍生而来,有些型号的 SR-IOV 网卡最多可以生成 256 个 VF。

简而言之,每个 VF 就像是物理网卡硬件资源的一个切片,而 PF 则是对所有物理网卡硬件资源的统筹者,包括管理众多 VF 可以协同工作。

教学开始

在PVE Shell使用本命令列出网卡id

lspci -k | grep -I ethernet

我这有一块双网口的千兆Intel 82576网卡和板载的I219-LM。

root@pve8:~# lspci -k | grep -i ethernet
07:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
07:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-LM (rev 10)

查询Intel 82576网卡支持开启几个VF网口,请在BIOS提前开启VT-d,SR-IOV选项

cat /sys/bus/pci/devices/0000:07:00.0/sriov_totalvfs
8 
# 输出8,则可以启用7个VF网卡

如不输出或者查询不到,则可能是你的网卡不支持SR-IOV或者未在BIOS开启SR-IOV选项

root@pve8:~# cat /sys/bus/pci/devices/0000:00:1f.6/sriov_totalvfs
cat: '/sys/bus/pci/devices/0000:00:1f.6/sriov_totalvfs': No such file or directory

支持SR-IOV的Intel网卡列表点我展开


英特尔® 以太网 800 系列
英特尔® 以太网网络适配器 E810(所有产品 SKU)
英特尔® 以太网网络适配器 X722 系列
英特尔® 以太网网络适配器 X722-DA2
英特尔® 以太网网络适配器 X722-DA4
英特尔® 以太网聚合网络适配器 XL710 系列
英特尔® 以太网聚合网络适配器 XL710-QDA1
英特尔® 以太网聚合网络适配器 XL710-QDA2
英特尔® 以太网聚合网络适配器 XL710-QDA1(OCP 版)
英特尔® 以太网聚合网络适配器 XL710-QDA2(OCP 版)
英特尔® 以太网网络适配器 XXV710 系列
英特尔® 以太网网络适配器 XXV710-DA1
英特尔® 以太网网络适配器 XXV710-DA2
英特尔® 以太网网络适配器 XXV710-DA1(适用 OCP)
英特尔® 以太网网络适配器 XXV710-DA2(OCP 版)
英特尔® 以太网聚合网络适配器 X710 系列
英特尔® 以太网聚合网络适配器 X710-DA2
英特尔® 以太网聚合网络适配器 X710-DA4
英特尔® 以太网聚合网络适配器 X710-T4
英特尔® 以太网控制器 X710/X557-AT 10GBASE-T
英特尔® 以太网连接 X722
英特尔® 以太网连接 X722(10GBASE-T 版)
英特尔® 以太网连接 X722(10GbE backplane 版)
英特尔® 以太网连接 X722(10GbE QSFP+ 版)
英特尔® 以太网连接 X722(10GbE SFP+ 版)
英特尔® 以太网融合网络适配器 X550
英特尔® 以太网聚合网络适配器 X550-T1
英特尔® 以太网聚合网络适配器 X550-T2
英特尔® 以太网融合网络适配器 X540
英特尔® 以太网聚合网络适配器 X540 T1
英特尔® 以太网聚合网络适配器 X540 T2
英特尔® 82599 万兆位以太网控制器
英特尔® 以太网 82599EB 万兆位以太网控制器
英特尔® 以太网 82599ES 万兆位以太网控制器
英特尔® 以太网 82599EN 万兆位以太网控制器
英特尔® 以太网融合网络适配器 X520
英特尔® 以太网聚合网络适配器 X520-DA2
英特尔® 以太网聚合网络适配器 X520-SR1
英特尔® 以太网聚合网络适配器 X520-SR2
英特尔® 以太网聚合网络适配器 X520-LR1
英特尔® 以太网聚合网络适配器 X520-T2
英特尔® 以太网控制器 I350
英特尔® 以太网控制器 I350-AM4
英特尔® 以太网控制器 I350-AM2
英特尔® 以太网控制器 I350-BT2 家族
英特尔® 以太网服务器适配器 I350
英特尔® 以太网服务器适配器 I350-T2
英特尔® 以太网服务器适配器 I350-T4
英特尔® 以太网服务器适配器 I350-F2
英特尔® 以太网服务器适配器 I350-F4
英特尔® 82576 eb 千兆位以太网控制器
英特尔® 82576 NS 千兆位以太网控制器

更多关于英特尔® 以太网服务器适配器中 SR-IOV 的常见问题解答见:https://www.intel.cn/content/www/cn/zh/support/articles/000005722/ethernet-products.html

写个开启网卡SR-IOV脚本
nano /usr/local/bin/NetworkCard_SRIOV.sh将以下内容粘贴到NetworkCard_SRIOV.sh文本里并保存。我这里的网卡名是enp6s0f0记得替换成自己的,一共有2处要改。

#!/bin/bash
set -x
#创建7个SR-IOV网卡
echo 7 > /sys/class/net/enp6s0f0/device/sriov_numvfs
# SR-IOV网卡分配MAC地址
if [ $? -eq 0 ]; then
  for i in {0..6}; do
    octet_hex=$(printf "%02x" $i)
    mac_address="00:11:22:33:44:$octet_hex"
    ip link set enp6s0f0 vf $i mac $mac_address
  done
fi

确保脚本文件是可执行的:

chmod +x /usr/local/bin/NetworkCard_SRIOV.sh

创建systemd开机自启文件
nano /etc/systemd/system/intel82576.service
将以下内容粘贴进去并保存:

[Unit]
Description=Setup SR-IOV Virtual Functions
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/NetworkCard_SRIOV.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启用开机自启并启动服务

# 重新加载 systemd 配置
systemctl daemon-reload
# 使其在系统启动时自动运行:
systemctl enable intel82576.service
# 启动服务以测试脚本
systemctl start intel82576.service
# 检查服务状态
systemctl status intel82576.service
Last modification:July 7th, 2024 at 04:07 am
If you think my article is useful to you, please feel free to appreciate