DOCA 文档 v2.10.0

SR-IOV

单根 I/O 虚拟化 (SR-IOV) 使物理 PCIe 设备能够在 PCIe 总线上呈现多个虚拟实例。这项技术允许设备为每个虚拟实例分配单独的资源。NVIDIA® ConnectX® 适配器每个端口最多支持 127 个 VF,允许独立配置每个 VF。

VF 充当连接到 PF 的附加设备,共享 PF 的资源并具有相同数量的端口。SR-IOV 通常与启用 SR-IOV 的虚拟机监控程序一起使用,为虚拟机提供对网络资源的直接硬件访问,从而显著提高性能。

本章演示如何在 Red Hat Linux 环境中使用 ConnectX VPI 适配器设置和配置 SR-IOV。

要设置 SR-IOV 环境,需要以下条件

  • MLNX_OFED 驱动程序

  • 具有支持 SR-IOV 的主板 BIOS 的服务器/刀片

  • 支持 SR-IOV 的虚拟机监控程序,例如:Red Hat Enterprise Linux Server Version 6

  • 具有 SR-IOV 功能的 NVIDIA ConnectX® VPI 适配器卡系列

根据您的系统,执行以下步骤来设置您的 BIOS。本节中使用的图示仅供说明之用。有关更多信息,请参阅相应的 BIOS 用户手册

  1. 在系统 BIOS 中启用“SR-IOV”。

    worddavb2ee67a7eb9aae5c536610e39a37dcc5-version-1-modificationdate-1734565408263-api-v2.png

  2. 启用“Intel 虚拟化技术”。

    worddav6931c32564b3b0c166f4a26788219144-version-1-modificationdate-1734565407580-api-v2.png

  3. 安装支持 SR-IOV 的虚拟机监控程序。

  4. 根据您的系统,更新 /boot/grub/grub.conf 文件以包含与 Linux 内核类似的命令行加载参数。

    例如,对于 Intel 系统,添加

    复制
    已复制!
                

    default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (4.x.x) root (hd0,0) kernel /vmlinuz-4.x.x ro root=/dev/VolGroup00/LogVol00 rhgb quiet intel_iommu=on initrd /initrd-4.x.x.img

    注意

    确保在更新 /boot/grub/grub.conf 文件时,参数 intel_iommu=on 存在,否则无法加载 SR-IOV。某些操作系统使用 /boot/grub2/grub.cfg 文件。如果您的服务器使用此类文件,请编辑此文件(在以 linux16 开头的行末尾添加 intel_iommu=on)。

  1. 安装支持 SR-IOV 的 Linux 版 MLNX_OFED 驱动程序。

  2. 检查固件中是否启用了 SR-IOV。

    复制
    已复制!
                

    mlxconfig -d /dev/mst/mt4115_pciconf0 q   Device #1: ----------   Device type: Connect4 PCI device: /dev/mst/mt4115_pciconf0 Configurations: Current SRIOV_EN 1 NUM_OF_VFS 8

    注意

    如果需要,使用 mlxconfig 设置相关字段

    mlxconfig -d /dev/mst/mt4115_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=16

  3. 重启服务器。

  4. 将您需要为 PF 创建的虚拟功能数量写入 sysfs 文件。您可以使用以下等效文件之一

    您可以使用以下等效文件之一

    - 标准 Linux 内核生成的文件,可在新内核中使用。

    复制
    已复制!
                

    echo [num_vfs] > /sys/class/infiniband/mlx5_0/device/sriov_numvfs

    注意:只有在 grub.conf 文件中设置了 IOMMU(通过添加 intel_iommu=on,如“设置 SR-IOV”下的第四步所示)时,才会生成此文件。

    - mlx5_core 驱动程序生成的文件,其功能与内核生成的文件相同。

    复制
    已复制!
                

    echo [num_vfs] > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs

    注意:旧内核使用此文件,这些内核不支持标准文件。在这样的内核中,使用 sriov_numvfs 会导致以下错误:“bash: echo: write error: Function not implemented”。

    以下规则适用于写入这些文件

    - 如果没有分配 VF,则 VF 的数量可以更改为任何有效值(0 - 最大 #VF,如 FW 烧录期间设置)

    - 如果有 VF 分配给 VM,则无法更改 VF 的数量

    - 如果管理员在没有分配 VF 的情况下卸载 PF 上的驱动程序,则驱动程序将卸载,并且 SRI-OV 将被禁用

    - 如果在卸载 PF 驱动程序时分配了 VF,则 SR-IOV 不会被禁用。这意味着 VF 在 VM 上可见。但是,它们将无法运行。这适用于使用 pci_stub 而不是 vfio 的操作系统。

    - VF 驱动程序将发现这种情况并将关闭其资源

    - 当 PF 上的驱动程序重新加载时,VF 将变为可操作。VF 的管理员将需要重新启动驱动程序才能恢复使用 VF。

  5. 加载驱动程序。验证 VF 是否已创建。运行

    复制
    已复制!
                

    lspci | grep Mellanox 08:00.0 Infiniband controller: Mellanox Technologies MT27700 Family [ConnectX-4] 08:00.1 Infiniband controller: Mellanox Technologies MT27700 Family [ConnectX-4] 08:00.2 Infiniband controller: Mellanox Technologies MT27700 Family [ConnectX-4 Virtual Function] 08:00.3 Infiniband controller: Mellanox Technologies MT27700 Family [ConnectX-4 Virtual Function] 08:00.4 Infiniband controller: Mellanox Technologies MT27700 Family [ConnectX-4 Virtual Function] 08:00.5 Infiniband controller: Mellanox Technologies MT27700 Family [ConnectX-4 Virtual Function]

  6. 配置 VF。

    创建 VF 后,每个 VF 都有 3 个 sysfs 条目,位于 /sys/class/infiniband/mlx5_<PF INDEX>/device/sriov 下(以下显示 VF 0 到 2 的情况)

    复制
    已复制!
                

    +-- 0 | +-- node | +-- policy | +-- port +-- 1 | +-- node | +-- policy | +-- port +-- 2 +-- node +-- policy +-- port

    对于每个虚拟功能,以下文件可用

    - 节点 - 节点的 GUID

    用户可以通过写入 /sys/class/infiniband/<PF>/device/sriov/<index>/node 文件来设置节点 GUID。下面的示例显示了如何设置 mlx5_0 的 VF 0 的节点 GUID。

    复制
    已复制!
                

    echo 00:11:22:33:44:55:1:0 > /sys/class/infiniband/mlx5_0/device/sriov/0/node

    - 端口 - 端口的 GUID

    用户可以通过写入 /sys/class/infiniband/<PF>/device/sriov/<index>/port 文件来设置端口 GUID。下面的示例显示了如何设置 mlx5_0 的 VF 0 的端口 GUID。

    复制
    已复制!
                

    echo 00:11:22:33:44:55:2:0 > /sys/class/infiniband/mlx5_0/device/sriov/0/port

    - 策略 - vport 的策略。用户可以通过写入 /sys/class/infiniband/<PF>/device/sriov/<index>/port 文件来设置端口 GUID。策略可以是以下之一

    - Down - VPort PortState 保持“Down”

    - Up - 如果当前的 VPort PortState 为“Down”,则将其修改为“Initialize”。在所有其他状态下,它保持不变。结果是 SM 可能会启动 VPort。

    - Follow - 遵循物理端口的 PortState。如果物理端口的 PortState 为“Active”,则 VPort 实现“Up”策略。否则,VPort PortState 为“Down”。

    注意:

    - 在 PF 驱动程序重启后,所有 vport 的策略都初始化为“Down”,但 VPort0 除外,PF 驱动程序将其策略修改为“Follow”。

    - 要查看 VF 配置,您必须取消绑定并绑定它们,或者如果 VF 已分配,则重启 VM。

  7. 确保 OpenSM 支持虚拟化(必须启用虚拟化)。

    /etc/opensm/opensm.conf 文件应包含以下行

    复制
    已复制!
                

    virt_enabled 2 

    注意

    OpenSM 和任何其他使用 SMP MAD 的实用程序(ibnetdiscoversminfoiblink-infosmpdumpibqueryerribdiagnetsmpquery)应在 PF 上而不是在 VF 上运行。在多 PF(多主机)的情况下,OpenSM 应在 host0 上运行。

VF 初始化注意事项

由于同一个 mlx5_core 驱动程序同时支持物理功能和虚拟功能,因此一旦创建了 VF,PF 的驱动程序将尝试初始化它们,以便它们可供拥有 PF 的操作系统使用。如果要将 VF 分配给 VM,则需要确保 PF 驱动程序未使用该 VF。如果 VF 正在使用,您应先取消绑定它,然后再分配给 VM。

要取消绑定设备,请使用以下命令

  1. 获取设备的完整 PCIe 地址。

    复制
    已复制!
                

    lspci -D

    示例

    复制
    已复制!
                

    0000:09:00.2

  2. 取消绑定设备。

    复制
    已复制!
                

    echo 0000:09:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind

  3. 绑定未绑定的 VF。

    复制
    已复制!
                

    echo 0000:09:00.2 > /sys/bus/pci/drivers/mlx5_core/bind

PF 和 VF 的 PCI BDF 映射

PF 及其 VF 的 PCI 地址是连续的。假设卡的 PCIe 插槽为 05:00,并且它有 2 个端口,则 PF 的 PCI 地址将为 05:00.0 和 05:00.1。

假设每个 PF 有 3 个 VF,则 VF 的 PCI 地址将为

复制
已复制!
            

05:00.2-4 for VFs 0-2 of PF 0 (mlx5_0) 05:00.5-7 for VFs 0-2 of PF 1 (mlx5_1)

将虚拟功能分配给虚拟机

本节介绍将 SR-IOV VF 添加到虚拟机的机制。

将 SR-IOV 虚拟功能分配给 Red Hat KVM VM 服务器

  1. 运行 virt-manager。

  2. 双击虚拟机并打开其“属性”。

  3. 转到“详细信息”→“添加硬件”→“PCI 主机设备”。

    image2019-3-8_12-50-6-version-1-modificationdate-1734565406900-api-v2.png

  4. 根据 NVIDIA 虚拟功能的 PCI 设备(例如,00:03.1)选择一个

  5. 如果虚拟机已启动,则重启它,否则启动它。

  6. 登录到虚拟机并验证它是否识别 NVIDIA 卡。运行

    复制
    已复制!
                

    lspci | grep Mellanox

    示例:

    复制
    已复制!
                

    lspci | grep Mellanox 01:00.0 Infiniband controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]

  7. 将设备添加到 /etc/sysconfig/network-scripts/ifcfg-ethX 配置文件。每个虚拟功能的 MAC 地址都是随机配置的,因此无需添加它。

