如何解决如何将绑定到 Docker 容器中的 DPDK igb_uio 驱动程序的 SR-IOV 虚拟功能彼此隔离
我最近尝试将 SR-IOV VF pci 设备绑定到 docker 容器中的 DPDK 应用程序,预期场景:每个 docker 容器运行负责一个 sriov VF 的 DPDK 应用程序。但是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 run --privileged --name="sriov_test" -v /mnt/huge:/mnt/huge -itd centos:latest
(3)绑定VF端口到igb_uio驱动
#./dpdk-devbind.py -s
使用 DPDK 兼容驱动程序的网络设备
============================================
0000:04:10.1 '82599 以太网控制器虚拟功能 10ed' drv=igb_uio 未使用=ixgbevf,vfio-pci
0000:04:10.3 '82599 以太网控制器虚拟功能 10ed' drv=igb_uio 未使用=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 插槽上的 PCI 设备 0000:04:10.1
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.3
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.5
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_ixgbe_vf
EAL:NUMA 插槽 -1 上的 PCI 设备 0000:04:10.7
EAL:无效的 NUMA 套接字,默认为 0
EAL:探针驱动程序:8086:10ed net_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 容器的 netns:ip link set xxx netns xxx,不幸的是没有用。
我在网上找了很久,没有用。请帮助或尝试提供一些想法如何实现这一点,非常感谢。
解决方法
注意:根据评论中的说明,设置对 Docker/Container 与虚拟机实例的期望。
- Docker 或容器在现有内核和硬件资源之上运行。隔离是在内核命名空间和 CPU|内存|文件访问权限中完成的
- 在虚拟机中,像 CPU|Memory|NIC(物理和虚拟设备)这样的硬件被划分为单独的实例。来宾操作系统是运行设备及其驱动程序的独立内核。主机操作系统无法访问访客设备
因此,当 DPDK 应用程序在 docker/容器内运行时,它可以像独立应用程序一样访问大页面、/dev/ 和驱动程序。必须限制对物理页面的访问设备使用 allow/block in DPDK 20.11 onwards
和 whitelist/blacklist in 20.08 and below
。
因此以下是在 container/dpdk 中运行 DPDK 的可能解决方案
- 如果 docker/container 以完全权限运行,请使用选项
-a or -b for DPDK 20.11 onwards
或-w or -b for DPDK 20.08 and below
。 - 如果 docker/container 以选定的权限运行,则使用
chown
将所有权更改为与uio_pci_generic\igb_uio
下的/dev/uio
或vfio-pci
下的 DPDK 设备绑定的所需用户帐户/dev/vfio/
。当 DPDK 在non sudo
模式下运行时,这将限制对设备的访问
注意:请首先确保在主机上以非 sudo
模式运行,然后在环境变量、大页面访问、/dev/ 中确定要进行的更改。然后在所需的名称空间下使用正确的用户启动 docker。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。