如何将绑定到 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 onwards
和 whitelist/blacklist in 20.08 and below
.
限制对物理设备的访问
因此以下是 运行ning DPDK inside container/dpdk
的可能解决方案
- 如果 docker/container 是具有完全权限的 运行,请使用选项
-a or -b for DPDK 20.11 onwards
或 -w or -b for DPDK 20.08 and below
。
- 如果 docker/container 是 运行 并具有选定的权限,请使用
chown
将所有权更改为在 [=16= 下与 uio_pci_generic\igb_uio
绑定的 DPDK 设备所需的用户帐户] 或 /dev/vfio/
下的 vfio-pci
。当 DPDK 为 运行 且 non sudo
模式 时,这将限制对设备的访问
注意:请首先确保在主机上以非 sudo
模式 运行,然后确定要在环境变量、大页面访问、/dev/ 中进行的更改。然后以所需的名称 space.
以正确的用户启动 docker
我最近试图将 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 onwards
和 whitelist/blacklist in 20.08 and below
.
因此以下是 运行ning DPDK inside container/dpdk
的可能解决方案- 如果 docker/container 是具有完全权限的 运行,请使用选项
-a or -b for DPDK 20.11 onwards
或-w or -b for DPDK 20.08 and below
。 - 如果 docker/container 是 运行 并具有选定的权限,请使用
chown
将所有权更改为在 [=16= 下与uio_pci_generic\igb_uio
绑定的 DPDK 设备所需的用户帐户] 或/dev/vfio/
下的vfio-pci
。当 DPDK 为 运行 且non sudo
模式 时,这将限制对设备的访问
注意:请首先确保在主机上以非 sudo
模式 运行,然后确定要在环境变量、大页面访问、/dev/ 中进行的更改。然后以所需的名称 space.