爱极客专注分享-好玩的docker应用-源码分享

PVE下intel i350网卡开启SR-IOV

关于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 可以协同工作。

开始教程

修改grub添加内核参数:

nano /etc/default/grub
intel_iommu=on iommu=pt pci=assign-busses   ##添加这个参数
# 更新grub
update-grub

使用本命令列出网卡id

lspci -k | grep -i ethernet

查看支持多少个虚拟网卡:

注意替换自己网卡名字

cat /sys/class/net/enp3s0f0/device/sriov_totalvfs

开启虚拟数量:

echo 7 > /sys/class/net/enp3s0f1/device/sriov_numvfs

列出所有网卡,可见虚拟网卡已识别。

lspci |grep Ethernet

PVE下intel i350网卡开启SR-IOV

PVE下intel i350网卡开启SR-IOV

设置开机自启

systemd开机设置虚拟网卡数量:

nano /etc/systemd/system/set-sriov-vfs.service
#注意修改网卡名字
[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/enp3s0f0/device/sriov_numvfs'

set VF MAC

ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 0 mac 00:80:00:00:00:00'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 1 mac 00:80:00:00:00:01'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 2 mac 00:80:00:00:00:02'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 3 mac 00:80:00:00:00:03'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 4 mac 00:80:00:00:00:04'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 5 mac 00:80:00:00:00:05'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set dev enp3s0f0 vf 6 mac 00:80:00:00:00:06'

set PF up

ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0 up'

set VF up

ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v0 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v1 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v2 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v3 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v4 up'
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v5 up'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp3s0f0v6 up'

Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl daemon-reload

systemctl enable set-sriov-vfs.service

reboot

添加注册mac地址脚本

防止VF网络和主机网络不能互相访问

cd /home
nano sr-iov-registermacaddr.sh

en01修改成自己pve管理网口名字

#!/usr/bin/bash
#
# vf_add_maddr.sh Version 1.1
# Script is based on kriss35
# Update by Rama: Added vmbridge macaddress itself, simplified, systemd-service(RestartOnFailure) Compatible and speeded up with a tmpfile(one readout).
# Usage: execute directly without arguments, make an systemd-service or add it to crontab to run every x Minutes.
#
CTCONFDIR=/etc/pve/nodes/pve/lxc
VMCONFDIR=/etc/pve/nodes/pve/qemu-server
IFBRIDGE=eno1 ##管理口网卡名字
LBRIDGE=vmbr0  ##桥接网口名字
TMP_FILE=/tmp/vf_add_maddr.tmp
 
C_RED='\e[0;31m'
C_GREEN='\e[0;32m'
C_NC='\e[0m'
 
if [ ! -d $CTCONFDIR ] || [ ! -d $VMCONFDIR ]; then
        echo -e "${C_RED}ERROR: Not mounted, self restart in 5s!${C_NC}"
        exit 1
else
        MAC_LIST_VMS=" $(cat ${VMCONFDIR}/*.conf | grep bridge | grep -Eo '([[:xdigit:]]{1,2}[:-]){5}[[:xdigit:]]{1,2}' | tr '[:upper:]' '[:lower:]') $(cat ${CTCONFDIR}/*.conf | grep hwaddr | grep -Eo '([[:xdigit:]]{1,2}[:-]){5}[[:xdigit:]]{1,2}' | tr '[:upper:]' '[:lower:]')"
        MAC_ADD2LIST="$(cat /sys/class/net/$LBRIDGE/address)"
        MAC_LIST="$MAC_LIST_VMS $MAC_ADD2LIST"
        /usr/sbin/bridge fdb show | grep "${IFBRIDGE} self permanent" > $TMP_FILE
 
        for mactoregister in ${MAC_LIST}; do
                if ( grep -Fq $mactoregister $TMP_FILE ); then
                        echo -e "${C_GREEN}$mactoregister${C_NC} - Exists!"
                else
                        /usr/sbin/bridge fdb add $mactoregister dev ${IFBRIDGE}
                        echo -e "${C_RED}$mactoregister${C_NC} - Added!"
                fi
        done
        exit 0
fi
chmod +x sr-iov-registermacaddr.sh

./sr-iov-registermacaddr.sh

##注意每次添加虚拟机或者网卡,都要执行这个脚本

注意修改

PVE下intel i350网卡开启SR-IOV

可以看到我这里是pve

如果你的不是pve那就把这两个pve都改成你节点的名称

CTCONFDIR=/etc/pve/nodes/pve/lxc

VMCONFDIR=/etc/pve/nodes/pve/qemu-server

就像这样

PVE下intel i350网卡开启SR-IOV

如何给虚拟机添加虚拟网卡

虚拟机添加虚机网卡设置

创建虚拟机系统选择Q35,后续添加pci网卡时可设置为pcie。
PVE下intel i350网卡开启SR-IOV
CPU类别选择host,可使用AES。
PVE下intel i350网卡开启SR-IOV
创建虚拟机完毕后再添加PCI设备虚拟网卡。
PVE下intel i350网卡开启SR-IOV

LXC虚拟机使用虚拟网卡:

/etc/pve/lxc/100.conf 
lxc.net.1.type: phys
lxc.net.1.link: enp5s0f0v5
lxc.net.1.name: eth1
lxc.net.1.flags: up
lxc.net.1.ipv4.address: 192.168.1.125/24
lxc.net.1.ipv4.gateway: 192.168.1.1
© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容