PCIE 拆分后的 SR-IOV 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
yihy8023
V2EX    NAS

PCIE 拆分后的 SR-IOV 问题

  •  
  •   yihy8023 210 天前 1871 次点击
    这是一个创建于 210 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求助大佬们,有试过 z590m 拆分 pcie 8+4+4 后,8x 接 ocp 2.0 网卡 Intel 82599ES 10G 网卡。 没办法开启 sriov ,bios sriov 、vtd 等已经打开,强行设置网卡也不 ok 。

    图片

    第 1 条附言    202 天前

    刷了 HP 的 eeprom ,可以出 sriov 了,稳定性待测试。 我这个是广达 t41s 82599es 主控的 ocp 网卡。

    root@pve:~# lspci -s 01:00.0 -v 01:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) Subsystem: Hewlett-Packard Company Ethernet 10Gb 2-port 562i Adapter Flags: bus master, fast devsel, latency 0, IRQ 16, IOMMU group 16 Memory at a0d00000 (32-bit, non-prefetchable) [size=1M] I/O ports at 7020 [size=32] Memory at a0f04000 (32-bit, non-prefetchable) [size=16K] Expansion ROM at a0e80000 [disabled] [size=512K] Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Capabilities: [70] MSI-X: Enable+ Count=64 Masked- Capabilities: [a0] Express Endpoint, MSI 00 Capabilities: [e0] Vital Product Data Capabilities: [100] Advanced Error Reporting Capabilities: [140] Device Serial Number 70-00-00-ff-ff-00-20-00 Capabilities: [150] Alternative Routing-ID Interpretation (ARI) Capabilities: [160] Single Root I/O Virtualization (SR-IOV) Kernel driver in use: ixgbe Kernel modules: ixgbe 

    参考了 这个帖子,https://www.chiphell.com/forum.php?mod=redirect&goto=findpost&ptid=2531720&pid=53038473

    0324更新

    不知怎么搞的,重启了设备后可能出现能识别网卡,但是没协商速度的情况,使用的aoc网线。重启后也不行,必须给网卡断电。有试过把这卡直通给win11,同样也是没连接状态。

    买了两个intel的模块准备在上面测试,但它到得比cx4网卡晚,也不需要了。

    目前换了张cx4网卡,插上直接能用,已经稳定用了两天了。

    这个问题在没刷写网卡前也存在。现在猜测intel这张卡是不会是因为没在pve界面上启用,我在cli中有使用 ifupethtool等操作。当前我已经不想再排查它的问题。

    10 条回复    2025-03-20 10:40:43 +08:00
    kyonn
        1
    kyonn  
       210 天前   1
    这是之前搞 I350 SRIOV 时的记录, 供你参考. 我的建议是没啥特殊需求, 老老实实用网桥转发就行了, SRIOV 依赖特殊网卡和宿主机的 PCIE 桥, 维护起来太麻烦(尤其是迁移机器时, 还要挑平台), 而且还有跟宿主机网桥之间的互通问题, 那么些效率提升不值当, 除非是专门的虚拟机集群.



    ### sr-iov 理论基础

    - [SR-IOV在私有云环境中的应用与实践_weixin_30265103 的博客-CSDN 博客]( https://blog.csdn.net/weixin_30265103/article/details/99916338)
    - [Why using Single Root I/O Virtualization (SR-IOV) can help improve I/O performance and Reduce Costs]( https://www.design-reuse.com/articles/32998/single-root-i-o-virtualization.html)

    ### iommu group 分组查看

    ```BASH
    #!/bin/bash
    for d in $(find /sys/kernel/iommu_groups/ -type l | sort -n -k5 -t/); do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
    done;
    ```



    ### PCI 设备直通

    1. BIOS 开启 vt-d.

    2. linux 内核开启 iommu 和 passthrough.

    ```BASH
    # 编辑 grub 文件, 添加内核启动参数.
    # bios 没有 sr-iov 功能时必须添加 pci=assign-busses pci=realloc, 强制要求内核重新分配 PCI 空间
    # 否则在启用 VF 时会出现 write error: Cannot allocate memory 报错
    sudo vi /etc/default/grub
    GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt pci=assign-busses pci=realloc"

    # 根据新 grub 文件重新生成 initrd.img
    sudo update-grub

    sudo reboot
    ```

    3. 检查 iommu 分组, 确保 i350 4 个网卡处于不同分组.

    ```BASH
    #!/bin/bash
    # 查看 iommu 分组

    for d in $(find /sys/kernel/iommu_groups/ -type l | sort -n -k5 -t/); do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
    done;
    ```

    4. 如果 4 个网卡处于同一分组, 查看网卡 upstream 的 PCIE 桥的能力, 它可能没有 acs 能力.

    ```BASH
    # 假如 01:00.0 是其中一个 i350 网卡, 查看其 PCIE 能力, 会打印 Capabilities: [1d0 v1] Access Control Services
    sudo lspci -vvv -s 01:00.0 | grep "Access Control"

    # 假如 00:01.0 是 i350 upstream 的 PCIE 桥, 查看其 PCIE 能力, 不会打印任何内容
    # 因为大部分 intel PCIE bridge 不支持 ACS, 这时候需要打 ACS override patch
    # ACS 补丁没有进入 linux 内核 upstream, 原因参考
    # [LKML: Alex Williamson: Re: [PATCH] pci: Enable overrides for missing ACS capabilities]
    # ( https://lkml.org/lkml/2013/6/18/738)
    sudo lspci -vvv -s 00:01.0 | grep "Access Control"
    ```

    5. 打 ACS 补丁需要修改 grub 和 kernel.

    - 标准内核不支持 ACS 补丁, 需要自己重新编译内核并安装. Debian OS 参考 `debian/内核编译.md` .
    - 部分非标准 Linux 发行版可能已经打上 ACS 补丁, 比如 Proxmox, OMV.
    - 内核代码支持 ACS 功能后增加 grub pcie_acs_override 参数, 参考下面.

    ```BASH
    # 继续修改 grub, 增加 pcie_acs_override 参数
    # pcie_acs_override 参数有几种写法:
    # 写法 1: pcie_acs_override=id:[vendor/device IDs]
    # 写法 2: pcie_acs_override=downstream,multifunction
    # 第 2 种写法会强行将所有 downstream 和 mutilfunction PCIE 分组, 建议使用第 1 种写法只对目标 PCIE 设备分组
    # 下面的命令中增加了 pcie_acs_override=id:8086:1901 参数, 8086:1901 是 i350 upstream 的 PCIE bridge 的 id
    sudo vi /etc/default/grub
    GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt pci=assign-busses pci=realloc pcie_acs_override=id:8086:1901"

    # 根据新 grub 文件重新生成 initrd.img
    sudo update-grub

    # 重启
    sudo reboot
    ```

    6. 验证 i350 VF 功能是否可用, **建议用第一种方法**.

    - 第一种方法: 针对 4 个 i350 网卡单独设置 VF 数量.

    ```bash
    # 查看一个网卡最多支持的 VF 数量
    cat /sys/class/net/enp1s0f0/device/sriov_totalvfs

    # enp1s0f0 是要设置的 i350 网卡设备名, 重启丢失. 其他 3 个 i350网卡设置方法相同
    echo 7 > /sys/class/net/enp1s0f0/device/sriov_numvfs

    # 下面两个命令应该能看到新增加的 VF 网卡
    # 因为此时还未屏蔽 VF 网卡驱动 igbvf, ip a 命令能直接看到加载驱动后的 VF 网卡
    # 如果后续屏蔽了主机的 igbvf 驱动, 则只有 ip l 命令能看到没加载驱动的 VF 网卡信息
    ip a
    ip l
    ```

    - 第二种方法: 支持直接设置 igb 驱动加载参数, 让 4 个 i350 网卡全部启用 N 个 VFs.

    ```BASH
    # 如果不知道 i350 驱动名字, 可以通过下面命令查看
    ethtool -i enp1s0f0 | grep ^driver

    # 设置 igb 驱动启用加载参数, 需要重新生成 initrd, 重启永久生效
    echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.conf
    sudo depmod -ae
    sudo update-initramfs -u
    sudo reboot

    # 卸载驱动重新加载, VF 个数设置为 7, 重启丢失
    modprobe -r igb
    modprobe igb max_vfs=7
    ```

    7. 为了让单独针对 i350 4 个网卡的 VF 设置永久生效, 又有两种办法.

    - 第一种办法: 使用 systemd service 开机自动调用 echo 命令.
    创建 SR-IOV 配置脚本并**添加可执行权限**: `sudo vi /usr/local/bin/cfg_sriov.sh`.

    ```BASH
    #!/bin/bash

    echo 1 > /sys/class/net/enp1s0f0/device/sriov_numvfs
    echo 1 > /sys/class/net/enp1s0f1/device/sriov_numvfs
    echo 4 > /sys/class/net/enp1s0f2/device/sriov_numvfs
    echo 7 > /sys/class/net/enp1s0f3/device/sriov_numvfs

    echo "config igb vf function ok ..."
    ```

    将配置脚本加入 systemd 启动: `sudo systemctl edit --force --full sriov` .

    ```BASH
    [Unit]
    Description=config VF for sr-iov
    After=networking.service NetworkManager.service
    Before=libvirtd.service

    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/cfg_sriov.sh

    [Install]
    WantedBy=multi-user.target
    ```

    启动服务.

    ```BASH
    sudo chmod +x /usr/local/bin/cfg_sriov.sh
    sudo systemctl daemon-reload
    sudo systemctl enable sriov
    sudo systemctl start sriov
    ip l
    ```

    - 第二种办法: 使用 udev 规则. **注意!!!! 暂时还未成功, 下面的规则针对所有 igb 驱动网卡, 没有指定某个网口.**

    为每个 i350 网卡增加 udev 规则: `sudo vim /etc/udev/rules.d/70-sriov-net.rules` .

    ```BASH
    ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="igb", ATTR{device/sriov_numvfs}="7"
    ```

    设置 udev 规则立即生效.

    ```BASH
    # 可能需要插拔网线, 实在不行就重启设备
    sudo udevadm control --reload-rules && sudo udevadm trigger
    ```

    8. 通过前面的步骤 VF 网卡设备已生成. 在分配 VF 给 VM 使用前还需要屏蔽宿主机的 VF 网卡驱动, 否则 VF 设备会被宿主机占用.

    ```BASH
    # 新增驱动加载文件 sriov-blacklist.conf, 屏蔽 VF 网卡驱动 igbvf
    # 可以发现 VF 网卡驱动名字一般是开启 SR-IOV 功能之前的网卡驱动名加上"vf"
    # 比如 x710 万兆网卡驱动名是 i40e, 对应 VF 网卡驱动名是 i40evf
    sudo vi /lib/modprobe.d/sriov-blacklist.conf
    blacklist igbvf

    sudo reboot

    # 重启后 ip a 命令已不再能看到 VF 网卡, 因为驱动没有加载
    # ip l 命令还能看到每个 PF 下有若干 VF 设备, mac 地址可能都是 FF 或 0
    ip a
    ip l
    ```

    9.
    billccn
        2
    billccn  
       210 天前   1
    你 lspci 输出里没有 ARI 所以是不可能开 SR-IOV ,你要先确保网卡固件支持 SR-IOV 然后 BIOS 里打开 ARI 。
    plko345
        3
    plko345  
       210 天前
    Linux 下用 Windows 虚拟机能用 sriov 吗? 我在 WindowsServer2022 上的 hyperv 只能支持 Windows Server 虚拟机用 SRIOV, 其它的专业版家庭版全都不行, 查了下就是不支持, 不知道为什么要做这种限制
    kyonn
        4
    kyonn  
       210 天前 via Android
    @plko345 没问题,linux kvm 之前搞个 sriov ,windows 虚拟机随便哪个版本都行
    yihy8023
        5
    yihy8023  
    OP
       209 天前
    @kyonn 感谢,不过操作下来还是不行。今天升级了网卡的固件,还没解决。刚找到头绪了需要刷 eeprom 。
    yihy8023
        6
    yihy8023  
    OP
       209 天前
    @billccn 感谢,刚找到帖子 x520da2 丢失 sriov 。应该是 eeprom 的问题,待我明天刷个 hpe 的 eeprom 试试。
    kyonn
        7
    kyonn  
       208 天前
    @yihy8023 预祝成功, 另外 SRIOV 有 2 个小坑, 提前说下.

    1. sriov 虚拟的 VF 网卡没办法直接跟宿主机的 桥接网卡互通, 解决办法参考:
    https://www.chiphell.com/thread-2630794-1-1.html

    2. sriov 使用的物理网卡必须接网线到交换机或另一台实体机上, 才能激活 VF 虚拟网卡, 不然内部的 VF 之间不互通. 举个例子, 起了 2 个虚拟机分配了 2 个 VF, 设置了静态 ip, 这两台虚拟机是无法互通的, 除非把物理网卡接交换机. 之前有次调试忘记接网线了, 死活不通, 定位了好久, 本来以为都是内部的虚拟网卡, 外部网线接不接没影响.
    yihy8023
        8
    yihy8023  
    OP
       208 天前
    @kyonn #7 刚刚远程把网卡给刷了 eeprom ,重启后机器失联,可能是 PCIE 端口号变更导致的变动导致的。忘了提前把外挂 KVM 搞上去了,等晚上回去看看。
    yihy8023
        9
    yihy8023  
    OP
       208 天前
    @kyonn @billccn 搞定了,刷了 HP 的 eeprom ,可以出 sriov 了,稳定性待测试。
    我这个是广达 t41s 82599es 主控的 ocp 网卡。

    ```bash
    root@pve:~# lspci -s 01:00.0 -v
    01:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
    Subsystem: Hewlett-Packard Company Ethernet 10Gb 2-port 562i Adapter
    Flags: bus master, fast devsel, latency 0, IRQ 16, IOMMU group 16
    Memory at a0d00000 (32-bit, non-prefetchable) [size=1M]
    I/O ports at 7020 [size=32]
    Memory at a0f04000 (32-bit, non-prefetchable) [size=16K]
    Expansion ROM at a0e80000 [disabled] [size=512K]
    Capabilities: [40] Power Management version 3
    Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+
    Capabilities: [70] MSI-X: Enable+ Count=64 Masked-
    Capabilities: [a0] Express Endpoint, MSI 00
    Capabilities: [e0] Vital Product Data
    Capabilities: [100] Advanced Error Reporting
    Capabilities: [140] Device Serial Number 70-00-00-ff-ff-00-20-00
    Capabilities: [150] Alternative Routing-ID Interpretation (ARI)
    Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
    Kernel driver in use: ixgbe
    Kernel modules: ixgbe
    ```

    参考了 这个帖子,https://www.chiphell.com/forum.php?mod=redirect&goto=findpost&ptid=2531720&pid=53038473
    kyonn
        10
    kyonn  
       206 天前
    @yihy8023 恭喜.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2214 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 16:08 PVG 00:08 LAX 09:08 JFK 12:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86