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

如何解决如何将绑定到 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 onwardswhitelist/blacklist in 20.08 and below

因此以下是在 container/dpdk 中运行 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 将所有权更改为与 uio_pci_generic\igb_uio 下的 /dev/uiovfio-pci 下的 DPDK 设备绑定的所需用户帐户/dev/vfio/。当 DPDK 在 non sudo 模式下运行时,这将限制对设备的访问

注意:请首先确保在主机上以非 sudo 模式运行,然后在环境变量、大页面访问、/dev/ 中确定要进行的更改。然后在所需的名称空间下使用正确的用户启动 docker。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-