DPDK(三):入门1

Wesley13
• 阅读 816

一、编译dpdk lib
1、配置编译工具链
make config T=x86_64-native-linuxapp-gcc
2、编译
cd build
make
编译错误一:/root/dpdk-18.11/lib/librte_eal/linuxapp/eal/eal_memory.c:29:18: fatal error: numa.h: No such file or directory
原因:缺少库
解决方法:yum install numactl-devel*x86_64 -y
编译错误二:make: *** /lib/modules/3.10.0-957.1.3.el7.x86_64/build: No such file or directory. Stop.
原因:系统没有安装内核开发包
解决方法:(1)yum install kernel-devel -y (2)ln -s /usr/src/kernels/3.10.0-957.5.1.el7.x86_64 /usr/src/kernels/3.10.0-957.1.3.el7.x86_64
3、结果
编译出来的.a文件在目录/root/dpdk-18.11/build/lib下
二、dpdk用例
1、例1:hello world
(1)编译
cd /root/dpdk-18.11/examples/helloworld
export RTE_SDK=/root/dpdk-18.11
export RTE_TARGET=x86_64-native-linuxapp-gcc
export RTE_TARGET=build
make
会在当前目录生成build目录,里面有编译生成的可执行文件。
(2)运行helloworld
[root@localhost helloworld]# ./build/helloworld
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-2048kB
EAL: No free hugepages reported in hugepages-2048kB
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
PANIC in main():
Cannot init EAL
5: [./build/helloworld() [0x4804df]]
4: [/lib64/libc.so.6(__libc_start_main+0xf5) [0x7fe22c67c3d5]]
3: [./build/helloworld() [0x4774b8]]
2: [./build/helloworld(__rte_panic+0xb8) [0x4609fb]]
1: [./build/helloworld(rte_dump_stack+0x1a) [0x5526ba]]
Aborted (core dumped)
运行环境配有配置,需要配置一下运行环境。
source usertools/dpdk-setup.sh,分别设置18,20,22
然后就可以正常运行了。
[root@localhost dpdk-18.11]# ./examples/helloworld/build/helloworld -l 0-1 -n 4
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Probing VFIO support...
hello from core 0
hello from core 1

2、例子2:Basic Forwarding/Skeleton Application

(1)编译完运行./build/basicfwd -l 1 -n 4
[root@localhost skeleton]# ./build/basicfwd -l 1 -n 4
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Probing VFIO support...
EAL: Error - exiting with code: 1
Cause: Error: number of ports must be even
原因:dpdk没有绑定网卡。
看下服务器的网卡信息,只有一块网卡。
[root@localhost skeleton]# ifconfig
enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.8.93 netmask 255.255.255.0 broadcast 172.19.8.255
inet6 fe80::5246:5dff:fe5b:49be prefixlen 64 scopeid 0x20
ether 50:46:5d:5b:49:be txqueuelen 1000 (Ethernet)
RX packets 765935 bytes 286280011 (273.0 MiB)
RX errors 0 dropped 3 overruns 0 frame 0
TX packets 128062 bytes 13559483 (12.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 22 bytes 1748 (1.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 1748 (1.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
下面我们着手创建两块虚拟网卡,查看dpdk支持的网卡列表,发现也支持tap虚拟网卡。
https://core.dpdk.org/supported/
支持虚拟网卡需要内核版本在4.2以上,可以通过以下命令查询是否支持虚拟tap:
zcat /proc/config.gz | ( grep 'CLS_FLOWER=' || echo 'not supported' ) |
tee -a /dev/stderr | grep -q '=m' &&
lsmod | ( grep cls_flower || echo 'try modprobe cls_flower' )
由于我们的系统内核不能升级,只能用virtualbox创建虚机时多加两块网卡。创建的虚机有三块网卡,下面把其中的两块绑定dpdk

DPDK(三):入门1

(2)网卡绑定dpdk
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Error - no supported modules(DPDK driver) are loaded
原因:uio驱动没有加载。回头看下,source usertools/dpdk-setup.sh,设置18时,报错了:## ERROR: Target does not have the DPDK UIO Kernel Module.To fix, please try to rebuild target.
解决方法:
[root@localhost dpdk-18.11]# modprobe uio
[root@localhost dpdk-18.11]# cd build/kmod/
[root@localhost kmod]# insmod igb_uio.ko
[root@localhost kmod]# lsmod | grep uio
再次运次
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Routing table indicates that interface 0000:00:08.0 is active. Not modifying
原因:接口up无法绑定,先把期望绑定的接口down掉,再绑定。仍然报错。
[root@localhost dpdk-18.11]# ifconfig enp0s8 down
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Error: bind failed for 0000:00:08.0 - Cannot open /sys/bus/pci/drivers/uio_pci_generic/bind
Error: unbind failed for 0000:00:08.0 - Cannot open /sys/bus/pci/drivers//unbind
[root@localhost dpdk-18.11]#
加载驱动 uio_pci_generic,继续绑定,仍然报错。
[root@localhost dpdk-18.11]# modprobe uio_pci_generic
[root@localhost dpdk-18.11]# lsmod | grep uio_pci_generic
uio_pci_generic 12588 0
uio 19338 2 uio_pci_generic,igb_uio
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Unknown device: enp0s8. Please specify device in "bus:slot.func" format
查看一下网卡信息,发现enp0s8网卡不见了。查看一下状态,

DPDK(三):入门1

用id好绑定:
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic 00:08.0
成功。

DPDK(三):入门1

同样绑定第二块网卡。最终状态如下。

DPDK(三):入门1

执行程序:

DPDK(三):入门1

由于虚机和办公网络是通的,一下把办公网络搞挂了。抓包看全是ARP报文。

DPDK(三):入门1

(3)下面对照例子代码,分析为什么用这个IP发包。
答案:其实这个例子本身没有发生三层报文,只是简单的转发了网卡上收到的ARP广播报文,这个报文并不是自身协议栈产生的。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这