如何将绑定到 docker 容器中的 DPDK igb_uio 驱动程序的 SR-IOV 虚拟功能相互隔离

How to isolate SR-IOV Virtual Fuctions which are bind to DPDK igb_uio driver in docker container from each other

我最近试图将 SR-IOV VF pci 设备绑定到 docker 容器中的 DPDK 应用程序,预期场景:每个 docker 容器 运行s DPDK 应用程序负责一个 sriov VF。但是 DPDK 应用程序可以看到所有 sriov VF 端口,这将导致不同的 docker 容器可以处理可能由另一个容器收费的其他 VF。

步骤是:

(1) 启用 SR-IOV 功能,Virtual Functions 设置正确
#lspci 04:10.1 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(版本 01)
04:10.3 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(版本 01)
04:10.5 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(版本 01)
04:10.7 以太网控制器:英特尔公司 82599 以太网控制器虚拟功能(版本 01)

(2) 运行 两个 docker 个容器
#docker 运行 --privileged --name="sriov_test" -v /mnt/huge:/mnt/huge -itd centos:latest

(3)绑定VF端口到igb_uio drv
#./dpdk-devbind.py -s
使用 DPDK 兼容驱动程序的网络设备
============================================
0000:04:10.1 '82599 以太网控制器虚拟功能 10ed' drv=igb_uio unused=ixgbevf,vfio-pci
0000:04:10.3 '82599 以太网控制器虚拟功能 10ed' drv=igb_uio unused=ixgbevf,vfio-pci

(4)运行 dpdk 应用程序 my_basicforwd
#./my_basicfwd -l 1 --log-level 8 -- -p 1
EAL:检测到 4 个 lcore
EAL:检测到 1 个 NUMA 节点
EAL:多进程套接字/var/run/dpdk/rte/mp_socket
EAL:在 hugepages-1048576kB 中没有报告免费的大页面
EAL:正在探索 VFIO 支持...
EAL:VFIO 支持已初始化
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:00:1f.6 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:15b7 net_e1000_em
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:04:00.0 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:10fb net_ixgbe
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:04:00.1 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:10fb net_ixgbe
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:04:10.1 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:10ednet_ixgbe_vf
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:04:10.3 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:10ednet_ixgbe_vf
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:04:10.5 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:10ednet_ixgbe_vf
EAL:NUMA 套接字 -1
上的 PCI 设备 0000:04:10.7 EAL:无效的 NUMA 套接字,默认为 0
EAL:探测驱动程序:8086:10ednet_ixgbe_vf

定时器周期 33120229810
调试 nb_ports 2
端口 0 MAC: 02 09 c0 4b b4 a7
端口 1 MAC: 02 09 c0 3c ce 0f

以上说明dpdk可以看到两个VF端口,另一个容器dpdk应用结果相同。 我试图通过以下方式将 VF 端口设置为 docker 容器的网络:ip link set xxx netns xxx,不幸的是没有用。

网上找了半天,没用。请帮助或尝试提供一些想法如何实现这一目标,非常感谢。

注意:根据评论中的说明,设置 Docker/Container 与虚拟机实例的期望值。

  • Docker 或容器 运行 在现有内核和硬件资源之上。隔离是在内核名称space 和CPU|内存|文件访问权限
  • 中完成的
  • 在虚拟机中,像CPU|内存|网卡这样的硬件(物理设备和虚拟设备)被分割成单独的实例。来宾 OS 是单独的内核,运行 将设备及其驱动程序连接起来。主机 OS 无权访问访客设备

因此,当 DPDK 应用程序 运行 在 docker/container 中时,它可以像独立应用程序一样访问大页面、/dev/ 和驱动程序。 必须使用 allow/block in DPDK 20.11 onwardswhitelist/blacklist in 20.08 and below.

限制对物理设备的访问

因此以下是 运行ning DPDK inside container/dpdk

的可能解决方案
  1. 如果 docker/container 是具有完全权限的 运行,请使用选项 -a or -b for DPDK 20.11 onwards-w or -b for DPDK 20.08 and below
  2. 如果 docker/container 是 运行 并具有选定的权限,请使用 chown 将所有权更改为在 [=16= 下与 uio_pci_generic\igb_uio 绑定的 DPDK 设备所需的用户帐户] 或 /dev/vfio/ 下的 vfio-pci。当 DPDK 为 运行 且 non sudo 模式
  3. 时,这将限制对设备的访问

注意:请首先确保在主机上以非 sudo 模式 运行,然后确定要在环境变量、大页面访问、/dev/ 中进行的更改。然后以所需的名称 space.

以正确的用户启动 docker