​该文章目标是得出DPDK绑定网卡脚本,只需修改个别参数即可使用,因此涉及到得其他流程不再具体呈现(如dpdk编译安装,巨页内存配置等)。

针对igb_uio驱动(对应DPDK版本16.11, 操作系统CentOS 7.2)以及vfio-pci驱动(对应DPDK版本20.11,操作系统CentOS 8.4)这两个进行对比说明。

DPDK绑定网卡的简单步骤如下:

  1. 查看网卡名(ifconfig命令查看);
  2. 挂载dpdk驱动(igb_uio或者vfio-pci驱动);
  3. 将网卡down掉(ifconfig xxx down);
  4. 使用dpdk-devbind.py将网卡绑定到指定驱动中(igb_uio或者vfio-pci驱动);
  5. 使用dpdk-devbind.py -s查看绑定网卡信息;

DPDK解绑网卡的简单步骤如下:

  1. 获取网卡名;
  2. 获取网卡bus-info信息;
  3. 获取网卡原始驱动类型;
  4. 使用dpdk-devbind.py将网卡从刚才绑定的驱动中解绑出来;
  5. 在使用dpdk-devbind.py将网卡绑定为第3步骤中得到的网卡类型(复原为原始网卡的驱动类型);
  6. 卸载dpdk驱动(igb_uio或者vfio-pci驱动);
  7. 使用dpdk-devbind.py -s查看绑定网卡信息;
  8. 将网卡up起来(ifconfig xxx up);

1、网卡驱动

1.1、查看网卡名称