运行 SR-IOV 时的以太网虚拟功能配置

SR-IOV 虚拟功能配置可以通过虚拟机监控程序 iprout2/netlink 工具完成(如果存在)。否则,可以通过 sysfs 完成。

复制
已复制!
            

ip link set { dev DEVICE | group DEVGROUP } [ { up | down } ] ... [ vf NUM [ mac LLADDR ] [ vlan VLANID [ qos VLAN-QOS ] ] ... [ spoofchk { on | off} ] ] ...   sysfs configuration (ConnectX-4):   /sys/class/net/enp8s0f0/device/sriov/[VF]   +-- [VF] | +-- config | +-- link_state | +-- mac | +-- mac_list | +-- max_tx_rate | +-- min_tx_rate | +-- spoofcheck | +-- stats | +-- trunk | +-- trust | +-- vlan

VLAN 访客标记 (VGT) 和 VLAN 交换机标记 (VST)

在 VGT 上运行 ETH 端口时,可以将端口配置为简单地按原样传递来自 VF 的数据包(VLAN 访客标记),或者管理员可以将虚拟机监控程序配置为静默地强制数据包与 VLAN/Qos 关联(VLAN 交换机标记)。

在后一种情况下,来自访客的未标记或优先级标记的传出数据包将插入 VLAN 标记,而传入数据包将删除 VLAN 标记。

