关于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
设置开机自启
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
如果你的不是pve那就把这两个pve都改成你节点的名称
CTCONFDIR=/etc/pve/nodes/pve/lxc
VMCONFDIR=/etc/pve/nodes/pve/qemu-server
就像这样
如何给虚拟机添加虚拟网卡
虚拟机添加虚机网卡设置
创建虚拟机系统选择Q35,后续添加pci网卡时可设置为pcie。
CPU类别选择host,可使用AES。
创建虚拟机完毕后再添加PCI设备虚拟网卡。
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
暂无评论内容