[root@LFTF ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.22.137  netmask 255.255.255.0  broadcast 192.168.22.255inet6 fe80::20c:29ff:febe:75a8  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:be:75:a8  txqueuelen 1000  (Ethernet)RX packets 1381  bytes 153689 (150.0 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 1096  bytes 122554 (119.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500ether 00:0c:29:be:75:b2  txqueuelen 1000  (Ethernet)RX packets 80  bytes 9707 (9.4 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens37即为要绑定的网卡

1.2、查看网卡驱动

[root@LFTF ~]# ethtool -i ens37
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:02:05.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

其中driver: e1000即为ens37网卡驱动类型。相关的,还有ixgbe、igbe、i40e等驱动类型。

这里要记录驱动类型driver: e1000和对应的pci地址bus-info:0000:02:05.0这两条信息

2、绑定网卡

2.1、获取网卡名称

[root@LFTF ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.22.137  netmask 255.255.255.0  broadcast 192.168.22.255inet6 fe80::20c:29ff:febe:75a8  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:be:75:a8  txqueuelen 1000  (Ethernet)RX packets 1381  bytes 153689 (150.0 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 1096  bytes 122554 (119.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500ether 00:0c:29:be:75:b2  txqueuelen 1000  (Ethernet)RX packets 80  bytes 9707 (9.4 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens37即为要绑定的网卡

2.2、挂载驱动

igb_uio驱动和vfio-pci驱动使用一个即可,下面只是介绍挂载方法。

2.1.1、挂载igb_uio驱动

首先查看是否已经挂载igb_uio驱动

[root@LFTF kmod]# lsmod | grep igb_uio
[root@LFTF kmod]#

未查询到~

编译dpdk-16.11版本代码,如果选择的是x86_64-native-linuxapp-gcc编译器,会在dpdk-16.11目录下生成一个x86_64-native-linuxapp-gcc文件夹,如下所示:

[root@LFTF ~]# cd /home/dpdk-16.11.5/x86_64-native-linuxapp-gcc
[root@LFTF x86_64-native-linuxapp-gcc]# pwd
/home/dpdk-16.11.5/x86_64-native-linuxapp-gcc
[root@LFTF x86_64-native-linuxapp-gcc]#
[root@LFTF x86_64-native-linuxapp-gcc]# ls
app  build  include  kmod  lib  Makefile
[root@LFTF x86_64-native-linuxapp-gcc]# cd kmod
[root@LFTF kmod]# ls
igb_uio.ko  rte_kni.ko

加载dpdk的igb_uio驱动,首先需要加载完uio内核驱动,然后再加载kmod目录中igb_uio驱动模块,如下所示:

[root@LFTF kmod]# modprobe uio
[root@LFTF kmod]# insmod ./igb_uio.ko

查看igb_uio驱动是否已经加载

[root@LFTF kmod]# lsmod | grep uio
igb_uio                13224  0
uio                    19259  1 igb_uio

已经加载成功!

卸载网卡驱动方法

[root@LFTF kmod]# rmmod  igb_uio

2.1.2、挂载vfio-pci驱动

UIO驱动和VFIO驱动区别如下:

  • VFIO是一个可以安全地把设备I/O、中断、DMA等暴露到用户空间(userspace),从而可以在用户空间完成设备驱动的框架。用户空间直接设备访问,虚拟机设备分配可以获得更高的IO性能。
  • 依赖于IOMMU. vfio-pci
  • 相比于UIO,VFIO更为强健和安全

首先查看是否已经挂载vfio-pci驱动

[root@LFTF ~]# lsmod | grep vfio
[root@LFTF ~]#

未查询到~

修改grub配置,开启vfio支持,检查GRUB配置:

#内核需要配置支持Intel® VT-x、VT-d,内核通过如下命令查看:[root@LFTF ~]# cat /proc/cmdline | grep iommu=pt
[root@LFTF ~]# cat /proc/cmdline | grep intel_iommu=on

没发现则需要添加:

vim  /etc/default/grub
#在下面行中添加:iommu=pt intel_iommu=on
GRUB_CMDLINE_LINUX=
#现在变成了:
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet iommu=pt intel_iommu=on "
# 更新配置和重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

验证下:

[root@LFTF ~]# cat /proc/cmdline | grep intel_iommu=on
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-240.el8.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet iommu=pt intel_iommu=on
[root@LFTF ~]# cat /proc/cmdline | grep iommu=pt
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-240.el8.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet iommu=pt intel_iommu=on

加载网卡驱动

[root@LFTF ~]# modprobe vfio
[root@LFTF ~]# modprobe vfio-pci

查看

[root@LFTF ~]# lsmod | grep vfio_pci
vfio_pci               61440  0
vfio_virqfd            16384  1 vfio_pci
vfio                   36864  2 vfio_iommu_type1,vfio_pci
irqbypass              16384  2 vfio_pci,kvm

卸载网卡驱动方法

[root@LFTF ~]# rmmod vfio-pci

2.3、关闭网卡

再步骤1中查记录网卡信息后,关闭网卡

[root@LFTF ~]# ifconfig down ens37

2.4、绑定网卡

dpdk16.11版本到tools目录下,dpdk20.11版本到usertools目录下。使用脚本./dpdk-devbind.py绑定网卡

#DPDK16.11版本--将ens37网卡绑定到igb_uio驱动
[root@LFTF tools]# ./dpdk-devbind.py --bind=igb_uio ens37
#DPDK20.11版本--将ens37网卡绑定到vfio-pci驱动
[root@LFTF usertools]# ./dpdk-devbind.py --bind=vfio-pci ens37

2.5、查看网卡状态

DPDK16.11版本–将ens37网卡绑定到igb_uio驱动之后网卡状态

[root@LFTF tools]# ./dpdk-devbind.py -sNetwork devices using DPDK-compatible driver
============================================
0000:02:05.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens35 drv=e1000 unused=igb_uio *Active*

DPDK20.11版本–将ens37网卡绑定到vfio-pci驱动驱动之后网卡状态

[root@LFTF usertools]# ./dpdk-devbind.py -sNetwork devices using DPDK-compatible driver
============================================
0000:02:05.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=vfio-pci unused=e1000Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens35 drv=e1000 unused=vfio-pci *Active*

3、解绑网卡

3.1、获取网卡名称

即为步骤2中绑定的网卡名ens37。(由于此时网卡已经由DPDK驱动接管,因此使用系统命令ifconfig获取不到绑定网卡的基本信息)

3.2、获取网卡原始驱动类型

即为步骤1.2中得到的驱动类型driver: e1000

3.3、获取网卡bus-info信息

即为步骤1.2中得到的bus-info:0000:02:05.0

3.4、将网卡从DPDK驱动中解绑

dpdk16.11版本到tools目录下,dpdk20.11版本到usertools目录下。使用脚本./dpdk-devbind.py解绑网卡

#DPDK16.11版本--将ens37网卡解绑
[root@LFTF tools]# ./dpdk-devbind.py -u 0000:02:05.0
#DPDK20.11版本--将ens37网卡解绑
[root@LFTF usertools]#./dpdk-devbind.py -u 0000:02:05.0

3.5、将网卡绑定为网卡原始驱动

#DPDK16.11版本--将ens37网卡绑定到原始e1000驱动
[root@LFTF tools]# ./dpdk-devbind.py -b e1000 0000:02:05.0
#DPDK20.11版本--将ens37网卡解绑
[root@LFTF usertools]#./dpdk-devbind.py -b e1000 0000:02:05.0

3.6、卸载驱动

3.6.1、卸载igb_uio驱动

首先查看是否已经挂载igb_uio驱动

[root@LFTF kmod]# lsmod | grep uio
igb_uio                13224  0
uio                    19259  1 igb_uio

存在igb_uio驱动,开始卸载~

[root@LFTF kmod]# rmmod  igb_uio

3.6.2、卸载vfio-pci驱动

首先查看是否已经挂载vfio-pci驱动

[root@LFTF ~]# lsmod | grep vfio_pci
vfio_pci               61440  0
vfio_virqfd            16384  1 vfio_pci
vfio                   36864  2 vfio_iommu_type1,vfio_pci
irqbypass              16384  2 vfio_pci,kvm

存在vfio-pci驱动,开始卸载~

[root@LFTF ~]# rmmod vfio-pci

3.7、查看网卡状态

DPDK16.11版本–将ens37网卡绑定到原始网卡驱动之后网卡状态

[root@LFTF tools]# ./dpdk-devbind.py -sNetwork devices using DPDK-compatible driver
============================================
<none>Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused= *Active*
0000:02:05.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens37 drv=e1000 unused= Other network devices
=====================
<none>

DPDK20.11版本–将ens37网卡绑定到原始网卡驱动之后网卡状态

[root@LFTF usertools]# ./dpdk-devbind.py -sNetwork devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused= *Active*
0000:02:05.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens37 drv=e1000 unused= No 'Baseband' devices detected
==============================

可以看到,此时网卡已经有系统网卡驱动接管

3.8、启动网卡

[root@LFTF ~]# ifconfig up ens37

4、绑定网卡和解绑网卡脚本

通过上面的步骤,我们可以把绑定网卡和解绑网卡所需要的脚本工具以及驱动整合到一个目录下,然后编写一个脚本来实现一键绑定指定的网卡以及解除绑定后的网卡。

根据上述步骤,将网卡绑定到igb_uio驱动上比vfio-pci驱动多出了一个igb_uio.ko文件(/home/dpdk-16.11.5/x86_64-native-linuxapp-gcc/kmod路径下)。因此以绑定到igb_uio驱动为例,编写出一键绑定网卡的脚本。

首先将kmod目录和tools目录copy到一个文件夹(一是为了写脚本的时候使用相对路径方便,二是不用包含过多dpdk相关文件便于移植使用),如下所示:

[root@LFTF dpdk_bind]# ls
kmod  tools[root@LFTF dpdk_bind]# ll kmod/
total 9176
-rwxr-xr-x. 1 root root  236431 Dec 14 20:14 igb_uio.ko
-rwxr-xr-x. 1 root root 9155150 Dec 14 20:14 rte_kni.ko
[root@LFTF dpdk_bind]# ll tools/
total 112
-rwxr-xr-x. 1 root root  3414 Dec 14 20:13 cpu_layout.py
-rwxr-xr-x. 1 root root 22764 Dec 14 20:13 dpdk-devbind-igb.py
-rwxr-xr-x. 1 root root 22764 Dec 14 20:13 dpdk-devbind-ixgbe.py
-rwxr-xr-x. 1 root root 22764 Dec 14 20:13 dpdk-devbind.py
-rwxr-xr-x. 1 root root 20082 Dec 14 20:13 dpdk-pmdinfo.py
-rwxr-xr-x. 1 root root 14634 Dec 14 20:13 dpdk-setup.sh

4.1、绑定网卡脚本

dpdk_bind目录下创建绑定网卡的脚本dpdk_setup.sh

[root@LFTF dpdk_bind]# ll
total 8
-rwxr-xr-x. 1 root root  435 Dec 14 20:13 dpdk_setup.sh
drwxr-xr-x. 2 root root   40 Dec 14 20:14 kmod
drwxr-xr-x. 2 root root 4096 Dec 14 20:13 tools

内容如下:

[root@LFTF dpdk_bind]# vim dpdk_setup.sh #!/bin/sh#网卡名
uio0=ens37
#uio1=ens38#需要绑定的驱动类型igb_uio或者vfio-pci
pci_type=igb_uio#挂载驱动
modprobe uio
insmod ./kmod/igb_uio.ko#关闭网卡
ifconfig $uio0 down
#ifconfig $uio1 down#绑定网卡到igb_uio
./tools/dpdk-devbind.py --bind=$pci_type $uio0
#./tools/dpdk-devbind.py --bind=$pci_type $uio1 #展示网卡绑定后的状态
./tools/dpdk-devbind.py --status

这里只需要修改要绑定的**网卡名驱动类型**即可

4.2、解绑网卡脚本

dpdk_bind目录下创建解绑网卡的脚本dpdk_remove.sh

[root@LFTF dpdk_bind]# ll
total 8
-rwxr-xr-x. 1 root root    0 Dec 14 20:34 dpdk_remove.sh
-rwxr-xr-x. 1 root root  425 Dec 14 20:32 dpdk_setup.sh
drwxr-xr-x. 2 root root   40 Dec 14 20:14 kmod
drwxr-xr-x. 2 root root 4096 Dec 14 20:13 tools

内容如下:

[root@LFTF dpdk_bind]# vim dpdk_remove.sh #!/bin/sh#pci网卡地址 即bus-info值
pci0=0000:02:05.0
#pci1=0000:02:06.0#网卡名
uio0=ens37
#uio1=ens38#网卡原始驱动类型
pci_type=e1000#将网卡从dpdk驱动中解绑
./tools/dpdk-devbind.py -u $pci0
#./tools/dpdk-devbind.py -u $pci1#将网卡绑定为网卡原始驱动
./tools/dpdk-devbind.py -b $pci_type $pci0
#./tools/dpdk-devbind.py -b $pci_type $pci1#展示网卡解绑后的状态
./tools/dpdk-devbind.py -s#卸载相关驱动
rmmod igb_uio uio#启动网卡
ifconfig $uio0 up
#ifconfig $uio1 up

这里需要修改的参数有pci网卡地址和网卡名和驱动类型

5、参考命令

#查看网卡原始驱动类型
[root@localhost ~]# ethtool -i ens37 | grep driver
driver: e1000#查看网卡对应的bus-info值
[root@localhost ~]# ethtool -i ens37 | grep bus-info
bus-info: 0000:02:05.0#查看网卡对应的传输速率(千兆or万兆)
[root@localhost ~]# ethtool ens37 | grep SpeedSpeed: 1000Mb/s[root@localhost ~]# ethtool en5s0 | grep SpeedSpeed: 10000Mb/s#查看网卡对应的NUMA节点
[root@localhost ~]# ethtool -i ens37 | grep bus-info
bus-info: 0000:02:05.0
[root@localhost ~]# cat /sys/bus/pci/devices/0000\:02\:05.0/numa_node
0

6、网站链接

有关vfio-pci这个驱动绑定脚本可以在下面链接中免费下载获取

DPDK绑定网卡解绑网卡脚本下载

7、总结

记得vfio驱动挂载的时候需要修改grub配置,开启vfio支持。

喜欢点个赞呗~

【DPDK】网卡绑定和解绑步骤相关推荐

  1. DPDK 网卡绑定和解绑

    参考: DPDK网卡绑定和解绑 DPDK的安装与绑定网卡 DPDK 网卡绑定和解绑 注意: 建议不要使用本文的eth0网卡绑定dpdk驱动. 1.进入DPDK目录: $ cd dpdk/tools/ ...

  2. 7月个人:Windows和Linux绑定和解绑ARP 了解ARP命令的用途。 掌握ARP命令的使用。...

    Windows和Linux绑定和解绑ARP 了解ARP命令的用途. 掌握ARP命令的使用. ARP地址解析协议是一个重要的TCP/IP协议,可以用于确定对应ip地址的网卡物理地址.也可以使用人工方式输 ...

  3. 安卓案例:绑定和解绑服务

    安卓案例:绑定和解绑服务 一.运行效果 二.实现步骤 1.创建安卓应用BindUnbindService

  4. android 绑定服务 解绑服务,安卓案例:绑定和解绑服务

    安卓案例:绑定和解绑服务 一.运行效果 二.实现步骤 1.创建安卓应用BindUnbindService 2.准备背景图片background.jpg,放到mipmap目录里 3.布局资源文件acti ...

  5. 11-jQuery的事件绑定和解绑

    [转]11-jQuery的事件绑定和解绑 1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type ( ...

  6. jQuery的事件绑定和解绑

    1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data ( ...

  7. JS事件的绑定和解绑

    /* 事件三要素 1.事件源:在谁的身上绑定事件 2.事件类型:什么事件 3.事件处理函数:当行为发生的时候,执行那一个函数 ==>div.οnclick=function(){} ==> ...

  8. JS中事件的绑定和解绑

    JS中事件的绑定和解绑 一. 了解事件 1. 事件的三要素 2. 事件绑定分类 2-1. dem0级 事件 2-2. dom2级 事件 二. 事件的绑定 1. dom0级 事件 2. dom2级 事件 ...

  9. vue-企业微信绑定和解绑

    一.企业微信绑定解绑 项目中需要对账号进行企业微信的绑定和解绑 企业微信页面显示: <FormItem label="企业微信:">{{account.wechat}} ...

最新文章

  1. 2021年人工神经网络第四次作业 - 第三题Cifar10
  2. ubuntu root用户没有声音(提示”正在等待声音系统响应”)
  3. hdu 5624 KK's Reconstruction(最小生成树)
  4. 正则表达式 转义字符
  5. PDMS二次开发(八)——向PDMS12.1版本迁移
  6. css3中的@font-face你真的了解吗
  7. Assets Error Listings APP-OFA-XXXX (文档 ID 1460268.1)
  8. java定义一个接口shape_定义一个借口shape
  9. iOS 页面切换控制
  10. 计算机试卷分析与反思,试卷分析及教学反思
  11. 国信安web安全——文件上传漏洞
  12. 基于随机游走的personalRank算法
  13. 双模 5G 拍照最强?— X30 Pro 评测
  14. The server time zone value ‘� й ��� ׼ʱ ��‘ is unrecognized or represents more than one time zone.
  15. 今天是我在csdn的1265天
  16. 柠檬桉叶油和deet_驱蚊液评测 | 这种驱蚊液宝宝慎用,毒性太大!
  17. Codeforces 924C Riverside Curio(瞎搞)
  18. Windows 2008R2 +MDT2013+WDS(1)
  19. 漏洞复现-OpenSSL
  20. 深度学习 之受限玻尔兹曼机

热门文章

  1. unhandled system error, NCCL version 2.7.8
  2. 汽车智能化的商业化路径、产业演进及投资机会探讨——附下载链接
  3. 学习记录:启动豌豆荚进入软件界面
  4. 腾讯云mysql安装
  5. lesson5: C++11
  6. Android手机接入usb屏幕失灵,手机屏幕失灵了怎么办?安卓手机屏幕失灵解决方法...
  7. flask+python 实时视频流输出到前台
  8. bootstrap学习心得总结
  9. 加油站会员管理系统用什么好
  10. python编程怎么画三角形的外接圆_python画出三角形外接圆和内切圆的方法