默认行为是 VGT。

要配置 VF VST 模式,请运行

复制
已复制!
            

ip link set dev <PF device> vf <NUM> vlan <vlan_id> [qos <qos>]

其中

  • NUM = 0..max-vf-num

  • vlan_id = 0..4095

  • qos = 0..7

例如

  • ip link set dev eth2 vf 2 vlan 10 qos 3 - 为属于 PF eth2 的 VF #2 设置 VST 模式,vlan_id = 10 和 qos = 3

  • ip link set dev eth2 vf 2 vlan 0 - 将 VF 2 的模式设置回 VGT

其他以太网 VF 配置选项

  • 访客 MAC 配置 – 默认情况下,访客 MAC 地址配置为全零。如果管理员希望访客始终以相同的 MAC 启动,他/她应在访客驱动程序启动之前配置访客 MAC。访客 MAC 可以通过使用以下方式配置

    复制
    已复制!
                

    ip link set dev <PF device> vf <NUM> mac <LLADDR>

    对于不生成随机 MAC 的旧版和 ConnectX-4 访客,管理员应始终通过 IP link 配置其 MAC 地址,如上所述。

  • 欺骗检查 – 欺骗检查目前仅在 3.1 以上的最新内核上可用。

    复制
    已复制!
                

    ip link set dev <PF device> vf <NUM> spoofchk [on | off]

  • 访客链路状态

    复制
    已复制!
                

    ip link set dev <PF device> vf <UM> state [enable| disable| auto]

