如何搭建VPP开发环境?
- 内容介绍
- 文章标签
- 相关推荐
先聊聊为啥要装 VPP
说实话,VPP 那玩意儿挺酷的。
高性能、数据面全靠它。

我一开始也是抱着“玩玩看”的心态,后来啊越玩越上瘾。
希望大家... 所以今天咱们就唠嗑一下怎么把这套玩意儿从零装到能跑。
准备工作——系统与工具
先说系统, 我常用 Ubuntu 22.04、Debian 12、 拜托大家... Rocky 9,基本都行。
拖进度。 别管你是 VM 还是裸机,先把下面这些东西给装上。
哈哈,这一步最容易踩坑——忘了装 clang。
不对不对,应该是先装 clang 和 clang‑format。
sudo apt update
sudo apt install -y git cmake make ninja-build clang clang-format
还有 python3、 pip3,后面会用到一些 pip 包。
sudo apt install -y python3 python3-pip
依赖库大集合
小丑竟是我自己。 VPP 要的依赖不少, 我这边直接列个清单,你照搬就行。
sudo apt install -y libmbedtls-dev libssl-dev libpcap-dev \
libnuma-dev libelf-dev libunwind-dev libjansson-dev \
libcurl4-openssl-dev libibverbs-dev rdma-core-devel \
dpkg-dev debhelper chrpath
如果是 Rocky/Alma, 那把 apt 换成 dnf,名字大同小异。
把源码拉下来
麻了... 别问我为什么不直接下二进制包,源码才有意思嘛。
git clone 那句很长, 我这里直接写:,大胆一点...
git clone https://github.com/FDio/vpp.git
cd vpp
# 切到一个稳定分支,比如 stable/2206
git checkout stable/2206
外部依赖:DPDK、XDP‑tools…
一句话概括... VPP 编译时会自动去下载 DPDK、xdp‑tools 之类的东西。
不过如果你的网络不给力,这里经常卡住。
我的经验是:先手动把它们下载好放进 build‑root/external/downloads 目录,等..….。
比如 DPDK:
mkdir -p build-root/external/downloads
cd build-root/external/downloads
wget https://fast.dpdk.org/rel/dpdk-22.11.tar.xz # 记得换成最新链接
tar xf dpdk-22.11.tar.xz
CMake 配置 & 编译 VPP
妥妥的! 这里有点晕, 我也经常自言自语:“不对不对,这里要加个 -DCMAKE_BUILD_TYPE=Debug”。
mkdir -p build && cd build
cmake .. -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DENABLE_TESTS=OFF \
-DENABLE_DOCS=OFF
ninja # 或者 make, 也行,只是 ninja 快点儿
遇到编译错误怎么办?
先别慌,一般都是缺库或者编译器版本不匹配。
报错里提到 missing xxx,就去 apt/dnf 装对应的 dev 包,看好你哦!。
还有一种情况是 CMake 报 “Generator mismatch”,客观地说...。
被割韭菜了。 那就是之前用了 Makefiles, 现在想切 Ninja,直接删掉 CMakeCache.txt 再跑一遍 cmake 就好了。
DPDK 绑定网卡
If you want real NIC acceleration, you gotta bind it.
# 确认 PCI ID,比方说:
lspci | grep Ernet
# 假设是 0000:03:00.0 和 0000:04:00.0
sudo ./build-root/build-vpp_debug-native/external/src-dpdk/usertools/dpdk-setup.sh
# 在脚本里选 “1) Bind drivers to UIO” → “vfio-pci”
# 然后选对应的 PCI ID 完成绑定。
MUL T I L I N E 配置文件
P.S. 我最喜欢在 /etc/vpp/startup.conf 里写配置, 整一个... 主要原因是改一次能全局生效。
unix {
nodaemon # 前台跑, 调试方便
log /var/log/vpp/vpp.log
cli-listen /run/vpp/
startup-config /etc/vpp/startup.conf
}
cpu {
main-core 1 # 主线程绑核1
corelist-workers 2-5 # 工作线程绑核2~5,可自行增删
}
dpdk {
dev 0000:03:00.0 { name eth0 workers 0 }
dev 0000:04:00.0 { name eth1 workers 1 }
}
L2 Xconnect 小实验——验证链路是否通了
启动 VPP:
sudo ./build-root/build-vpp_debug-native/vpp/bin/vppctl unix { cli-listen /run/vpp/ }
# 或者直接运行二进制:
sudo ./build-root/build-vpp_debug-native/vpp/bin/vpp -c /etc/vpp/startup.conf
进入 vppctl 后敲几条命令:
set interface state eth0 up
set interface state eth1 up
set interface promiscuous on eth0
set interface promiscuous on eth1
set interface l2 xconnect eth0 eth1
show interface brief # 看看两口都 up 了没
show l2 xconnect # 确认连通关系已经建好
接着用 ping 或者抓包工具往 eth0 发包,你会看到同样的数据从 eth1 出去。哈哈,这下算成功啦!😁 调试小技巧 & 常见坑点汇总 - 大页内存忘了挂载?在 /etc/sysctl.conf 加上 vm.nr_hugepages=1024,然后 reboot。否则 VPP 启动报 “failed to allocate hugepages”。
什么鬼? Coding 本来就该带点乐子,别太严肃啦!
- 想在容器里跑 VPP?记得打开特权模式并挂载 /dev/hugepages,否则大页分配会炸。 - 再说说一个小技巧:每次编译前删掉 build‑root 下的缓存目录,防止残留导致 checksum 不匹配。 收官感言——别忘了玩得开心! 说实话,这套流程看起来像爬山,却一点点踩着石头往上走,就能站在峰顶俯瞰整个网络世界。
尊嘟假嘟? 那说明你用了旧版脚本,不如直接用新编译出来的 dpdk‑ 路径。 - 遇到 “error: Bad exit status from %install” 时多半是外部依赖打包失败。打开 build‑root/external/rpm/tmp/*.log 看具体是哪一步挂了然后手动修复缺失库或改 mk 文件里的 URL。
systemd unit 写个简单的 service 文件,把 ExecStart 指向 vpp 可施行文件即可。记得 ExecStartPre 加上 “modprobe vfio-pci”。 - 有时候 dpdk‑setup.sh 脚本报错:“No such file or directory – dpdk‑usertools”,也要.…。
不忍卒读。 - 编译时提示 “ModuleNotFoundError: ply”。先降级 setuptools: pip3 install setuptools==53.0.0 再继续。 - 如果想在 VSCode 用 clangd,需要告诉它 compile_commands.json 的位置。施行 make compdb # 会在根目录生成 compile_commands.json - 想把 VPP 当成服务跑?
先聊聊为啥要装 VPP
说实话,VPP 那玩意儿挺酷的。
高性能、数据面全靠它。

我一开始也是抱着“玩玩看”的心态,后来啊越玩越上瘾。
希望大家... 所以今天咱们就唠嗑一下怎么把这套玩意儿从零装到能跑。
准备工作——系统与工具
先说系统, 我常用 Ubuntu 22.04、Debian 12、 拜托大家... Rocky 9,基本都行。
拖进度。 别管你是 VM 还是裸机,先把下面这些东西给装上。
哈哈,这一步最容易踩坑——忘了装 clang。
不对不对,应该是先装 clang 和 clang‑format。
sudo apt update
sudo apt install -y git cmake make ninja-build clang clang-format
还有 python3、 pip3,后面会用到一些 pip 包。
sudo apt install -y python3 python3-pip
依赖库大集合
小丑竟是我自己。 VPP 要的依赖不少, 我这边直接列个清单,你照搬就行。
sudo apt install -y libmbedtls-dev libssl-dev libpcap-dev \
libnuma-dev libelf-dev libunwind-dev libjansson-dev \
libcurl4-openssl-dev libibverbs-dev rdma-core-devel \
dpkg-dev debhelper chrpath
如果是 Rocky/Alma, 那把 apt 换成 dnf,名字大同小异。
把源码拉下来
麻了... 别问我为什么不直接下二进制包,源码才有意思嘛。
git clone 那句很长, 我这里直接写:,大胆一点...
git clone https://github.com/FDio/vpp.git
cd vpp
# 切到一个稳定分支,比如 stable/2206
git checkout stable/2206
外部依赖:DPDK、XDP‑tools…
一句话概括... VPP 编译时会自动去下载 DPDK、xdp‑tools 之类的东西。
不过如果你的网络不给力,这里经常卡住。
我的经验是:先手动把它们下载好放进 build‑root/external/downloads 目录,等..….。
比如 DPDK:
mkdir -p build-root/external/downloads
cd build-root/external/downloads
wget https://fast.dpdk.org/rel/dpdk-22.11.tar.xz # 记得换成最新链接
tar xf dpdk-22.11.tar.xz
CMake 配置 & 编译 VPP
妥妥的! 这里有点晕, 我也经常自言自语:“不对不对,这里要加个 -DCMAKE_BUILD_TYPE=Debug”。
mkdir -p build && cd build
cmake .. -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DENABLE_TESTS=OFF \
-DENABLE_DOCS=OFF
ninja # 或者 make, 也行,只是 ninja 快点儿
遇到编译错误怎么办?
先别慌,一般都是缺库或者编译器版本不匹配。
报错里提到 missing xxx,就去 apt/dnf 装对应的 dev 包,看好你哦!。
还有一种情况是 CMake 报 “Generator mismatch”,客观地说...。
被割韭菜了。 那就是之前用了 Makefiles, 现在想切 Ninja,直接删掉 CMakeCache.txt 再跑一遍 cmake 就好了。
DPDK 绑定网卡
If you want real NIC acceleration, you gotta bind it.
# 确认 PCI ID,比方说:
lspci | grep Ernet
# 假设是 0000:03:00.0 和 0000:04:00.0
sudo ./build-root/build-vpp_debug-native/external/src-dpdk/usertools/dpdk-setup.sh
# 在脚本里选 “1) Bind drivers to UIO” → “vfio-pci”
# 然后选对应的 PCI ID 完成绑定。
MUL T I L I N E 配置文件
P.S. 我最喜欢在 /etc/vpp/startup.conf 里写配置, 整一个... 主要原因是改一次能全局生效。
unix {
nodaemon # 前台跑, 调试方便
log /var/log/vpp/vpp.log
cli-listen /run/vpp/
startup-config /etc/vpp/startup.conf
}
cpu {
main-core 1 # 主线程绑核1
corelist-workers 2-5 # 工作线程绑核2~5,可自行增删
}
dpdk {
dev 0000:03:00.0 { name eth0 workers 0 }
dev 0000:04:00.0 { name eth1 workers 1 }
}
L2 Xconnect 小实验——验证链路是否通了
启动 VPP:
sudo ./build-root/build-vpp_debug-native/vpp/bin/vppctl unix { cli-listen /run/vpp/ }
# 或者直接运行二进制:
sudo ./build-root/build-vpp_debug-native/vpp/bin/vpp -c /etc/vpp/startup.conf
进入 vppctl 后敲几条命令:
set interface state eth0 up
set interface state eth1 up
set interface promiscuous on eth0
set interface promiscuous on eth1
set interface l2 xconnect eth0 eth1
show interface brief # 看看两口都 up 了没
show l2 xconnect # 确认连通关系已经建好
接着用 ping 或者抓包工具往 eth0 发包,你会看到同样的数据从 eth1 出去。哈哈,这下算成功啦!😁 调试小技巧 & 常见坑点汇总 - 大页内存忘了挂载?在 /etc/sysctl.conf 加上 vm.nr_hugepages=1024,然后 reboot。否则 VPP 启动报 “failed to allocate hugepages”。
什么鬼? Coding 本来就该带点乐子,别太严肃啦!
- 想在容器里跑 VPP?记得打开特权模式并挂载 /dev/hugepages,否则大页分配会炸。 - 再说说一个小技巧:每次编译前删掉 build‑root 下的缓存目录,防止残留导致 checksum 不匹配。 收官感言——别忘了玩得开心! 说实话,这套流程看起来像爬山,却一点点踩着石头往上走,就能站在峰顶俯瞰整个网络世界。
尊嘟假嘟? 那说明你用了旧版脚本,不如直接用新编译出来的 dpdk‑ 路径。 - 遇到 “error: Bad exit status from %install” 时多半是外部依赖打包失败。打开 build‑root/external/rpm/tmp/*.log 看具体是哪一步挂了然后手动修复缺失库或改 mk 文件里的 URL。
systemd unit 写个简单的 service 文件,把 ExecStart 指向 vpp 可施行文件即可。记得 ExecStartPre 加上 “modprobe vfio-pci”。 - 有时候 dpdk‑setup.sh 脚本报错:“No such file or directory – dpdk‑usertools”,也要.…。
不忍卒读。 - 编译时提示 “ModuleNotFoundError: ply”。先降级 setuptools: pip3 install setuptools==53.0.0 再继续。 - 如果想在 VSCode 用 clangd,需要告诉它 compile_commands.json 的位置。施行 make compdb # 会在根目录生成 compile_commands.json - 想把 VPP 当成服务跑?

