2. 绑定网卡到IGB_UIO驱动
任务目标
将指定物理网卡从内核原生驱动(如 igb、ixgbe)切换至 DPDK 专用的 igb_uio 驱动,使该网卡可被 DPDK 程序接管,并通过 dpdk-devbind.py 验证绑定结果。
前置条件
- 已编译并安装 DPDK(本文以 DPDK 21.11 LTS 为例),且
igb_uio内核模块已编译(通常位于dpdk/build/kernel/linux/igb_uio/igb_uio.ko)。 - 系统已安装
lspci工具(pciutils包)。 - 当前用户具备
root权限或可执行sudo。 - 确认目标网卡未被系统关键服务占用(如管理网口),操作前请备份网络配置。
操作步骤与关键代码
1. 加载 igb_uio 内核模块
# 加载模块(若已编译为 .ko 文件)
sudo modprobe uio
sudo insmod /path/to/dpdk/build/kernel/linux/igb_uio/igb_uio.ko
# 验证模块已加载
lsmod | grep igb_uio
2. 查看当前网卡状态
# 使用 DPDK 自带的绑定工具查看所有网卡当前驱动
dpdk-devbind.py --status
输出中会列出所有网络接口及其当前绑定的驱动。找到目标网卡(例如 0000:02:00.0),记录其当前驱动名称(如 igb 或 ixgbe)。
3. 将网卡绑定到 igb_uio
# 将指定 PCI 地址的网卡绑定到 igb_uio
sudo dpdk-devbind.py --bind=igb_uio 0000:02:00.0
若网卡当前被内核驱动占用且无法直接解绑,需先使用 --unbind 参数强制解绑,再执行绑定:
sudo dpdk-devbind.py --unbind 0000:02:00.0
sudo dpdk-devbind.py --bind=igb_uio 0000:02:00.0
4. 验证绑定状态
# 再次查看状态,确认目标网卡驱动已变为 igb_uio
dpdk-devbind.py --status
在输出中找到对应 PCI 地址,确认其 Driver 字段显示为 igb_uio。同时可使用系统命令交叉验证:
# 查看该 PCI 设备当前关联的内核驱动
lspci -ks 0000:02:00.0
预期输出中 Kernel driver in use: igb_uio 即表示绑定成功。
验证判定标准
dpdk-devbind.py --status输出中目标网卡的Driver字段为igb_uio。lspci -ks <PCI地址>显示Kernel driver in use: igb_uio。- 绑定后该网卡的网络接口(如
eth0)从系统中消失(ip link不再显示),表明已完全脱离内核网络协议栈。
常见问题
- 模块加载失败:确认内核头文件版本与 DPDK 编译时一致,重新编译
igb_uio模块。 - 绑定失败提示 Device is busy:先执行
ip link set <接口名> down关闭接口,再解绑。 - VFIO 替代:若系统支持 IOMMU,可优先使用
vfio-pci驱动(modprobe vfio-pci),功能更完善;igb_uio适用于无 IOMMU 或简单场景。
完成上述步骤后,该网卡即可被 DPDK 示例程序(如 dpdk-helloworld)识别并接管。