虚拟功能统计信息

可以通过 sysfs 查询虚拟功能统计信息

复制
已复制!
            

cat /sys/class/infiniband/mlx5_2/device/sriov/2/stats tx_packets : 5011 tx_bytes : 4450870 tx_dropped : 0 rx_packets : 5003 rx_bytes : 4450222 rx_broadcast : 0 rx_multicast : 0 tx_broadcast : 0 tx_multicast : 8 rx_dropped : 0


将 VF 映射到端口

Procedure_Heading_Icon-version-1-modificationdate-1734565407280-api-v2.PNG

要查看 VF 到端口的映射

使用 ip link 工具 v2.6.34~3 及更高版本。

复制
已复制!
            

ip link

输出

复制
已复制!
            

61: p1p1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 00:02:c9:f1:72:e0 brd ff:ff:ff:ff:ff:ff vf 0 MAC 00:00:00:00:00:00, vlan 4095, spoof checking off, link-state auto vf 37 MAC 00:00:00:00:00:00, vlan 4095, spoof checking off, link-state auto vf 38 MAC ff:ff:ff:ff:ff:ff, vlan 65535, spoof checking off, link-state disable vf 39 MAC ff:ff:ff:ff:ff:ff, vlan 65535, spoof checking off, link-state disable

当 MAC 为 ff:ff:ff:ff:ff:ff 时,VF 未分配给它列出的网络设备的端口。在上面的示例中,vf38 未分配给与 p1p1 相同的端口,这与 vf0 相反。

但是,即使未分配给网络设备的 VF 也可以用于设置和更改其设置。例如,以下是更改欺骗检查的有效命令

复制
已复制!
            

ip link set dev p1p1 vf 38 spoofchk on

此命令将仅影响 vf38。更改可以在分配此设备的网络设备的 ip link 中看到。

