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

fmy*_*yhr 8 networking virtualization debian linux-networking kvm-virtualization

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

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

有谁知道如何让 I350 的嵌入式交换机在物理端口上没有活动链接的情况下正常工作?

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

感谢您提供的任何光线!

补充说明:

  • Smartronix SuperLooper这样的环回插头不会像外部开关那样笨重,并且可能会起作用。然而,根据制造商的说法,它“仅用于测试可以禁用近端串扰 (NEXT) 功能的系统”——而 I350 数据表并未提及此类功能。

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

更新:

  • 感谢@Tomek,我试过了

    # ip link set dev eth1 vf 0 state enable
    RTNETLINK answers: Operation not supported
    
    Run Code Online (Sandbox Code Playgroud)

    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,
    
    Run Code Online (Sandbox Code Playgroud)

    而在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,
    
    Run Code Online (Sandbox Code Playgroud)

    却不见了.ndo_set_vf_link_state。所以看起来igb不支持将 VF 链接状态设置为启用。I350的硬件能否支持这个功能是另一个问题。似乎这种启用嵌入式开关的标准方法不适用于 I350。也许还有其他方法?

  • I350数据表使得一些阻碍语句:

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

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

    7.3.3.5 TX 数据包交换

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

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

    Intel 710 数据表的读法却大不相同:

    表 1-7。内部开关特性

    内部交换独立于 LAN 端口的状态运行(在 LAN 端口关闭时也是如此)。

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

Tom*_*mek 6

虽然我不确定这是否适用于 I350 网卡,但我认为答案在 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.
Run Code Online (Sandbox Code Playgroud)

无论链路状态如何,将 VF 设置stateenable都应该强制所有VF ,并且即使没有电缆也允许在它们之间进行切换。