一、DPDK下载

前面把环境基本搭好,今天开始编译DPDK。首先是下载DPDK的源码,地址是:
https://core.dpdk.org/download/
也可以从官网https://www.dpdk.org/跳过来。然后就可以看到排下载的DPDK的版本:

这里下载的是DPDK 19.11.14(LTS),按网上的资料说,DPDK的编译分为两种情况,19.11(含)前,使用的是Gcc Make,而此后的新版本,可能是为了某些情况,使用了meson ninja。再次提醒一下,最好把环境需要的相关工具准备好,不然编译过程被打断挺麻烦的。
需要的主要工具有:make,gcc(g++,gdb顺道一起装上),python,libnuma-dev
另外,不同的操作系统和不同的DPDK的版本可能需要的相关库也略有不同,根据实际报告的错误安装即可。

官方的安装说明及相关文档地址:
http://core.dpdk.org/doc/archives/

源码下载比较慢,如果不使用镜像,有点耐心。

二、源码编译

1、源码解压

tar -xvf dpdk-19.11.14.tar.xz

得到dpdk-stable-19.11.14文件夹。

2、编译预选项
使用如下命令进入usertools文件夹找dpdk-setup.sh在编译前,执行一下:
第一步:

cd dpdk-stable-19.11.14/usertools
./dpdk-setup.sh

会出来以下画面:

说明整个编译过程需要五个大的步骤,即:选择编译环境,设置Linux环境,运行测试程序,其它工具选项和卸载清理。

3、编译
可以选择65退出也可以CTRL C强行退出:

./dpdk-setup.sh

这里说明一下,从dpdk18开始,就不用提前设置环境变量了,这个在编译早期版本,设置环境变量的方法,网上有很好,此处不再赘述。
上来就是一个翻车现场:

/bin/sh: 2: cc: not found
cat: /home/fpc/dpdk-stable-19.11.14/x86_64-native-linuxapp-gcc/.config_tmp: No such file or directory
Configuration done using x86_64-native-linuxapp-gcc
/home/fpc/dpdk-stable-19.11.14/mk/rte.vars.mk:56: *** RTE_ARCH is not defined.  Stop.
make[2]: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkroot.mk:99: all] Error 2
make[1]: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkinstall.mk:61: pre_install] Error 2
make: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkroot.mk:77: install] Error 2
------------------------------------------------------------------------------RTE_TARGET exported as x86_64-native-linuxapp-gcc
------------------------------------------------------------------------------

无语,没有设置CC编译器,使用GCC -v查看,果然没有安装,使用下面的命令:

sudo apt install gcc
sudo apt install g++
sudo apt install gdb

安装上相关编译器,再次招待可以向下进行。
因为是UBUNTU,所以选择41(x86_64-native-linuxapp-gcc),就会开始编译,这个第一次编译可能会需要一段时间,看机器配置,完成会报告没有错误,但会有如下的消息:

Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined

这个是指需要把编译成功的代码拷贝到指定位置,这个可以不做,所以这里也没有给出错误,只是一个提示。如果非要解决可以在mk文件中修改:

