如何搭建VPP开发环境?

2026-06-03 18:476阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

先聊聊为啥要装 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 就好了。

D​P​D​K 绑定网卡

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 完成绑定。

M​U​L 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 那玩意儿挺酷的。

高性能、数据面全靠它。

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 就好了。

D​P​D​K 绑定网卡

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 完成绑定。

M​U​L 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 当成服务跑?