第三章 DPDK源码编译与安装
好,咱们进入实战环节。这一章,我们来搞定DPDK的编译和安装。
说实话,很多初学者在这一步就卡住了。不是源码下载不下来,就是编译报错,再不然就是驱动加载失败。我当年第一次搞DPDK,光编译就折腾了大半天。嗯,今天我把这些坑都给你指出来,你照着做,半小时内肯定搞定。
3.1 下载DPDK源码
先说说源码从哪里来。DPDK官方维护在三个地方:
- DPDK官网(dpdk.org)—— 最权威,但下载速度看网络情况
- GitHub镜像(github.com/DPDK/dpdk)—— 我个人习惯用这个,方便
- Linux发行版仓库 —— 比如Ubuntu的apt,但版本通常比较老
我建议你直接从GitHub拉取。为什么呢?因为你可以方便地切换分支,查看历史提交。我在项目中遇到过,某个新特性只在特定版本里才有,用GitHub管理版本就特别方便。
下载命令很简单:
# 克隆最新稳定版
git clone https://github.com/DPDK/dpdk.git
cd dpdk
# 查看所有分支
git branch -a
# 切换到长期支持版本(比如21.11 LTS)
git checkout v21.11
3.2 配置编译环境
源码下载好了,接下来配置环境。这一步很多人会忽略,结果编译时各种报错。
你需要安装以下依赖:
# Ubuntu/Debian系统
sudo apt update
sudo apt install -y build-essential meson ninja-build \
python3-pyelftools libnuma-dev pkg-config
# CentOS/RHEL系统
sudo yum install -y gcc make meson ninja-build \
python3-pyelftools numactl-devel pkgconfig
这里有个关键点:libnuma-dev 一定要装。NUMA(非统一内存访问)是DPDK性能优化的核心。你不装这个,编译能过,但运行时性能会大打折扣。我曾经在一个NUMA架构的服务器上忘了装,结果跑出来的性能只有正常的一半,排查了半天才发现是这个问题。
另外,检查一下你的内核版本:
uname -r
DPDK对内核版本有要求。一般来说,4.x以上的内核都没问题。如果你的内核太老,建议先升级。
3.3 编译DPDK库
环境配好了,开始编译。DPDK从19.11版本开始,全面转向了Meson构建系统。老版本的Makefile方式已经废弃了。
编译步骤:
# 进入源码目录
cd dpdk
# 创建构建目录(我习惯叫build)
meson setup build
# 进入构建目录
cd build
# 开始编译
ninja
# 安装到系统
sudo ninja install
# 更新动态链接库缓存
sudo ldconfig
这里解释一下几个关键点:
- meson setup:配置构建参数。你可以通过
-D选项定制,比如-Dexamples=all编译所有示例程序 - ninja:比make快得多。我第一次用ninja编译DPDK,只用了不到3分钟,而以前用make要10分钟
- ldconfig:这步容易忘。不执行的话,运行时可能找不到动态库
# 只编译特定目标平台
meson setup build -Dplatform=generic
# 启用调试信息
meson setup build -Dbuildtype=debug
# 禁用某些驱动(减少编译时间)
meson setup build -Denable_drivers=net/ixgbe,net/i40e
编译完成后,检查一下是否成功:
# 查看DPDK版本
pkg-config --modversion libdpdk
# 查看安装的文件
ls /usr/local/lib/x86_64-linux-gnu/librte_*
如果能看到一堆 librte_* 开头的库文件,说明编译安装成功了。
3.4 安装DPDK驱动
库编译好了,但要让网卡跑在用户态,还得装驱动。DPDK支持两种驱动模式:igb_uio 和 vfio-pci。
3.4.1 igb_uio驱动
这是DPDK传统的UIO驱动。优点是兼容性好,几乎所有网卡都能用。缺点是功能简单,不支持中断重映射等高级特性。
安装方法:
# 编译igb_uio内核模块
cd dpdk/kernel/linux/igb_uio
make
# 加载模块
sudo modprobe uio
sudo insmod igb_uio.ko
# 验证是否加载成功
lsmod | grep igb_uio
modprobe uio。我遇到过一台定制内核的服务器,UIO模块没编译进去,折腾了好久才发现。
3.4.2 vfio-pci驱动
这是更推荐的方式。vfio-pci是内核自带的驱动,支持IOMMU、中断重映射,安全性更好。从DPDK 20.11开始,官方默认推荐使用vfio-pci。
安装步骤:
# 检查内核是否支持VFIO
cat /boot/config-$(uname -r) | grep VFIO
# 加载VFIO模块
sudo modprobe vfio-pci
# 启用IOMMU(在GRUB配置中添加)
# 编辑 /etc/default/grub
# 在 GRUB_CMDLINE_LINUX 中添加:
# intel_iommu=on (Intel CPU)
# amd_iommu=on (AMD CPU)
# 更新GRUB
sudo update-grub
# 重启系统
sudo reboot
重启后,验证IOMMU是否启用:
dmesg | grep -i iommu
如果看到 IOMMU enabled 之类的信息,说明成功了。
3.4.3 绑定网卡到DPDK驱动
驱动装好了,接下来把网卡绑定到DPDK。这里要用到DPDK自带的 dpdk-devbind.py 脚本。
# 查看当前网卡状态
dpdk-devbind.py --status
# 找到你要绑定的网卡(比如 0000:02:00.0)
# 绑定到vfio-pci
sudo dpdk-devbind.py -b vfio-pci 0000:02:00.0
# 或者绑定到igb_uio
sudo dpdk-devbind.py -b igb_uio 0000:02:00.0
# 验证绑定结果
dpdk-devbind.py --status
绑定成功后,你会看到网卡从内核驱动变成了DPDK驱动。这时候,网卡已经准备好被DPDK应用程序接管了。
3.5 验证安装
最后,跑一个简单的测试程序,验证整个环境是否正常:
# 编译helloworld示例
cd dpdk/examples/helloworld
make
# 运行(需要root权限)
sudo ./build/helloworld -l 0-1 -n 4
如果看到 hello from core 0 和 hello from core 1 的输出,恭喜你,DPDK环境搭建成功了!
嗯,到这里,DPDK的编译安装就全部完成了。整个过程看起来步骤不少,但只要你按部就班来,不会有什么大问题。下一章,我们开始真正进入OVS-DPDK的实战配置。