dpdk报错/lib64/libibverbs.so.1: version `IBVERBS_1.8' not found (required by /usr/local/lib64/dpdk/pmds-21.0/librte_net_mlx4.so.21.0)解决方法

问题出现的原因:启动的程序需要dpdk,因为不是root用户,调用dodk的程序时报错:

EAL: Error creating '/run/user/0/dpdk': Permission denied
EAL: Cannot create runtime directory
一开始解决的方法是在绑定网卡的时候,/usr/local/sbin/bindnet.sh -vb  ,绑定的时候给与普通用户使用的权限,普通用户也能使用。

但是后面发现过了个周末,又出现上面的报错,想着来回改麻烦,就想着直接解决权限问题,网上查找了多个后,按照一个看着最类似的方式:

1、将用户添加到dpdk组中,然后重新登录:
    sudo usermod -a -G dpdk <username>
2、修改目录权限:
    sudo chmod 777 /run/user/0/dpdk
3、将DPDK运行目录更改为用户有权限的目录:
    export XDG_RUNTIME_DIR=/tmp/dpdk

然后普通用户启动不了,切到root账户也不行了,当时想到的最粗暴的方法:重装dpdk(公司给的有安装包,能脚本一键安装),重装后问题来了

报错: 

/lib64/libibverbs.so.1: version `IBVERBS_1.8' not found (required by /usr/local/lib64/dpdk/pmds-21.0/librte_net_mlx4.so.21.0)

一开始我认为是我前面操作时,自定义的环境变量,使dpdk程序无法识别正确的路径从而报错,但删除自定义的环境变量后,还是报错。

看报错,一开始我的理解,是把这个报错分为三部分:

  (1) libibverbs.so.1 

  (2) BVERBS_1.8

  (3) ibrte_net_mlx4.so.21.0

libibverbs.so.1  ibrte_net_mlx4.so.21.0 直接用ll 路径能找到,我就理所当然的认为这两个部分没有问题,是 BVERBS_1.8 的问题,加上还不熟悉这个东西,就直接上网搜 BVERBS_1.8,看到底是哪里出问题 。因为是dpdk更底层的东西,根本不知道如何找资源,更别说下载了,一直找不到解决的头绪,直到第二天找到了一个部署nginx报错的例子,看了人家的解释,才发现是我一开始理解的方法就不对。上面的报错不是我理解的三部分,而是两部分

  (1)libibverbs.so.1: version `IBVERBS_1.8' 

  (2)librte_net_mlx4.so.21.0

libibverbs.so.1: version `IBVERBS_1.8'  应该理解为:libibverbs.so.1 库中的某个版本: IBVERBS_1.8 ,不是我一开始理解的 三个是独立分开,依次调用的关系。
去解决:

objdump -tT  libibverbs.so.1  |grep IBVERBS_1.8  ,库里没IBVERBS_1.8 这个版本,而且发现 libibverbs.so.1 是个软链接,找到原始文件 libibverbs.so.1.8.28.0

,发现其大小竟然是0,当时真想给自己两个嘴巴子,这么简单的一个问题都没发现。网上找不到资源,就去其他机器上copy了不同的版本过来,建立软链接链,

启动后,又报错

EAL: /lib64/libibverbs.so.1: version `IBVERBS_PRIVATE_22' not found (required by /lib64/libmlx4.so.1)

按上面说的分为两部分分析,先检查IBVERBS_PRIVATE_22,发现库里带的是IBVERBS_PRIVATE_25,这时我也不确定是哪里出问题了,就到copy的机器上

做个对比,发现其机器上也是IBVERBS_PRIVATE_25 ,就去检查 libmlx4.so.1,发现他们用的库版本不一致。我想了下,意识到是我虽然更换

libibverbs.so.1.8.28.0库,但是其它依赖调用的库:libmlx4.so.1 还是上个版本的和这版本不匹配从而造成的报错,替换后的效果

libmlx4.so.1 -> libmlx4.so.1.0.28.0
libmlx4.so.1.0.22.4_old
ibmlx4.so.1.0.28.0

再启动脚本,又报错

EAL: /lib64/libmlx5.so.1: version `MLX5_1.12' not found (required by /usr/local/lib64/dpdk/pmds-21.0/librte_common_mlx5.so.21.0)

不用想,估计和上面报错应该是一致,也替换了,再启动程序,root账户ok,切换到普通用户,启动,和最开始报错一样。但是改了上面几个报错后,在看这个时心态就不一样,不像一开始那样急躁的不去先检查一下,而是直接去网上找现成的。

先在普通用户下,查看: ll /run/user/0 ,没有dpdk这个目录,我就进入到  /run/user/0 下,ll 后,发先0这个目录是root用户创建的,且权限只有:读,然后直接更改为:777,再启动脚本,又报错:

EAL: failed to open directory /usr/local/lib64/dpdk/pmds-21.0: Permission denied
EAL: Cannot init plugin directory /usr/local/lib64/dpdk/pmds-21.0

是启动dpdk目录没权限,直接把权限从:700 改为:777,再去启动,又报错:

 failed. msg: Permission denied ignored

想到了前面看到的一个解释:

$XDG_RUNTIME_DIR
$XDG_RUNTIME_DIR 定义了应存储用户特定的非重要性运行时文件和一些其他文件对象。
使用场景:套接字 (socket)、命名管道 (named pipes) 等。该目录必须由用户拥有,并且该用户必须是唯一具有读写访问权限的。目录的 Unix 访问模式必须是 0700。
应该是给的权限太大了,其他用户不该有 写操作,就该为755,在执行,ok,到此,程序可以正常启动。只能说一开始的方法,缺少几步关键的步骤。

推荐一个链接,就我参考的那篇文章,人家的结题思路非常nice

https://blog.csdn.net/zyxinside/article/details/125235862

posted on 2024-04-15 18:02  如尘如水  阅读(221)  评论(0编辑  收藏  举报