RoCE 支持

RoCE 在虚拟功能上受支持,VLAN 可以与它一起使用。对于 RoCE,虚拟机监控程序 GID 表大小为 16 个条目,而 VF 共享剩余的 112 个条目。当 VF 的数量大于 56 个条目时,其中一些 VF 的 GID 表将只有一个条目,如果 VF 的以太网设备分配了 IP 地址,这将是不够的。

虚拟访客标记 (VGT+)

VGT+ 是虚拟访客标记 (VGT) 的增强模式,允许虚拟功能 (VF) 标记自己的数据包,同时遵守管理 VLAN 中继策略。此策略指定允许传输和接收的 VLAN ID,但不影响用户优先级,用户优先级保持不变。

数据包可以在两种模式之一中发送:是否能够处理未标记和优先级标记的流量。VGT+ 未为其端口定义默认 VLAN。仅当传出数据包符合策略时,才会将其传递到 eSwitch,并且仅当传入数据包满足定义的条件时,才会将其转发到 VF。

配置

注意

在 SR-IOV 中工作时,默认操作模式是 VGT。

要启用 VGT+ 模式,请设置允许的 VLAN 范围的相应端口/VF(在下面的示例中为端口 eth5,VF0)

复制
已复制!
            

echo "<add> <start_vid> <end_vid>" > /sys/class/net/eth5/device/sriov/0/trunk

示例

  • 要将 VLAN ID 范围 (4-15) 添加到中继

    复制
    已复制!
                

    echo add 4 15 > /sys/class/net/eth5/device/sriov/0/trunk

  • 要将单个 VLAN ID 添加到中继

    复制
    已复制!
                

    echo add 17 17 > /sys/class/net/eth5/device/sriov/0/trunk

注意

当 VLAN ID = 0 时,表示允许未标记和优先级标记的流量。

要禁用 VGT+ 模式,请确保删除所有 VLAN

复制
已复制!
            

echo rem 0 4095 > /sys/class/net/eth5/device/sriov/0/trunk

要删除选定的 VLAN

  • 从中继中删除 VLAN ID 范围 (4-15)

    复制
    已复制!
                

    echo rem 4 15 > /sys/class/net/eth5/device/sriov/0/trunk

  • 从中继中删除单个 VLAN ID

    复制
    已复制!
                

    echo rem 17 17 > /sys/class/net/eth5/device/sriov/0/trunk

SR-IOV 高级安全功能

SR-IOV MAC 防欺骗

通常,MAC 地址是分配给网络接口的唯一标识符,它们是无法更改的固定地址。MAC 地址欺骗是一种更改 MAC 地址以服务于不同目的的技术。在某些情况下,更改 MAC 地址可能是合法的,而在其他情况下,它可能是非法的,并且会滥用安全机制或伪装可能的攻击者。

SR-IOV MAC 地址防欺骗功能,也称为 MAC 欺骗检查,可防止恶意 VM MAC 地址伪造。如果网络管理员为 VF 分配了 MAC 地址(通过虚拟机监控程序)并在其上启用了欺骗检查,这将限制最终用户只能从该 VF 的分配 MAC 地址发送流量。

MAC 防欺骗配置

注意

默认情况下,MAC 防欺骗已禁用。

在下面的配置示例中,VM 位于 VF-0 上,MAC 地址为 11:22:33:44:55:66。

有两种方法可以启用或禁用 MAC 防欺骗

  1. 使用标准 IP link 命令 - 从 Kernel 3.10 及更高版本可用。

    1. 要启用 MAC 防欺骗,请运行

      复制
      已复制!
                  

      ip link set ens785f1 vf 0 spoofchk on

    2. 要禁用 MAC 防欺骗,请运行

      复制
      已复制!
                  

      ip link set ens785f1 vf 0 spoofchk off

  2. 指定“ON”或“OFF”回显到位于 /sys/class/net/<if-name>/device/sriov/<VF-index>/spoofcheck 下的文件。

    1. 要启用 MAC 防欺骗,请运行

      复制
      已复制!
                  

      echo "ON" > /sys/class/net/ens785f1/vf/0/spoofchk

    2. 要禁用 MAC 防欺骗,请运行

      复制
      已复制!
                  

      echo "OFF" > /sys/class/net/ens785f1/vf/0/spoofchk

