【问题标题】:Running DPDK C program without root privileges在没有 root 权限的情况下运行 DPDK C 程序
【发布时间】:2021-03-24 05:07:10
【问题描述】:

我有使用 DPDK 19.11 的 C 应用程序。目前,应用程序以 root 权限运行(使用 sudo 命令)。此外,我的应用程序正在运行大页面 (1GB)。

使用 DPDK 兼容驱动程序的网络设备:

0000:02:00.0 'Ethernet Controller X710 for 10GbE backplane 1581' 
             drv=igb_uio unused=

我想在没有 root 权限的情况下运行我的应用程序 - 摆脱“sudo”命令。 我更改了这些文件/文件夹的权限:

  • /sys/class/uio/uio*/device/resource*
  • /sys/class/uio/uio*/device/config
  • /dev/uio*
  • /dev/hugepages/*

当我在没有“sudo”的情况下运行我的应用程序时,我遇到了 rte_eal_init 函数的问题。我收到了这个错误:

EAL: FATAL: Cannot use IOVA as 'PA' since physical addresses are not available
EAL: Cannot use IOVA as 'PA' since physical addresses are not available

我的操作系统是 Ubuntu 18.04,内核 4.15.0-128-generic 我注意到在 DPDK 文档中有一条关于在没有根权限的情况下运行 DPDK 应用程序的评论 - “从 4.0 版开始,内核不允许非特权进程读取pagemaps 文件中的物理地址信息,使得这些进程无法被非特权用户使用。在这种情况下,建议使用 VFIO 驱动程序。"

阅读 cmets 后,我尝试使用 vfio-pci。 我使用以下方式加载模块:

sudo modprobe vfio-pci enable_unsafe_noiommu_mode=1

我还更改了/dev/hugepages/*/dev/vfio/* 的权限 使用 vfio-pci 和 sudo 运行成功。 在没有 sudo 的情况下运行时,我遇到了同样的错误:

EAL: FATAL: Cannot use IOVA as 'PA' since physical addresses are not available
EAL: Cannot use IOVA as 'PA' since physical addresses are not available

另请参阅:https://doc.dpdk.org/guides/linux_gsg/enable_func.html#running-dpdk-applications-without-root-privileges

我想知道是否有人有在内核 4.0 及以上版本的情况下在没有 root 的情况下运行 DPDK 应用程序的经验?

此外,另一种解决方案是启动具有 root 权限的简单 DPDK 应用程序,该应用程序将启动 DPDK。在没有root权限的情况下并行运行另一个应用程序 - 这个应用程序将消耗数据包并执行业务逻辑,这可能吗?

谢谢

【问题讨论】:

  • 我记得我在 Linux Kernal 3.94.12 上使用 DPDK 18.11 LTS 和 19.11 LTS 运行了 DPDK 应用程序。我无法找到您在此处遇到或列出的任何问题。 So have you tried running with necessary changes? 只要您使用 Huge pages,您提到的替代解决方案就不会起作用。注意:我不建议使用 syscall 隐藏或跳过 sudo 特权检查以作为 non privelleged 用户运行。
  • 您是否有任何更新,尤其是错误日志?我必须假设您已经修改了大页面权限、网卡驱动程序使用、RUNTIME 环境。所以请分享您在运行时遇到的具体错误。我还没有将票标记为insufficent details
  • 像往常一样,我注意到https://stackoverflow.com/users/13121879/useme-alehosaini 标记No Action Required。我谦虚地请求 useme-alehosain 证明为什么调试问题不需要日志和 DPDK log-level=8?正如我在第一条评论中提到的,我可以在没有 sudo 的情况下使用 DPDK 18.11 和 19.11 运行。
  • 你们那边有更新吗?

标签: dpdk


【解决方案1】:

DPDK 应该检测您是否应该使用 IOVA VA 或 PA。使用开关 enable_unsafe_noiommu_mode=1 告诉 DPDK 你没有 iommu,你将使用 IOVA PA。

问题是,在 PA 模式下运行需要 root 权限,因为您需要访问物理地址。

您引用的 dpdk.org 文档应该可以解决问题。在 20.02 版本的 docker 容器中,我能够在没有 root 权限的情况下运行 DPDK。然而,我们在 DPDK 之上运行的软件及其与大页面支持的交互存在另一个问题。

最后,我们决定仍以 root 身份运行 DPDK,但是,我们将容器的功能限制为运行 DPDK 所需的最低限度。

【讨论】:

    【解决方案2】:

    首先,检查您是否真的需要对vfio-pci 使用不安全模式是有意义的。也许您只需要在内核参数中添加intel_iommu=on iommu=pt 即可使设备安全工作,即:

    modprobe vfio-pci 
    

    到目前为止,我还没有使用过不安全模式,如果启用了不安全模式,出于(显然?)安全原因,内核甚至可能无条件地禁止 vfio 设备的映射。


    要运行 dpdk 应用程序without root privileges,您需要调整正确 vfio 设备的权限。例如,当权限看起来像这样时

    # ls -l /dev/vfio/
    total 0
    crw-------. 1 root root 235,   0 2021-08-21 15:13 17
    crw-rw-rw-. 1 root root  10, 196 2021-08-21 15:13 vfio
    

    那么/dev/vfio/17就是你绑定到dpdk的设备,所以调整它的权限如下:

    chown juser /dev/vfio/17
    

    用户进程不需要额外的权限来映射大页面。如果您为您的 dpdk 程序提供--in-memory 选项,您甚至不必安装hugetblfs。

    但是,某些大页面必须由 root 保留,例如在系统引导期间。示例:

    echo 4096 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    echo 8 >  /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
    

    除了权限,默认资源限制可能太低。特别是 memlock 的。如果在启动 dpdk 应用程序时内核日志太低:

    kernel: vfio_pin_pages_remote: RLIMIT_MEMLOCK (65536) exceeded
    

    然后 dpdk 应用程序打印:

    EAL:   cannot set up DMA remapping, error 12 (Cannot allocate memory)
    EAL:   0000:05:00.1 DMA remapping failed, error 12 (Cannot allocate memory)
    

    增加限制可以解决这个问题,例如:

    cat /etc/security/limits.d/24-memlock.conf                                         
    # memlock unit: KiB
    juerr hard memlock 16777216
    juser soft memlock 1048576
    

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多