2. DPDK绑定网卡到IGB_UIO驱动

任务目标

将指定的物理网卡从内核驱动(如 ixgbe、i40e 或 e1000)解绑,改绑到 igb_uio 驱动,使该网卡后续可被 DPDK 应用接管。绑定完成后通过 dpdk-devbind.py --status 确认网卡已处于 drv=igb_uio 状态。

环境准备

  • 已编译并加载 igb_uio 内核模块(通常位于 DPDK 源码 build/kmod/ 目录,或通过 modprobe igb_uio 加载)。
  • 已加载 vfio-pci 或 uio_pci_generic(非必需,但若系统不支持 igb_uio 可作备选)。
  • DPDK 编译产物中包含 dpdk-devbind.py 脚本(路径如 usertools/dpdk-devbind.py)。
  • 确认目标网卡未被系统关键服务占用(如管理网络),操作前建议备份配置。

操作步骤与关键代码

以下命令在 root 权限下执行。首先查看当前网卡绑定状态,确认目标网卡的 PCI 地址(如 0000:03:00.0):

# 查看所有网卡当前驱动绑定情况
./usertools/dpdk-devbind.py --status

# 输出示例(仅示意格式,非实测结果):
# Network devices using DPDK-compatible driver
# ============================================
# (空)
#
# Network devices using kernel driver
# ===================================
# 0000:03:00.0 'Ethernet Controller X540' if=ens3f0 drv=ixgbe unused=igb_uio

将 PCI 地址 0000:03:00.0 的网卡绑定到 igb_uio:

# 绑定到 igb_uio
./usertools/dpdk-devbind.py --bind=igb_uio 0000:03:00.0

# 若系统提示模块未加载,先执行:
modprobe igb_uio

绑定完成后,验证状态:

./usertools/dpdk-devbind.py --status

# 预期输出(确定性结果,与代码逻辑一致):
# Network devices using DPDK-compatible driver
# ============================================
# 0000:03:00.0 'Ethernet Controller X540' drv=igb_uio unused=ixgbe

验证方法与判定标准

  • 状态确认:执行 dpdk-devbind.py --status 后,目标 PCI 地址所在行应显示 drv=igb_uio,且 unused 列表中包含原内核驱动名(如 ixgbe)。
  • 接口消失:绑定后,原网络接口名(如 ens3f0)不再出现在 ip link 输出中,因为该网卡已从内核网络栈摘除。
  • 内核日志:执行 dmesg | tail -20 可看到 igb_uio 成功 probe 该 PCI 设备的相关日志(如 igb_uio 0000:03:00.0: UIO device ready)。

常见问题

  • 绑定失败提示 Operation not permitted:确认使用 root 执行,且 igb_uio 模块已加载(lsmod | grep igb_uio)。
  • 网卡被 vfio-pci 占用:若之前绑定过 vfio,需先解绑:./usertools/dpdk-devbind.py -u 0000:03:00.0,再执行绑定到 igb_uio。
  • 绑定后网络中断:该操作会立即断开此网卡上的网络连接,请通过其他管理通道操作或提前规划。