使用 SR-IOV I350 嵌入式交换机实现 KVM 虚拟网络——是否需要外部交换机?

使用 SR-IOV I350 嵌入式交换机实现 KVM 虚拟网络——是否需要外部交换机?

我将多个 KVM VM 连接到路由到 1Gbit 物理网络的虚拟网络。路由器使用 netfilter/iptables 过滤真实网络和虚拟网络之间的流量。对于虚拟网络交换机,我使用带 PCI 直通的 SR-IOV。与使用 Linux 桥接器相比,此设置允许更高的吞吐量(受 PCIe 带宽限制)和更低的 CPU 开销(参考:第 22-23 页Toshiaki Makita 在 2014 年日本 LinuxCon 上的演讲

我已将 Intel I350 NIC 同一端口的一个 VF 分配给每个 VM 和 KVM 主机。(每个 I350 端口最多有 7 个 VF,因此 6 个 VM + 主机是此虚拟网络的最大大小)。此设置按预期运行,除了一个令人讨厌的怪癖:只有当我使用物理跳线将关联的 I350 物理端口连接到物理外部交换机(所有其他端口都为空)时,I350 的嵌入式交换机才能工作。打开外部交换机后,虚拟网络工作正常;但当关闭外部交换机时,PF 链路状态变为“NO-CARRIER”,虚拟网络不再传递数据包。

有谁知道如何让 I350 的嵌入式开关正常工作没有物理端口上是否存在活动链路?

如果重要的话,VM 主机运行 Debian 10(Buster)。

感谢您提供的启发!

进一步说明:

  • 环回插头Smartronix SuperLooper比外部开关更简洁,并且可能可以工作。但是,根据制造商的说法,它“仅用于测试可以禁用近端串扰 (NEXT) 功能的系统”——而 I350 数据表并未提及此类功能。

  • 第 3.7.6 节I350 数据表描述了 4 种不同的支持内部环回模式。(相同的内部环回功能也存在于I210,可能还有其他英特尔芯片。)但是,我没有找到任何关于使用 Linux 工具配置 I350/I210/等以使用内部环回的信息。还不清楚激活其中一种内部环回模式是否也会激活 I350 的嵌入式交换机……?

更新:

  • 感谢@Tomek,我尝试了

    # ip link set dev eth1 vf 0 state enable
    RTNETLINK answers: Operation not supported
    

    ip link set dev eth1 vf 0 trust on确实有效,因此语法正确,驱动程序正在运行。我很好奇 igb 驱动程序或 I350 硬件是否阻止将 vf 链接状态设置为enable。查看i40e_main.c(例如),struct net_device_ops i40e_netdev_ops包含

    .ndo_set_vf_link_state  = i40e_ndo_set_vf_link_state,
    .ndo_set_vf_spoofchk    = i40e_ndo_set_vf_spoofchk,
    .ndo_set_vf_trust       = i40e_ndo_set_vf_trust,
    

    igb_main.c struct net_device_ops igb_netdev_op

    .ndo_set_vf_spoofchk    = igb_ndo_set_vf_spoofchk,
    .ndo_set_vf_trust       = igb_ndo_set_vf_trust,
    

    但缺少.ndo_set_vf_link_state。因此,它似乎igb不支持将 VF 链接状态设置为启用。I350 硬件是否可以支持此功能是另一个问题。似乎这种启用嵌入式交换机的标准方法不适用于 I350。也许还有其他方法?

  • I350 数据表发表了一些令人沮丧的言论:

    7.8.3.1 分组交换(VMDq)模型:VMDq 假设

    1. 当链路中断时,Tx 流停止,因此本地交换流量也停止。

    7.3.3.5 TX 数据包交换

    以下规则适用于环回流量:

    • 当网络链路断开时,环回将被禁用。

    鉴于英特尔 710 数据表读起来完全不同:

    表 1-7. 内部切换功能

    内部交换的运行与 LAN 端口的状态无关(即使 LAN 端口关闭)。

    越来越像是我的问题的答案是:是的,I350 确实需要连接外部交换机才能切换 VM-VM 流量。我希望有人能证明我错了!

答案1

虽然我不确定这是否适用于 I350 NIC,但我认为答案在 ip-link 手册页中:

vf NUM specify a Virtual Function device to be configured. The associated PF device
must be specified using the dev parameter.
[--cut--]
    state auto|enable|disable - set the virtual link state as seen by
    the specified VF. Setting to auto means a reflection of the PF link state,
    enable lets the VF to communicate with other VFs on this host even
    if the PF link state is down, disable causes the HW to drop any packets
    sent by the VF.

将 VF 设置stateenable应强制所有 VF 启动,而不管链接状态如何,并允许即使没有电缆也可以在它们之间切换。

相关内容