dpdk-setup.sh fails to build with lack of environment variableBuild complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefinedSigned-off-by: Choonho Son <***@gmail.com>
---
usertools/dpdk-setup.sh | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)diff --git a/usertools/dpdk-setup.sh b/usertools/dpdk-setup.sh
index 5eebbce..5248e7a 100755
--- a/usertools/dpdk-setup.sh
+++ b/usertools/dpdk-setup.sh
@@ -65,6 +65,7 @@ setup_target()
{
option=$1
export RTE_TARGET=${TARGETS[option]}
+ export DESTDIR=${DESTDIR:-install}compiler=${RTE_TARGET##*-}
if [ "$compiler" == "icc" ] ; then
@@ -76,7 +77,7 @@ setup_target()
fi
fi
if [ "$QUIT" == "0" ] ; then
- make install T=${RTE_TARGET}
+ make install T=${RTE_TARGET} DESTDIR=${DESTDIR}
fi
echo "------------------------------------------------------------------------------"
echo " RTE_TARGET exported as $RTE_TARGET"

其实就是增加两个指定的环境变量,地址按需要来定义即可。
命令提示为:“press enter to continue …”,回车进入下一步。
第二步:
指定DPDK加载的模块,这里使用48(igb_uio),此处没有什么可说的。成功显示:

unloading any existing DPDK UIO module
loading uio module
loading DPDK UIO module

VFIO:最安全的转发方式,可以添加IOMMU功能
IGB_UIO:候补模式,都安装不上的时候的备选
KNI:Linux系统内核自带的方式
第三步:
设置大页内存,这里选项52(Setup hugepage mapping for NUMA systems)
NUMA,这个是用来支持多CPU效率的。大页设置可以是64,256,这里第一次使用了64,但是在后面测试时有错误,分配不了内存,不知道是不是这个原因,但后来改成了256,就没问题了:

Removing currently reserved hugepages
Unmounting /mnt/huge and removing directoryInput the number of 2048kB hugepages for each nodeExample: to have 128MB of hugepages available per node in a 2MB huge page system,enter '64' to reserve 64 * 2MB pages on each node
Number of pages for node0: 64
Reserving hugepages
Creating /mnt/huge and mounting as hugetlbfs

第四步:
绑定网卡,回车后可以输入53,先查看一下当前网卡的情况,结果报:

/usr/bin/env: ‘python’: No such file or directory软链接:ln -s /usr/bin/python3 /usr/bin/python

已经安装了Python,但是没有做软链接名字改成Python,所以输入:

sudo ln -s /usr/bin/python3  /usr/bin/python

再次执行:

Network devices using kernel driver
===================================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens38 drv=e1000 unused=igb_uio,vfio-pci *Active*
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens160 drv=vmxnet3 unused=igb_uio,vfio-pci *Active*

如果是挂在的IGB_UIO模块,就使用54来绑定网卡
如果是 VFIO模块,使用55来绑定网卡
这里有一个问题,看上面,两个网卡都是Active,在绑定时,会报绑定无效。即:

Enter PCI address of device to bind to IGB UIO driver: 03:00.0
Warning: routing table indicates that interface 0000:03:00.0 is active. Not modifying
OK

所以得先用ifdown命令处理一下:

sudo ifdown ens160

然后可以用ifconfig -a 命令看一下结果。
然后再按54,请输入53时网卡的ID,可以不输入前面的0000,只输入03:00.0即可。如果重复执行,会报已经绑定的提示。
第五步:
开始测试一下前面的配置是否成功,输入58,在前面提到了大内存时输入64,报下面的错误:

Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0xff
Launching app
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL:   probe driver: 15ad:7b0 net_vmxnet3
Interactive-mode selected
Failed to set MTU to 1500 for port 0
testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=203456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
EAL: Error - exiting with code: 1
Cause: Creation of mbuf pool for socket 0 failed: Cannot allocate memoryPress enter to continue ...
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------

有提示,0~7输入0xff,依次算就可以,如果是四个则是0xf.
重新输入52,输入256,再依次下来到58,即报成功:

Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0xff
Launching app
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL:   probe driver: 15ad:7b0 net_vmxnet3
Interactive-mode selected
Failed to set MTU to 1500 for port 0
testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=203456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mcWarning! port-topology=paired and odd forward ports number, the last port will pair with itself.Configuring Port 0 (socket 0)
Port 0: 00:0C:29:98:E3:76
Checking link statuses...
Done

这里仍然有一个小问题,就是设置MTU,但这个似乎没影响测试,此处再回车,会出一些配置的信息,这里就没贴出来了。下面简单说明一下测试命令testpmd的用法:

testpmd> start :开始转发testpmd> stop :停止转发,结束时会显示转发的汇总(收、发、drop)testpmd> quit :退出testpmd示例testpmd> show config fwd:显示当前的配置(端口、核心、流)testpmd> show port stats all :展示所有端口的收发包信息

这样,基本DPDK就安装完成了。

三、总结

基本环境搭建和编译是学习所有工具或者软件的一个麻烦之处,并不在于多难,一个是大家都明白的网络的问题,另外一个是一些小细节不同的版本和OS以及不同的机器都可能出一些莫名其妙的问题。这就需要自己去看着错误消息去思考和在网上查找了。比如前面第一个错误就报CC问题,应该一下就明白没有编译器。
学过JAVA的朋友可能深有体会,所以学习时这个拦路虎很腻歪,弄不好就成为放弃的理由,希望还是要坚持下去。毕竟如今不同以往,网上各种信息还是相当多的。

DPDK系列之二DPDK编译相关推荐

  1. DPDK系列(二)——性能提升

    首先,DPDK和内核网络协议栈不是对等的概念. DPDK只是单纯的从驱动拿数据,然后组织成数据块给人用,跑在用户态.功能相当于linux的设备无关接口层,处于socket之下,驱动之上.只不过linu ...

  2. DPDK盒子使用手册——DPDK入门zz

    https://www.sdnlab.com/20524.html 本章分为两节,第一节介绍数据平面开发套件DPDK(Data Plane Development Kit)的基础知识,第二节介绍DPD ...

  3. 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)

    Table of Contents DPDK应用篇 DPDK与网络功能虚拟化 157.网络功能虚拟化 13.1.1起源 158.发展 159.OPNFV与DPDK NFV的部署 160.NFV的部署 ...

  4. BizTalk学习笔记系列之二:实例说明如何使用BizTalk

    BizTalk学习笔记系列之二:实例说明如何使用BizTalk --.BizTalk学习笔记系列之二<?XML:NAMESPACE PREFIX = O /> Aaron.Gao,2006 ...

  5. .net 面试题系列文章二(附答案)

    .net 面试题系列文章二(附答案) 内容摘要:本文是.net 面试题系列的第二篇,该系列文章是对网上所有.net面试题的收重新集整理後的系列文章,囊括了c#面试题,vb.net面试题,asp.net ...

  6. 《解剖PetShop》系列之二

    PetShop数据访问层之数据库访问设计 <解剖PetShop>系列之二 二.PetShop数据访问层之数据库访问设计 在系列一中,我从整体上分析了PetShop的架构设计,并提及了分层的 ...

  7. 《Windows Communication Foundation之旅》系列之二

    <Windows Communication Foundation之旅>系列之二 三.WCF的技术要素 作为基于SOA(Service Oriented Architecture)的一个框 ...

  8. 缓存系列之二:CDN与其他层面缓存

    缓存系列之二:CDN与其他层面缓存 一:内容分发网络(Content Delivery Network),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能够就近获取,有效降低访问延迟,提升服 ...

  9. 机器视觉及图像处理系列之二(C++,VS2015)——图像级的人脸识别(1)

    机器视觉及图像处理系列之二(C++,VS2015)--图像级的人脸识别(1) 接上一篇,一切顺利的话,你从github上clone下来的整个工程应该已经成功编译并生成dll和exe文件了:同时,Ima ...

最新文章

  1. jggrid应用于asp.net
  2. 项目: 用easyx实现消砖块
  3. 百度SEO站群MTF直播整合导航网站源码 整合各类直播平台
  4. 使用java编写的一个遍历未知维数的数组函数
  5. php csrf jsonp,读取型CSRF(JSONP劫持、CORS跨域资源读取、Flash跨域劫持)
  6. 什么是线程单线程和多线程_什么是多线程?看我多线程七十二变,你能记住吗?...
  7. matlab中常微分方法,MATLAB解常微分方程组的解法(好东西要共享)
  8. 2018-2019-1 20189213《Linux内核原理与分析》第五周作业
  9. 台达 PLC - 高速输入
  10. 配色三部曲-你真懂颜色了吗?
  11. 分布式的Key-Value存储系统voldemort
  12. 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角
  13. 弘辽科技:成立仅5年的拼多多是如何一步步“紧逼”阿里的?
  14. uni-app前端解决跨域的问题
  15. hadoop 2.7.3 版本下载
  16. 万恶之源 - Python基础
  17. C语言中设置文字颜色
  18. java获取首字母字符串首字母
  19. 学习李沐的课程中的问题记录
  20. wiringPi库与bcm_2835区别

热门文章

  1. 阿里云大数据计算服务 - MaxCompute (原名 ODPS)
  2. 【笔试强训】Day 4
  3. 高仿斗鱼TV直播APP源码推荐
  4. oracle数据库中游标的使用,oracle数据库游标的使用方法
  5. 北斗授时(GPS时钟服务器)应用云计算网络系统
  6. 每个程序都应该读的非编程书
  7. eclipse查看源码:has no source attachment,you can attach the source by clicking Attach Source below:
  8. 2019年总结——看清目标,继续向前
  9. 使用OpenAI的Whisper 模型进行语音识别
  10. openGL之API学习(一八九)gl_Position gl_Vertex