本文已同步至:
通过本文你将收获:
我的开发环境是windows+vmware虚拟机,虚拟机里装rocky Linux(其它发行版步骤类似)。
我们需要通过git clone
下载源码,因为在使用脚本安装的时候,会执行 git describe --long --match "v*"
命令获取版本号信息,非git仓库会报错。
git clone git@github.com:FDio/vpp.git
# 根据需要切换至稳定版本分支
cd vpp
git checkout stable/xxx
如果你是第一次编译vpp,这可能是一个漫长的过程。在不同环境和版本下编译,会遇到各种问题,我把在rocky/debian下遇到的各种问题整理好放在了文章最后,当编译出错时可作为资料查询,若一切顺利可以不用细看。
我一般使用这种方式,参考官方文档:构建 VPP。
开始编译前先确保 pip3 已正确安装,且当前环境能正确执行 pip3 命令,vpp在安装外部依赖的时候会执行该命令,无法执行 pip3 的常见问题是它被安装在/usr/local/bin
,需要将这个目录加入PATH路径。
1)安装基础依赖
执行:make install-dep
该命令将会通过rpm、pip等命令安装vpp依赖的基础库。
2)编译与打包
执行make build
进行编译(调试版),该命令仅编译vpp,不会构建安装包,第一次编译建议执行该命令,问题都解决了再考虑构建安装包。其它可执行的命令如下:
如果仅编译代码(不生成rpm安装包),执行:
如果要构建安装包,执行:
注:构建安装包时,将会使用最新的提交记录打包源码并编译安装包,因此如果本地代码没有commit,是不会编译到安装包里的。另外如果当前工程存在未提交的代码,生成的安装包会带上dirty字样。
vpp提供了一个适用于ubuntu、debian、centos的构建脚本,执行该它就会自动完成依赖安装、编译、构建安装包的步骤。如果你有其它命令需要一起执行可以写到脚本里,但如果是第一次编译vpp,建议先通过方法一
解决各种编译问题后再使用该脚本。
执行:./extras/vagrant/build.sh
对于rocky linux,在运行时会忽略一些步骤(如部分依赖的安装,以及最终生成rpm包的步骤)。但其实rocky和centos是一样生成rpm的,那么可以直接修改脚本把脚本里多处
$OS_ID == "centos"
替换为rocky
即可。
如果你的开发机配置不高,或是网络不好,第一次编译1个小时以上是很有可能的。其中耗时较长的是外部开源软件(如dpdk、rdma)的下载、编译、安装。
1)加速下载
大部分外部开源软件将从github下载,但国内经常访问不了。解决方法一个是想办法科学上网,另一个是使用github代理(网上有很多免费的代理,也有通过cloudflare免费搭建github代理的方法,这里就不展开说了),拿到代理地址后需要修改build/external/packages/
目录下的多个mk文件(比如xdp-tools.mk
等),在 github 链接前添加代理地址,下载时就会通过代理中转下载。
2)缓存已下载的源码包
执行make build
的时候,vpp首先会在/$home/Downloads
目录查找已下载好的源码包(如dpdk等),没有则会执行下载,并保存至./build/external/downloads/
,因此我们在编译完一次后可以将该目录下的所有下载文件拷贝到/root/Downloads/
里,这样以后就不用再下载了。
3)将外部开源软件安装到系统里
dpdk、rdma等编译都比较耗时,我们可以选择将它们安装到系统里,而不是每次编译vpp都重新编译它们。但前提是你不需要对它们进行gdb调试,因为这样安装的dpdk是release版本的,代码跟踪不方便。
执行:make install-ext-deps
注:该命令会根据最近的git tag号以及commit次数,拼接出
vpp-ext-deps-xxx.x86_64
安装包,检查与当前系统安装的vpp-ext版本是否一致,如果不一致会重新打包并安装。安装后可以通过rpm -qa|grep vpp-ext
查看版本。安装路径以dpdk库为例,将会被安装到/opt/vpp/external/x86_64/lib/libdpdk.a
。
我们首先需要确认vpp使用的接口类型,配置文件会略有不同。常见的接口类型:
生产环境一般优先使用dpdk(高性能),因此本文将使用dpdk为例,其它接口将会单独写一篇文章介绍。
定好了接口类型,我们的测试拓扑也就确定了,注意一定要在虚拟机里将ens192和ens224划分在不同的虚拟网络里,否则可能会照环路。
1)获取绑定dpdk的pci信息
我们需要确定绑定哪个网卡(注意不要绑定管理口),并获取对应的pci信息。可以使用lspci |grep Eth
或是lshw
命令查看 pci 信息:
# lshw -class network -businfo
Bus info Device Class Description
============================================================
pci@0000:03:00.0 ens160 network VMXNET3 Ethernet Controller
pci@0000:04:00.0 ens161 network 82574L Gigabit Network Connection
pci@0000:0b:00.0 ens192 network VMXNET3 Ethernet Controller
pci@0000:0c:00.0 ens193 network 82574L Gigabit Network Connection
pci@0000:13:00.0 ens224 network VMXNET3 Ethernet Controller
pci@0000:14:00.0 ens225 network VMXNET3 Ethernet Controller
2)绑定dpdk驱动
从vpp官网上看,vmxnet3网卡需要使用vfio,原文如下:Driver requires MSI-X interrupt support, which is not supported by uio_pci_generic driver. So vfio-pci must be used. On systems without IOMMU, vfio driver can still be used with 4.15.0-33-generic kernel (Ubuntu 18.04) which supports no-iommu mode.
首先我们需要找到dpdk-devbind.py
脚本,如果你使用make build
命令编译,该脚本的路径为./build-root/build-vpp_debug-native/external/src-dpdk/usertools/dpdk-devbind.py
。我们通过以下命令绑定dpdk接口:
sudo ifconfig ens224 down
sudo ifconfig ens192 down
sudo modprobe vfio
sudo modprobe vfio-pci
# 如果没有iommu,需要启用 NOIOMMU 模式,否则会绑定失败
# echo Y > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
./build-root/build-vpp_debug-native/external/src-dpdk/usertools/dpdk-devbind.py -b vfio-pci 0000:13:00.0 0000:0b:00.0
注: 1)不要使用vpp自带的
extras/vpp_config/scripts/dpdk-devbind.py
脚本,我执行的时候会报错(可能是比较老了),最好使用编译dpdk后得到y的脚本。 2)vmxnet3的中断模式在多worker下有bug,依旧选择vmxnet3就是因为它支持4个队列,后续单开文章解释,我们使用默认的轮询模式没问题。
对于dpdk接口,大页内存是必须要配置的。另外vpp的其它模块也有用到大页内存,但一般申请失败会转为申请普通内存。
生产环境一般配置1G(每页)大页内存,测试环境内存紧张的话可以使用2M(每页)大页内存。分配内存的大小跟接口个数、线程个数等有关,如果启动vpp的时候提示大页内存不足,就再调大一些。
内存不足的测试环境推荐:
cd ./build-root/build-vpp_debug-native/external/src-dpdk/usertools/
# 使用2M大页内存(默认),分配512M内存(具体根据实际情况配置)
sudo ./dpdk-hugepages.py --setup 512M
sudo ./dpdk-hugepages.py -s
Node Pages Size Total
0 256 2Mb 512Mb
1 256 2Mb 512Mb
生产环境推荐:
# 使用1G大页内存,这里分配了2G内存(具体根据实际情况配置)
sudo ./dpdk-hugepages.py -p 1G --setup 2G
sudo ./dpdk-hugepages.py -s
Node Pages Size Total
0 2 1Gb 2Gb
1 2 1Gb 2Gb
# 1)创建挂载目录
sudo mkdir -p /dev/hugepages
# 2)挂载大页内存
# 分配、挂载1024*2M的大页
sudo echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
sudo echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
sudo mount -t hugetlbfs nodev /dev/hugepages
# 如果失败尝试:sudo mountpoint -q /dev/hugepages
#或者 分配2*1G的大页
sudo echo 2 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
sudo echo 2 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages
sudo mount -t hugetlbfs nodev /dev/hugepages -o pagesize=1GB
# 如果失败尝试:sudo mountpoint -q /dev/hugepages -o pagesize=1GB
配置文件有两个:
startup.conf
:主要是各模块启动参数配置,配置文件的默认路径为:/etc/vpp/startup.conf
,在./src/vpp/conf/startup.conf
目录有一个配置说明。startup.cli
:存储vpp启动时加载的命令行配置文件。可以为空,第一次启动vpp也没有什么需要特别配置的,等调试完成后再把需要的命令写到startup.cli
里。本地开发我建议在非默认路径创建这两个配置文件,启动的时候通过参数指定文件路径,这样不容易被覆盖。同时还需要创建log文件。
touch /data/code/vppconf/startup.conf
touch /data/code/vppconf/startup.cli
touch /var/log/vpp/vpp.log
根据你的开发环境修改startup.conf
,主要是dpdk和cpu的配置,含义见注释:
unix {
# vpp前台前台启动,方便gdb调试及快速重启
nodaemon
# 指定日志输出路径
log /var/log/vpp/vpp.log
# 生成完整的coredump文件
full-coredump
# 登录命令行的方式,可选telnet登录,或是vppctl命令登录
# vppctl登录
cli-listen /run/vpp/cli.sock
# telnet登录
#cli-listen localhost:5002
# 命令行配置加载路径
startup-config /data/code/vppconf/startup.cli
}
# cpu配置,我的虚拟机有4个核心
# 0核留给linux内核(vpp不做配置),1核给vpp主线程(执行命令行、定时任务等)
# 2~3核心分给工作线程。你可以根据实际情况调整。
cpu {
main-core 1 // 主线程绑定core 1
corelist-workers 2-3 // worker绑定2-3
}
dpdk {
dev 0000:0b:00.0 {
name ens192
workers 0 # 对应核心2
}
dev 0000:13:00.0 {
name ens224
workers 1 # 对应核心3
}
}
启动方法有多种,根据实际情况运行。
make debug STARTUP_CONF=/data/code/vppconf/startup.conf
make debug-release STARTUP_CONF=/data/code/vppconf/startup.conf
make debug命令等同于使用gdb启动vpp。另外debug和release版本的编译产物的路径不同,使用make命令的好处就是不用关心vpp路径在哪儿。
注: 1)如果不指定STARTUP_CONF,将使用默认路径
/etc/vpp/startup.conf
2)如果已经将vpp rpm包安装到系统里,需要确保vpp没有运行,可以通过执行systemctl stop vpp
先结束系统执行的vpp进程。
make run STARTUP_CONF=/etc/vpp/startup.conf
make run-release STARTUP_CONF=/etc/vpp/startup.conf
编译、生成安装包、debug/release时的路径都不一样,这里以make build编译的debug文件为例:
执行:./build-root/build-vpp_debug-native/vpp/bin/vpp -c /etc/vpp/startup.conf
以rpm包为例,根据之前介绍,需要先通过以下命令构建rpm包:
make pkg-rpm TAG=vpp_debug
make pkg-rpm
生成的安装包在./build-root
目录下:
vpp-xxx.x86_64.rpm # 主程序
vpp-lib-xxx.x86_64.rpm # 共享库
vpp-plugins-xxx.x86_64.rpm # 插件
vpp-devel-xxx.x86_64.rpm # 开发包,头文件等
# API接口
vpp-api-lua-xxx.x86_64.rpm
vpp-api-python3-xxx.x86_64.rpm
# 调试信息相关
vpp-debuginfo-xxx.x86_64.rpm
vpp-debugsource-xxx.x86_64.rpm
vpp-lib-debuginfo-xxx.x86_64.rpm
vpp-plugins-debuginfo-xxx.x86_64.rpm
# SELinux 策略(用于在启用 SELinux 的系统上运行 VPP)
vpp-selinux-policy-xxx.x86_64.rpm
安装步骤:
# 如果有旧版本需要先卸载
rpm -qa | grep vpp | xargs -n1 rpm -e --nodeps
# 安装新版本,如果提示冲突,添加--force 参数
rpm -ivh *rpm
# 启动vpp(将读取默认配置路径)
systemctl restart vpp
如果想关闭vpp随系统启动(需要时再启),执行以下命令:
systemctl stop vpp
systemctl disable vpp
startup.conf
可配置通过telnet或是vppctl登录命令行,我们回顾一下这部分的配置:
...
unix {
# vppctl登录
cli-listen /run/vpp/cli.sock
# telnet登录
#cli-listen localhost:5001
...
}
...
1)使用vppctl登录
首先需要找到这个vppctl的位置,如果没有将vpp安装到系统里,可以用find命令查找一下,debug和release版本所在的位置不同。以debug版本为例,执行:
[root@localhost vpp]# ./build-root/install-vpp_debug-native/vpp/bin/vppctl
_______ _ _ _____ ___
__/ __/ _ \ (_)__ | | / / _ \/ _ \
_/ _// // / / / _ \ | |/ / ___/ ___/
/_/ /____(_)_/\___/ |___/_/ /_/
注:vppctl 执行时如果不添加任何参数,使用
/run/vpp/cli.sock
通信,因此startup.con也需要配置/run/vpp/cli.sock
。另外ctrl + c
会终止vppctl进程,因此进入vppctl后如果输错了命令,要用回退键删除已输入内容。
2)使用telnet登录
根据配置里监听的IP和端口执行 telnet IP Port,例如:
telnet 127.0.0.1 5001
[root@localhost vpp]# telnet 127.0.0.1 5001
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
_______ _ _ _____ ___
__/ __/ _ \ (_)__ | | / / _ \/ _ \
_/ _// // / / / _ \ | |/ / ___/ ___/
/_/ /____(_)_/\___/ |___/_/ /_/
DBGvpp#
与vppctl不同,
ctrl + c
不会退出命令行。
本章节我们将会把接口UP起来,配置为混杂模式,并使用 l2-xconnect 进行简单的收发包测试。l2-xconnect简单理解为报文从A口进B口出,B口进A口出,配置:
set interface state ens192 up
set interface state ens224 up
set interface promiscuous on ens192
set interface promiscuous on ens224
set interface l2 xconnect ens192 ens224
set interface l2 xconnect ens224 ens192
在windows下使用scapy或其它发包软件,向与ens192对应的宿主机网卡发包:
PS C:\Users\test> scapy
>>> src_ip_list=['192.168.1.'+str(x) for x in range(1,255)]
>>> sendp(Ether(dst="e8:eb:d3:23:f4:f8", src="00:50:56:e8:e6:4f")/IP(src=src_ip_list, dst='1.1.1.1'), iface='VMware Network Adapter VMnet1')
..............................................................................................................................................................................................................................................................
Sent 254 packets.
在vpp里查看收发包情况,可以看到ens192上收到了254个包,然后从ens224发出去了254个包:
DBGvpp# show interface
Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count
ens192 1 up 9000/0/0/0 rx packets 254
rx bytes 15240
rx-unicast packe 254
rx-unicast bytes 15240
ens224 2 up 9000/0/0/0 tx packets 254
tx bytes 15240
tx-unicast packe 254
tx-unicast bytes 15240
local0 0 down 0/0/0/0
在window下使用wireshark对vmnet2抓包,可以看到数据包确实从vpp发出去了:
我使用vscode/cursor + clangd插件查看vpp代码,关键是需要指定compile_commands.json
文件。
在vpp编译通过后,在vpp根目录执行make compdb
即可生成该文件。
注:如果生成的
compile_commands.json
内容为空,可以尝试执行cmake -S src/ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -B ./build-root/build-vpp_debug-native/vpp
同时需要在vscode配置中指定compile_commands.json
的路径,关键是--compile-commands-dir
,其它根据需求配置:
"clangd.arguments": [
// 补充头文件的形式,默认为iwyu,智能插入模式,直接插入使用的符号所需的头文件;never:不自动插入头文件
"--header-insertion=never",
// 指定compile_commands.json路径
"--compile-commands-dir=${workspaceFolder}/",
// 在后台自动分析文件(基于complie_commands)
// "--background-index",
// "-j=8",
"--enable-config", // 支持 .clangd 配置
"--clang-tidy",
"--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
// "--log=verbose",
// "--pretty",
// "--all-scopes-completion",// 全局补全(会自动补充头文件)
// "--completion-style=detailed",// 更详细的补全内容
// pch优化的位置
// "--pch-storage=memory",
// "--function-arg-placeholders",
],
如果要看dpdk代码,路径在./build-root/build-vpp_debug-native/external/src-dpdk
,它对应的compile_commands.json
路径:./build-root/build-vpp_debug-native/external/build-dpdk
本章节用于记录我在编译过程中遇到的各种问题,如果你一切顺利,可以忽略该章节
如果编译卡在以下步骤,会话超时,系统卡死的情况,大概率是因为内存不足导致的。
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libmana.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libmlx4.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libmlx5.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libmthca-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libocrdma-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libqedr-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libvmw_pvrdma-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libhfi1verbs-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libipathverbs-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/librxe-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libsiw-rdmav34.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libibmad.a
-- Installing: /root/code/c/vpp/build-root/install-vpp-native/external/lib/libibnetdisc.a
--- building ipsec-mb 1.3 - log: /root/code/c/vpp/build-root/build-vpp-native/external/ipsec-mb.build.log
......
解决方法:调整虚拟机内存,我调整到了6g;或是把交换分区设置大一些。
报错提示:ld链接失败,libpcap.a没有添加-fPIC
。如果出现这个问题,我的方法是修改xdp-tools
的Makefile,添加上-fPIC
参数后重新编译。
1)解压、备份xdp-tools-1.2.9.tar.gz
cd build/external/downloads/
tar xvf xdp-tools-1.2.9.tar.gz
mv xdp-tools-1.2.9.tar.gz raw_xdp-tools-1.2.9.tar.gz
cd xdp-tools-1.2.9/lib/libbpf/src
vi Makefile
添加-fPIC参数,在 STATIC_OBJDIR 添加-fPIC
就能编译过,如果不行尝试在 SHARED_OBJDIR 也添加-fPIC
。
2)重新打包并修改checksum
因为我们对源码包做了修改,vpp会检查checksum,因此我们需要重新计算
tar zcvf xdp-tools-1.2.9.tar.gz xdp-tools-1.2.9
md5sum xdp-tools-1.2.9.tar.gz
f5992d55752f90d1b533c11437a2e217 xdp-tools-1.2.9.tar.gz
修改./build/external/packages/xdp-tools.mk
文件,更新md5值为刚才计算出来的值。
报错信息:
Applying patch: 0004-Fix-transposed-calloc-arguments.patch
patching file lib/util/xpcapng.c
--- configuring xdp-tools 1.2.9 - log: /data/code/vpp/build-root/build-vpp_debug-native/external/xdp-tools.config.log
--- building xdp-tools 1.2.9 - log: /data/code/vpp/build-root/build-vpp_debug-native/external/xdp-tools.build.log
--- installing xdp-tools 1.2.9 - log: /data/code/vpp/build-root/build-vpp_debug-native/external/xdp-tools.install.log
make[3]: Leaving directory '/data/code/vpp/build/external'
make[2]: Leaving directory '/data/code/vpp/build/external'
@@@@ Configuring vpp in /data/code/vpp/build-root/build-vpp_debug-native/vpp @@@@
CMake Error: Error: generator : Ninja
Does not match the generator used previously: Unix Makefiles
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.
make[1]: *** [Makefile:644: vpp-configure] Error 1
make[1]: Leaving directory '/data/code/vpp/build-root'
make: *** [Makefile:442: build] Error 2
这是CMake生成器(Generator)不匹配的错误,错误信息说明:当前尝试使用Ninja生成器构建,但之前使用的是Unix Makefiles生成器,CMake不允许在同一个构建目录中切换不同的生成器。
解决方法:删除旧的构建缓存。根据错误提示的路径,删除CMakeCache.txt
和CMakeFiles
,然后再重新编译:
rm -rf /data/code/vpp/build-root/build-vpp_debug-native/vpp/CMakeCache.txt
rm -rf /data/code/vpp/build-root/build-vpp_debug-native/vpp/CMakeFiles
ModuleNotFoundError: No module named 'ply'
ModuleNotFoundError: No module named 'setuptools'
ModuleNotFoundError: No module named 'ninja'
ERROR: Problem encountered: missing python module: elftool
出现类似错误,先尝试强制重新安装一下:
pip3 install --force-reinstall ply
pip3 install --force-reinstall setuptools
pip3 install --force-reinstall ninja
pip3 install --force-reinstall pyelftools
如果setuptools出现以下报错,是因为setuptools新版本(>=58.0.0)对API做了不兼容变更导致的,需要降级为setuptools 57.5.0以下,我用的是53.0.0。
File "/usr/local/lib/python3.9/site-packages/setuptools/_core_metadata.py", line 293, in _distribution_fullname
canonicalize_version(version, strip_trailing_zero=False),
TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero'
error: Bad exit status from /var/tmp/rpm-tmp.mHH8fa (%install)
指定版本安装setuptools
pip3 install --force-reinstall setuptools==53.0.0
如果安装后还是报找不到module(比如ply),我们查看一下ply的安装路径:
root@localhost vpp (feature-ly-sleep) # pip3 show ply
Name: ply
Version: 3.11
Summary: Python Lex & Yacc
Home-page: http://www.dabeaz.com/ply/
Author: David Beazley
Author-email: dave@dabeaz.com
License: BSD
Location: /usr/local/lib/python3.9/site-packages
尝试将Location路径添加到环境变量:
export PYTHONPATH=/usr/local/lib/python3.9/site-packages:$PYTHONPATH
如果可行,就修改/etc/bashrc
,末尾添加以上内容,然后执行 source /etc/bashrc
。
编译过程需要从github下载源码,因此要确保你的网络能够访问github。我的环境平时是可以访问github的,但某天下载时提示连接被拒绝,最后发现是dns被污染了,把github.com解析成了127.0.0.1。解决方法:
1)先使用dig命令测试,找到可用的DNS服务:
dig @114.114.114.114 github.com
dig @8.8.8.8 github.com
多测试几个,选择返回正确结果的DNS服务,并修改你的DNS配置。
2)重启网络(以rocky为例)
systemctl restart NetworkManager
如果你不想修改DNS服务,也可以通过修改host文件来解决。
debian12环境下遇到,提示缺少clang,需要先安装clang:
sudo apt install clang
sudo apt install clang-format
如果还是有问题,查看vpp根目录的Makefile
,我测试使用的是debian-12,但是做依赖检查的时候没有debian-12的判断分支,会走走到else默认判断分支,检查是否有clang11。而debian-12使用的clang12,因此就报错了。
解决方法:
dpkg -l|grep clang
以及dpkg -l|grep libffi
Makefile
,添加对debian-12的判断分支:else ifeq ($(OS_ID)-$(OS_VERSION_ID),debian-12)
DEB_DEPENDS += virtualenv
DEB_DEPENDS += clang-14 clang-format-14
LIBFFI=libffi8
dpkg-shlibdeps: error: no dependency information found for /usr/local/lib/libpcap.so.1 (used by debian/vpp-plugin-core/usr/lib/x86_64-linux-gnu/vpp_plugins/bpf_trace_filter_plugin.so)
Hint: check if the library actually comes from a package.
生成deb包时会做依赖检查,报错提示libpcap库没有依赖信息(实际是有这个库),我们可以忽略这个错误检查,修改./src/pkg/debian/rules.in
文件,注意tab缩进:
override_dh_shlibdeps:
dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
ipsec-mb库版本问题(vpp2402依赖1.5,系统默认安装了1.3)
解决方法:需要先卸载,再由vpp自动安装新版本:
sudo apt remove libipsec-mb1
sudo apt remove libipsec-mb-dev
报错信息:
dpkg-checkbuilddeps: error: Unmet build dependencies: debhelper-compat (= 10) dh-python python3-all
Please install chrpath tool
解决方法:
sudo apt install chrpath debhelper-compat dh-python python3-all
提示缺少依赖(如glibc-static nasm),但是yum找不到安装包,我们需要启用powertools源:
yum config-manager --set-enabled powertools
yum install -y glibc-static nasm
pcap support: missing - this is required
error: config.lziFx7/libpcaptest.c:2:10: 致命错误:pcap/dlt.h:没有那个文件或目录
#include <pcap/dlt.h>
^~~~~~~~~~~~
编译中断。
make[4]: 离开目录“/home/test/code/c/vpp/build-root/build-vpp_debug-native/external/src-xdp-tools”
安装依赖:
yum install -y libpcap-devel
错误:构建依赖失败:
chrpath 被 vpp-24.06.0-2~gcd30ea1dd.x86_64 需要
libffi-devel 被 vpp-24.06.0-2~gcd30ea1dd.x86_64 需要
python36-devel 被 vpp-24.06.0-2~gcd30ea1dd.x86_64 需要
selinux-policy-devel 被 vpp-24.06.0-2~gcd30ea1dd.x86_64 需要
安装依赖:
sudo dnf install -y chrpath libffi-devel selinux-policy-devel python3-devel
其它可能遇到的依赖问题:
sudo dnf install -y ganglia-devel libconfuse-devel libconfuse-devel
如果安装了python3-devel,还是报错,先执行rpm -qa|grep python|grep devel
确认是否已安装:
[root@localhost vpp]# rpm -qa|grep python|grep devel
python3.12-devel-3.12.6-1.el8_10.x86_64
python36-devel-3.6.8-39.module+el8.10.0+1592+61442852.x86_64
可以看到我们已经安装了,那么我们修改vpp根目录的Makefile
,把这个python3-devel检查注释掉,忽略这个错误。
else ifeq ($(OS_ID),rocky)
RPM_DEPENDS += yum-utils
RPM_DEPENDS += subunit subunit-devel
RPM_DEPENDS += openssl-devel
# 注释掉下面这一行
# RPM_DEPENDS += python3-devel # needed for python3 -m pip install psutil
1)如果觉得该装的依赖都已经安装了,但编译还是有问题,尝试把build文件删了重新编译一次。
rm -rf build*;git checkout build*
2)找不到依赖libibverbs.a
两种情况:
a. 编译vpp的时候也会编译这个libibverbs.a,rdma使用,如果找不到可能是上次编译错误导致的异常,清空build信息重新编译一次。
b. 编译xdp-tools的时候也会用到,它依赖的libpcap依赖系统的libibverbs.a,
如果在make install-ext-deps出错,可能是在你卸载vpp或是其他安装包的时候,把libibverbs给卸了,libpcap会依赖它。
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.v3zcV1
+ umask 022
+ cd /data/code/vpp/build/external/rpm/BUILD
+ '[' /data/code/vpp/build/external/rpm/BUILDROOT/vpp-ext-deps-5.0.10-0.x86_64 '!=' / ']'
+ rm -rf /data/code/vpp/build/external/rpm/BUILDROOT/vpp-ext-deps-5.0.10-0.x86_64
++ dirname /data/code/vpp/build/external/rpm/BUILDROOT/vpp-ext-deps-5.0.10-0.x86_64
+ mkdir -p /data/code/vpp/build/external/rpm/BUILDROOT
+ mkdir /data/code/vpp/build/external/rpm/BUILDROOT/vpp-ext-deps-5.0.10-0.x86_64
+ make -C ../.. BUILD_DIR=/data/code/vpp/build/external/rpm/tmp INSTALL_DIR=/data/code/vpp/build/external/rpm/BUILDROOT/vpp-ext-deps-5.0.10-0.x86_64/opt/vpp/external/x86_64 config
make[3]: Entering directory '/data/code/vpp/build/external'
make[3]: Nothing to be done for 'config'.
make[3]: Leaving directory '/data/code/vpp/build/external'
+ make -C ../.. BUILD_DIR=/data/code/vpp/build/external/rpm/tmp INSTALL_DIR=/data/code/vpp/build/external/rpm/BUILDROOT/vpp-ext-deps-5.0.10-0.x86_64/opt/vpp/external/x86_64 install
make[3]: Entering directory '/data/code/vpp/build/external'
--- building xdp-tools 1.2.9 - log: /data/code/vpp/build/external/rpm/tmp/xdp-tools.build.log
make[4]: *** [Makefile:49: config.mk] Error 1
make[3]: *** [packages/xdp-tools.mk:39: /data/code/vpp/build/external/rpm/tmp/.xdp-tools.build.ok] Error 2
make[3]: Leaving directory '/data/code/vpp/build/external'
error: Bad exit status from /var/tmp/rpm-tmp.v3zcV1 (%install)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.v3zcV1 (%install)
make[2]: *** [Makefile:129: vpp-ext-deps-5.0.10-0.x86_64.rpm] Error 1
make[2]: Leaving directory '/data/code/vpp/build/external'
make[1]: *** [Makefile:141: install-rpm] Error 2
make[1]: Leaving directory '/data/code/vpp/build/external'
make: *** [Makefile:741: install-ext-deps] Erroar 2
分析原因:
#cat /data/code/vpp/build/external/rpm/tmp/xdp-tools.build.log
/lib64/libpcap.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libpcap.so: undefined reference to `
ibv_alloc_pd@IBVERBS_1.1'
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libpcap.so: undefined reference to `
ibv_destroy_comp_channel@IBVERBS_1.0'
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libpcap.so: undefined reference to `
....
可以看到是确实是libpcap问题,安装libibverbs提示已经安装,但是ldd查看libpcap.so没有链接到正确的libibverbs(libibverbs.so.1找不到)
root@localhost vpp # sudo dnf install libibverbs
Last metadata expiration check: 0:11:52 ago on Tue Apr 8 19:29:40 2025.
Package libibverbs-51.0-1.el9.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
root@localhost vpp # ldd /usr/lib64/libpcap.so
查看libibverbs安装到哪里,可以看到安装vpp-lib-xxx的时候覆盖了libibverbs.so,卸载的时候把它删了。
sudo dnf provides */libibverbs.so.1
vpp-lib-24.06.5.0.16-fd153c361.x86_64 : VPP libraries
Repo : platform
Matched from:
Filename : /usr/lib64/libibverbs.so.1
sudo rpm -e --nodeps libibverbs
sudo dnf install libibverbs
手动强制安装一下
# 删除libibverbs不考虑依赖
sudo rpm -e --nodeps libibverbs
sudo dnf install libibverbs
3)无法识别startup.conf
里的dpdk配置
检查dpdk编译是否正确,查看dpdk编译日志路径:
./build-root/build-vpp_debug-native/external/dpdk.config.log
./build-root/build-vpp_debug-native/external/dpdk.build.log
在dpdk编译目录重新执行ninja看看有没有报错。
/data/code/vpp/build-root/build-vpp_debug-native/external/build-dpdk
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。