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)识别并接管。