我正在尝试在非特权 Docker 容器中运行 DPDK。虽然我可以限制容器的权限并将容器指定为非特权容器,但我仍然需要以 root 身份运行 dpdk 应用程序(例如 testpmd)。我还可以以非 root 身份运行容器并使用 sudo 启动 testpmd。
我想知道是否有人能够在 docker 容器内以非 root 用户身份运行 dpdk(没有 --no-huge 选项)。如果是,是否需要授予某些特权或权限?
UPDATED:
我正在使用 DPDK 20.02。我想我已经将问题范围缩小到了 ulimit -l 设置。
来自 testpmd:EAL:无法设置 DMA 重新映射,错误 12(无法分配内存)
来自 Dmesgdmesg:[5697911.199003] vfio_pin_pages_remote:超出RLIMIT_MEMLOCK(65536)。
回复维平:
您需要调整容器的限制吗?如果是这样怎么办?
我正在使用 helm 来部署 pod,所以我不确定是否可以修改 docker run 命令,看起来我需要在主机上编辑 /etc/security/limits.conf 并重新部署。
另外,你用什么来授予 fs 的所有权?使用非特权容器不会妨碍您吗?为了测试,我只是 sudo 它,但最终我希望能够删除 SETUID/SETGID。
我们可以使用非root用户在主机上或docker内部运行DPDK。
以非 root 用户身份运行 DPDK
- 创建或选择没有root权限的用户
- 将对 RUNTIME 目录值的访问权限设置为
export XDG_RUNTIME_DIR=/tmp
(因为所有用户都可以访问 tmp 文件夹并且在某些发行版上/var/run
可能无法访问
- 将大页面挂载到类似的文件夹
mkdir -p /tmp/mnt/huge; mount -t hugetlbfs nodev /tmp/mnt/huge
- 将所有权分配给用户以访问大页面,如下所示
chown -R [non-root user]:[non-root user] /tmp/mnt/huge
- 如果需要访问设备,请使用 iommu 或 no-iommu 驱动程序进行检查
lsmod | grep vfio
- 更改设备的所有权
chown -R [non-root user]:[non-root user] /dev/vfio/[device id]
- 用户 DPDK rte_eal_init 选项
--huge-dir
Ø 指向/tmp/mnt/huge
- 即使在步骤 7 之后,某些 PMD 也可能会失败,对于那些使用选项的人
--legacy-mem
这解决了问题。
为了在 Docker 中运行 DPDK 应用程序,还需要解决一些问题
- 使用 DPDK 19.11 LTS 或更高版本(有与 docker、命名空间、内存限制相关的补丁)
- 某些 SE 策略 (Linux) 不允许共享大页面,因此使用选项
--in-memory
禁用 MMAP 到大页面的共享(这应该可以避免大多数问题)。
注:假设
- docker 上只能运行一个应用程序
- 正如评论中提到的
--privileged -v /sys/bus/pci/drivers:/sys/bus/pci/drivers -v /sys/kernel/mm/hugepages:/sys/kernel/mm/hugepages -v /sys/devices/system/node:/sys/devices/system/node -v /dev:/dev
用于在 docker 中以 sudo 权限运行 DPDk。
- 我根据问题假设
ulimit -c unlimited
也无法执行。
- 如果有多个 docker 运行 dpdk 应用程序,则始终使用
--file-prefix
区分。
- 我还没有在 DPDK 21.02、21.05、21.08 上尝试过这个
[EDIT-1] 之前被删除的问题是以非 root 身份运行 DPDK https://stackoverflow.com/questions/64664141/running-dpdk-without-root-permisions/64666019#64666019
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)