【问题标题】:Can you run DPDK in a non-privileged container as as non-root user?您能否以非 root 用户身份在非特权容器中运行 DPDK?
【发布时间】:2021-03-10 19:53:30
【问题描述】:

我正在尝试在非特权 docker 容器中运行 DPDK。虽然我可以限制容器的权限并将容器指定为非特权,但我仍然需要以 root 身份运行 dpdk 应用程序(比如 testpmd)。我也可以以非 root 身份运行容器并使用 sudo 启动 testpmd。

我想知道是否有人能够在 docker 容器内以非 root 用户身份运行 dpdk(没有 --no-huge 选项)。如果有,是否需要授予某些特权或权限?

更新:

我正在使用 DPDK 20.02。我想我已经将问题缩小到 ulimit -l 设置。

来自 testpmd: EAL:无法设置 DMA 重新映射,错误 12(无法分配内存)

来自 Dmesg dmesg:[5697911.199003] vfio_pin_pages_remote:超出 RLIMIT_MEMLOCK (65536)。

回应维平:

您是否需要调整容器的限制?如果是这样怎么办? 我正在使用 helm 部署 pod,所以我不确定是否可以修改 docker run 命令,看来我需要在主机上编辑 /etc/security/limits.conf 并重新部署。

另外,你用什么来赋予 fs 的所有权?没有非特权容器会阻止您吗?为了测试,我只是 sudo 它,但最终我希望能够删除 SETUID/SETGID。

【问题讨论】:

  • 使用 DPDK 18.11 和 19.11.3 LTS 我可以在主机上以非 root 用户运行。 Insdie 容器我必须以非 root 身份授予大页面和 vfio 设备的所有权。能否分享一下 DPDK 版本、操作系统、错误详情
  • 感谢分享 DPDK 版本的更新和观察。看起来你的问题有两个部分。 1)在非特权模式下运行 DPDK 的最低设置是什么,以及 2)在非特权模式下运行 docker 需要做的最低设置是什么? If the question is related to DPDK 然后您需要先寻址Error creating '/run/user/0/dpdk': Permission denied,然后是EAL: rte_service_init() failed,然后是EAL: FATAL: Cannot get hugepage informatio。你能分享你所面临的错误的日志吗?
  • 您能分享您所面临问题的最新情况吗?如果你已经能够在主机上以非特权模式运行,你只需要允许在 docker 中允许文件访问权限,以正确的文件夹在容器内运行。
  • @JerenyBrown 基于您的编辑 I just sudo itI think I've narrowed down the problem to a ulimit -l setting。这是否意味着 Docker run command is executed with non rootDPDK application is run with root privellege 在 docker 图像内?如果是,您能否首先确保主机上的 DPDK 应用程序以非 root 身份运行。然后在docker内部运行相同的。这就是我为使其在 18.11 LTS 上运行所做的工作
  • @VipinVarghese 好吧.. 我实际上使用 helm 来部署 pod,因为联邦有些参与。 docker run 没有向我公开,但如果是,则 helm 命令以 root 身份在主节点上运行。我之前尝试在 /etc/security/limits.conf 中的节点上更改该限制(并重新启动),但它似乎没有像我预期的那样在容器中进行修改。不过这是个好主意,我看看 dpdk 是否在节点上以非 root 身份运行。

标签: docker dpdk


【解决方案1】:

我们可以使用非 root 用户在 Host 或 docker 内部运行 DPDK。

以非 root 用户身份运行 DPDK

  1. 创建或选择没有 root 权限的用户
  2. 将 RUNTIME 目录值的访问权限设置为 export XDG_RUNTIME_DIR=/tmp(因为所有用户都可以访问 tmp 文件夹,并且在某些发行版上 /var/run 可能无法访问
  3. 将大页面挂载到类似文件夹mkdir -p /tmp/mnt/huge; mount -t hugetlbfs nodev /tmp/mnt/huge
  4. 将所有权分配给用户以访问大页面chown -R [non-root user]:[non-root user] /tmp/mnt/huge
  5. 如果需要访问设备,请使用lsmod | grep vfio 使用 iommu 或 no-iommu 驱动程序进行检查
  6. 更改设备的所有权chown -R [non-root user]:[non-root user] /dev/vfio/[device id]
  7. 用户 DPDK rte_eal_init 选项 --huge-dir o 指向/tmp/mnt/huge
  8. Certian PMD 即使在第 7 步之后也可能会失败,对于那些使用选项 --legacy-mem 的人来说,这可以解决问题。

为了在 docker 中运行 DPDK 应用程序,需要解决更多问题

  1. 使用 19.11 LTS 或更高版本的 DPDK(有与 docker、命名空间、内存限制相关的补丁)
  2. 某些 SE 策略 (Linux) 不允许共享大页面,因此请使用选项 --in-memory 禁用将 MMAP 共享到大页面(这应该可以避免大部分问题)。

注意:假设

  1. 在 docker 上只能运行一个应用程序
  2. 如 cmets 中所述,--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 用于在具有 sudo 权限的 docker 中运行 DPDk。
  3. 我假设基于问题ulimit -c unlimited 也不能执行。
  4. 如果有多个 docker 运行 dpdk 应用程序总是使用--file-prefix 来区分。
  5. 我没有在 DPDK 21.02、21.05、21.08 中尝试过这个

[EDIT-1] 之前被删除的问题是running DPDK as non root

【讨论】:

  • 刚刚注意到具有相同细节的旧帖子已被删除,因此使用此问题来定义如何以非 root 身份运行 DPDK 应用程序以及如何在 docker 中运行非 root 用户。
猜你喜欢
  • 2020-12-19
  • 2018-06-18
  • 2017-07-08
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2020-11-16
相关资源
最近更新 更多