Ubuntu22.04运行DPDK-19.11.14报RTE_RING tailq已注册panic
解决DPDK-19.11.14在Ubuntu22.04下运行ethtools/testpmd时的
RTE_RING tailq初始化panic 问题描述
在Ubuntu 22.04上运行DPDK-19.11.14的ethtools示例或dpdk-testpmd时,触发如下panic:
EAL: Detected 4 lcore(s) EAL: Detected 1 NUMA nodes EAL: RTE_RING tailq is already registered PANIC in tailqinitfn_rte_ring_tailq(): Cannot initialize tailq: RTE_RING ... Aborted (core dumped)
但helloworld示例可正常运行。
报错原因
核心问题是DPDK的librte_ring模块的tailq共享链表结构被重复初始化,常见触发场景:
- 系统中残留了其他版本的DPDK动态库(比如从
/usr/local/lib加载的librte_ring.so.20.0与当前19.11版本不兼容) - 编译DPDK或示例程序时混合使用了静态库(
.a)和动态库(.so),导致librte_ring被多次链接加载 - 之前安装的DPDK未完全清理,残留库干扰当前版本的初始化流程
修复步骤
1. 清理系统中残留的不兼容DPDK库
首先检查系统中已安装的DPDK库:
find /usr/local/lib -name "librte_*.so*"
如果发现版本不匹配的库(比如librte_ring.so.20.0,19.11版本对应的so版本应为librte_ring.so.19.11),删除这些残留文件并更新链接缓存:
sudo rm -f /usr/local/lib/x86_64-linux-gnu/librte_ring.so.20.0 sudo ldconfig
2. 重新编译DPDK,统一链接方式
进入DPDK源码目录,选择静态链接或动态链接其中一种方式重新编译安装,避免混合链接:
方式一:静态链接编译(推荐,避免动态库冲突)
make clean meson setup build --default-library=static ninja -C build sudo ninja -C build install sudo ldconfig
方式二:动态链接编译
make clean meson setup build --default-library=shared ninja -C build sudo ninja -C build install sudo ldconfig
如果使用老版本的Makefile构建(19.11也支持):
make clean make config T=x86_64-native-linuxapp-gcc make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/local/dpdk-19.11.14
然后设置环境变量,让程序优先加载指定版本的库:
export LD_LIBRARY_PATH=/usr/local/dpdk-19.11.14/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
3. 重新编译并运行示例程序
进入ethtools示例目录重新编译:
cd examples/ethtool make clean make
运行时确保环境变量正确:
./dpdk-ethtool -l
4. 验证依赖库版本
用ldd检查dpdk-testpmd的依赖库是否为目标版本:
ldd /usr/local/bin/dpdk-testpmd | grep librte_ring
确认输出的是19.11版本的库路径,而非其他版本。
关于“静态链接转为动态库”的解释
你看到的方案本质是统一DPDK的编译链接方式:如果之前编译时混合了静态库(.a)和动态库(.so),会导致同一个模块(比如librte_ring)被多次加载初始化,触发tailq重复注册的panic。统一使用静态或动态链接,就能避免这种重复加载的问题。
内容的提问来源于stack exchange,提问作者ltnotfty
相关产品推荐
相关产品推荐

