自动化编译dpdk

dpdk版本、网卡驱动版本、网卡固件版本、网卡型号之间有着强依赖的关系。特别是一些新网卡,容易出现一些版本不匹配的问题。我们可以先通过ethtool -i eth0命令和lspci -vvv -s [bus-info] | grep -i product命令来查看网卡的型号和固件版本。然后到mlx官网查看ofed各版本支持的网卡型号,如ofed-5.0只支持较低版本的cx6 dx固件。在这里插入图片描述
对于cx6 dx网卡,建议还是使用ofed-5.4版本,不然可能会出现各种各样的问题。确定好ofed版本之后,再去dpdk官网确定dpdk版本即可。特别需要注意的是dpdk-19.11开始支持cx6 dx网卡,所以如果用小于19.11的版本部署在cx6网卡上,dpdk将无法接管网卡。在这里插入图片描述
所以理论上,cx6 dx网卡搭配ofed-5.4和dpdk19.11就可以了,但是实际上咨询过mlx官方人员,建议ofed-5.4搭配dpdk-20.11使用,可能是19.11有一些bug吧。dpdk-20.11编译方式跟之前的版本差别挺大的,20.11编译需要使用meson和ninja,meson需要python3.5以上的版本,3.7当然也可以,我准备使用python3.7,由于线上环境复杂,我想实现一个自动化脚本,可以从python3开始自动化编译dpdk,实现过程中遇到了很多坑,在这里记录一下。

  1. 编译python3.7.8之后,使用pip3会报pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available,原因是python3.7和低版本的openssl不兼容,需要更新openssl到1.1以上
  2. 安装新版本的openssl后,执行openssl version报version `OPENSSL_1_1_1’ not found (required by openssl),原因是openssl动态库找不到了,需要将LD_LIBRARY_PATH重新指向新编译的openssl库。
  3. 编译python3.7之前,需要安装apt-get install libffi-dev,否则python3后面使用的时候会报No module named ‘_ctypes’ when using Value from module multiprocessing
#! /bin/bash
set -x

DPDK_VERSION=20.11.1

HOME_DIR=/root/
DPDK_XZ=dpdk-${DPDK_VERSION}.tar.xz
DPDK_TAR=dpdk-${DPDK_VERSION}.tar
DPDK_DIR=dpdk-stable-${DPDK_VERSION}

OPENSSL_TAR=OpenSSL_1_1_1d.tar.gz
OPENSSL_DIR=openssl-OpenSSL_1_1_1d

PY3_VERSION=3.7.8
PY3_XZ=Python-${PY3_VERSION}.tar.xz
PY3_TAR=Python-${PY3_VERSION}.tar
PY3_DIR=Python-${PY3_VERSION}

log_path="/var/log/build.log"

function logger() {
   
   
    local msg=$1
    local DATE=`date +"%F %T"`
    echo -e "[DPDK] ${DATE}: ${msg}" >> ${log_path}
    echo "[DPDK] ${DATE}: ${msg}"
}

function download_pkg() {
   
   
	# 可以把安装包上传到公司内部的存储服务器上
}

function install_openssl() {
   
   
### 如何在使用 Meson 编译 DPDK 时处理或设置 `-rpath` 相关问题 当使用 Meson 构建工具编译 DPDK(Data Plane Development Kit)时,动态链接库路径可以通过配置运行时搜索路径(即 `-rpath` 参数)来实现更灵活的部署环境。以下是关于如何在 Meson 中设置 `-rpath` 的解决方案。 #### 使用 `--wrap-mode=nofallback` 和自定义脚本 Meson 提供了一个选项用于控制构建过程中的依赖项解析方式。通过启用 `--wrap-mode=nofallback` 可以强制 Meson 不自动回退到系统默认路径寻找依赖项[^1]。这有助于开发者手动指定所需的动态库路径。 为了进一步优化动态库加载行为,在构建过程中可以显式传递 `-Wl,-rpath,<custom_path>` 给链接器。此操作可通过修改项目的 `meson.build` 文件完成: ```meson project('example', 'c') # 添加 linker_args 来设置 rpath executable('myapp', 'main.c', link_args : ['-Wl,-rpath,/usr/local/lib/dpdk'], dependencies : [dependency('dpdk')]) ``` 上述代码片段展示了如何向链接阶段添加额外参数以设定特定目录作为运行期共享对象文件查找位置之一[^2]。 #### 修改环境变量 LD_LIBRARY_PATH 另一种方法是在执行程序之前调整操作系统级别的共享库搜索顺序。具体做法是临时或者永久性地更新 `$LD_LIBRARY_PATH` 环境变量值,使其包含DPDK安装后的.so文件所在的位置: ```bash export LD_LIBRARY_PATH=/path/to/your/dpdk/libs:$LD_LIBRARY_PATH ./your_executable ``` 这种方法无需更改源码即可生效,适合快速测试不同版本间的兼容情况或是解决某些特殊场景下的找不到符号错误等问题[^3]。 #### 自动化集成至CI流程中 对于持续集成(CI)管道而言,建议将这些定制化的编译标志封装成易于维护的形式比如Makefile目标或者是shell函数调用等形式以便于长期支持以及跨平台移植需求. 例如创建一个名为build_with_rpath.sh 脚本来简化命令行输入复杂度: ```bash #!/bin/bash set -euxo pipefail MESON_OPTIONS="--prefix=$PREFIX --libdir=lib" EXTRA_LDFLAGS="-Wl,-rpath,$PREFIX/lib" meson setup builddir $MESON_OPTIONS \ -Dextra_ldflags="$EXTRA_LDFLAGS" .. ninja -C builddir install ``` 这样不仅保持了清晰可读性强而且也方便后续扩展其他功能特性[^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值