注意

此配置是非持久性的,并且在驱动程序重启后不会保留。

每个 VF 的限制和带宽共享

此功能支持在 SR-IOV 模式下限制每个 VF 的流量速率。有关如何为 ConnectX-4 及更高版本适配器卡配置每个 VF 的速率限制的详细信息,请参阅 HowTo Configure Rate Limit per VF for ConnectX-4/ConnectX-5/ConnectX-6 社区帖子。

限制 VF 组的带宽

vSwitch (OVS) 的 VF 速率限制功能允许用户将可用的 VF 加入组,并设置每个组的速率限制。VF 组的速率限制确保此组中的 VF 获取的总 Tx 带宽(总共组合)不会超过给定的值。

使用此功能,VF 仍然可以像过去一样配置单独的速率限制(在 /sys/class/net/ 下/device/sriov//max_tx_rate)。但是,VF 的实际带宽限制最终将根据 VF 组限制以及同一组中的 VF 数量来确定。

例如:2 个 VF(0 和 1)附加到组 3。

案例 1:组的速率限制设置为 20G。每个 VF 的速率限制为 15G

结果:每个 VF 的速率限制为 10G

案例 2:组的最大速率限制仍设置为 20G。VF 0 配置为 30G 限制,而 VF 1 配置为 5G 速率限制

结果:VF 0 实际上将具有 15G。VF 1 将具有 5G

经验法则是组的带宽在组中的 VF 数量之间平均分配。如果还有剩余,它们将分配给尚未达到其单独速率限制的 VF。

VF 速率限制功能配置

  1. 当 FW 支持 VF 速率组时,驱动程序将在 SRI-OV sysfs 中创建一个名为“groups”的新层次结构 (/sys/class/net/<ifname>/device/sriov/groups/)。它将包含 VF 组的所有信息和允许的配置。

  2. 所有 VF 默认都放在组 0 中,因为它是初始驱动程序启动后唯一存在的组。它将是 /sys/class/net/<ifname>/device/sriov/groups/ 下唯一可用的组

  3. VF 可以通过写入组文件移动到不同的组 -> echo $GROUP_ID > /sys/class/net/<ifname>/device/sriov/<vf_id>/group

  4. 允许的组 ID 为 0-255

  5. 仅当组中至少有 1 个 VF 时,/sys/class/net/<ifname>/device/sriov/groups/ 下才会有组配置可用(组 0 除外,即使它为空也始终可用)。

  6. 一旦创建了组(通过将至少 1 个 VF 移动到该组),用户就可以配置组的速率限制。例如

    1. echo 10000 > /sys/class/net/<ifname>/device/sriov/5/max_tx_rate – 将 VF 5 的单独速率限制设置为 10G(可选)

    2. echo 7 > /sys/class/net/<ifname>/device/sriov/5/group – 将 VF 5 移动到组 7

    3. echo 5000 > /sys/class/net/<ifname>/device/sriov/groups/7/max_tx_rate – 将组 7 的速率限制设置为 5G

    4. 当现在通过 VF 5 运行流量时,由于组速率限制,它将被限制为 5G,即使 VF 本身被限制为 10G

    5. echo 3 > /sys/class/net/<ifname>/device/sriov/5/group – 将 VF 5 移动到组 3

    6. 组 7 现在将从 /sys/class/net/<ifname>/device/sriov/groups 中消失,因为它有 0 个 VF。组 3 现在将出现。由于组 3 上没有速率限制,VF 5 可以以 10G 的速率传输(由于其单独的配置)。

注意

  • 您可以在 stats sysfs 中查看 VF 所属的组(即,cat /sys/class/net/<ifname>/device/sriov/<vf_num>/stats

  • 您可以在组的 config sysfs 中查看组的当前速率限制和附加的 VF 数量(即,cat /sys/class/net/<ifname>/device/sriov/groups/<group_id>/config


每个 VF 组的带宽保证

可以在 VF 组上设置带宽保证(最小 BW),以确保此组能够 至少 在线路上指定的带宽量进行传输。

请注意以下事项

  • VF 组上的最小 BW 设置决定了组之间如何共享总 BW。它不影响单个 VF 的速率设置。

  • VF 组上设置的总最小 BW 不应超过总线路速率。否则,结果将是意外的。

  • 仍然可以在组内的单个 VF 上设置最小 BW。这将决定 VF 之间如何共享组的最小 BW。VF 成员的总最小 BW 不应超过组的最小 BW。

有关如何创建 VF 组的说明,请参阅上面的 限制 VF 组的带宽

示例

使用 40Gb 链路速度,假设已创建 4 个组和默认组 0

复制
已复制!
            

echo 20000 > /sys/class/net/<ifname>/device/sriov/group/1/min_tx_rate echo 5000 > /sys/class/net/<ifname>/device/sriov/group/2/min_tx_rate echo 15000 > /sys/class/net/<ifname>/device/sriov/group/3/min_tx_rate

复制
已复制!
            

Group 0(default) : 0 - No BW guarantee is configured. Group 1 : 20000 - This is the maximum min rate among groups Group 2 : 5000 which is 25% of the maximum min rate Group 3 : 15000 which is 75% of the maximum min rate Group 4 : 0 - No BW guarantee is configured.

假设所有组中都有 VF 尝试以全线路速率传输,则结果将如下所示:在这种情况下,最小 BW 分配将为

复制
已复制!
            

Group0 – Will have no BW to use since no BW guarantee was set on it while other groups do have such settings. Group1 – Will transmit at 20Gb/s Group2 – Will transmit at 5Gb/s Group3 – Will transmit at 15Gb/s Group4 - Will have no BW to use since no BW guarantee was set on it while other groups do have such settings.

特权 VF

如果恶意驱动程序在一个 VF 上运行,并且该 VF 的权限不受限制,则可能会打开安全漏洞。但是,VF 可以标记为受信任,因此可以接收物理功能特权或权限的独占子集。例如,在允许所有 VF 而不是特定 VF 进入混杂模式作为特权的情况下,这将使恶意用户能够嗅探和监视整个物理端口的传入流量,包括针对其他 VF 的流量,这被认为是严重的安全漏洞。

特权 VF 配置

在下面的配置示例中,VM 位于 VF-0 上,并且具有以下 MAC 地址:11:22:33:44:55:66。

有两种方法可以启用或禁用信任

  1. 使用标准 IP link 命令 - 从 Kernel 4.5 及更高版本可用。

    1. 要为特定 VF 启用信任,请运行

      复制
      已复制!
                  

      ip link set ens785f1 vf 0 trust on

    2. 要为特定 VF 禁用信任,请运行

      复制
      已复制!
                  

      ip link set ens785f1 vf 0 trust off

  2. 指定“ON”或“OFF”回显到位于 /sys/class/net/<ETH_IF_NAME> / device/sriov/<VF index>/trust 下的文件。

  1. 要为特定 VF 启用信任,请运行

    复制
    已复制!
                

    echo "ON" > /sys/class/net/ens785f1/device/sriov/0/trust

  2. 要为特定 VF 禁用信任,请运行

    复制
    已复制!
                

    echo "OFF" > /sys/class/net/ens785f1/device/sriov/0/trust

探测到的 VF

启用 SR-IOV 后探测虚拟功能 (VF) 可能会消耗适配器卡的资源。因此,建议在不需要监视 VM 时不要启用 VF 探测。

VF 探测可以通过两种方式禁用,具体取决于服务器上安装的内核版本

  1. 如果安装的内核版本为 v4.12 或更高版本,建议使用 PCI sysfs 接口 sriov_drivers_autoprobe。有关更多信息,请参阅 linux-next 分支

  2. 如果安装的内核版本低于 v4.12,建议使用 mlx5_core 模块参数 probe_vf 和驱动程序版本 4.1 或更高版本。

示例:

复制
已复制!
            

echo 0 > /sys/module/mlx5_core/parameters/probe_vf

有关如何探测 VF 的更多信息,请参阅 HowTo Configure and Probe VFs on mlx5 Drivers社区帖子。

VF 混杂接收模式

VF 混杂模式

VF 可以进入混杂模式,除了最初针对 VF 的流量外,还可以接收到达物理端口的未匹配流量和所有多播流量。未匹配流量是任何流量的 DMAC,它与任何 VF 或 PF 的 MAC 地址都不匹配。

注意:只有特权/受信任的 VF 才能进入 VF 混杂模式。

Procedure_Heading_Icon-version-1-modificationdate-1734565407280-api-v2.PNG

要为 VF 启用混杂模式,请运行

复制
已复制!
            

ifconfig eth2 promisc

要退出混杂模式,请运行

Procedure_Heading_Icon-version-1-modificationdate-1734565407280-api-v2.PNG

复制
已复制!
            

ifconfig eth2 –promisc


VF 全多播模式

VF 可以进入全多播模式,除了最初针对 VF 的流量外,还可以接收从/发送到同一物理端口上其他功能的所有多播流量。

注意:只有特权/受信任的 VF 才能进入全多播 RX 模式。

要为 VF 启用全多播模式,请运行

Procedure_Heading_Icon-version-1-modificationdate-1734565407280-api-v2.PNG

复制
已复制!
            

ifconfig eth2 allmulti

要退出全多播模式,请运行

Procedure_Heading_Icon-version-1-modificationdate-1734565407280-api-v2.PNG

复制
已复制!
            

#ifconfig eth2 –allmulti

要卸载 SR-IOV 驱动程序,请执行以下操作

Procedure_Heading_Icon-version-1-modificationdate-1734565407280-api-v2.PNG

  1. 对于虚拟机监控程序,从所有虚拟机 (VM) 中分离所有虚拟功能 (VF),或停止使用虚拟功能的虚拟机。

    请注意,当有虚拟机使用 VF 时停止驱动程序,将导致机器挂起。

  2. 运行以下脚本。请注意,卸载驱动程序会删除整个驱动程序文件,但不会卸载驱动程序。

    复制
    已复制!
                

    [root@swl022 ~]# /usr/sbin/ofed_uninstall.sh This program will uninstall all OFED packages on your machine. Do you want to continue?[y/N]:y Running /usr/sbin/vendor_pre_uninstall.sh Removing OFED Software installations Running /bin/rpm -e --allmatches kernel-ib kernel-ib-devel libibverbs libibverbs-devel libibverbs-devel-static libibverbs-utils libmlx4 libmlx4-devel libibcm libibcm-devel libibumad libibumad-devel libibumad-static libibmad libibmad-devel libibmad-static librdmacm librdmacm-utils librdmacm-devel ibacm opensm-libs opensm-devel perftest compat-dapl compat-dapl-devel dapl dapl-devel dapl-devel-static dapl-utils srptools infiniband-diags-guest ofed-scripts opensm-devel warning: /etc/infiniband/openib.conf saved as /etc/infiniband/openib.conf.rpmsave Running /tmp/2818-ofed_vendor_post_uninstall.sh

  3. 重启服务器。

© 版权所有 2025,NVIDIA。 上次更新于 2025 年 2 月 12 日。