1安装环境软件建议版本
GNUmake
coreutils:cmp, sed, grep, arch
gcc:versions >= 4.5.x
libcheaders (glibc-devel.i686 / libc6-dev-i386; glibc-devel.x86_64 for 64-bitcompilation)
Linuxkernel headers or sources required to build kernel modules. (kernel- devel.x86_64)
Additionalpackages required for 32-bit compilation on 64-bit systems are: glibc.i686,libgcc.i686, libstdc++.i686 and glibc-devel.i686
Python,version 2.6 or 2.7
Intel系列网卡
2脚本setup.sh介绍
脚本在tools子目录中,用于自动化创建DPDK运行环境。
2.1脚本功能
脚本在tools子目录中,允许使用者完成以下任务:
1)构建Intel DPDK 库环境。
2)插入和移除Intel DPDK IGB_UIO、VFIO、KNI内核模块。
3)为NUMA和非NUMA体系结构创建和删除大页表(HUGPAGE)。
4)查看网卡状态和为DPDK应用预定网卡。
5)为非root用户提供使用VFIO的权限。
6)运行test和testpmd程序。
7)查看大页表的内存信息。
8)查看/mnt/huge页表。
9)移除Intel DPDK的库环境。
补充说明:
IGB_UIO:自英特尔®DPDK 1.7版本提供了VFIO支持,igb_uio模块的编译和使用已成为可选的平台,支持使用VFIO。必须加载项,用如下命令进行加载:
sudo modprobe uio
sudo insmod kmod/igb_uio.ko
UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少 一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题
VFIO:VFIO是一套用户态驱动框架,可用于编写高效用户态驱动。(详细请访问:
)
KNI: (K Native Interface) SUN在发布的KVM源代码中其实就已经提供KNI(KNative Interface)这套比较标准的API扩展辅助库
2.2脚本步骤
总共分为5步,每一步操作提供一些选项供使用者去创建运行环境。分别简单介绍每一个步骤完成的任务。
1)建立DPDK库环境
首先,用户必须选择正确的对象目标和编译环境。并且,用户的安装环境必须有前面建议的安装环境。
2)安装环境
使用者配置linux 运行环境来使用dpdk应用程序。支持NUMP和非NUMP体系结构。属主环境中存在的大页表都将被删除。这一步会加载相应的内核模块,并且会为DPDK应用绑定相应的网卡(PORT)。
3)运行应用程序
一旦以上步骤完成,使用者可以运行自带的测试程序(test)。TEST应用允许使用DPDK的一些相关函数。Testpmd支持发送和接收数据包。
4)检查系统环境
这一步提供一些工具查看hugepage信息。
5)系统环境清理
可以恢复系统到原来的状态。
3脚本安装示例
如下列子是演示如何使用setup.sh脚本。应该source命令去运行脚本。
用root用户运行脚本。
4setup.sh测试程序
说明:测试程序运行过程是在虚拟机下完成。
4.1虚拟机的搭建
4.1.1创建虚拟机
安装虚拟机和centos6.5。
4.1.2添加两张inetl 千兆网卡
主要添加两张网卡,eth0、eth1、eth2。
Eth1、eth2用于dpdk,eth0用于与主机通信。
在安装目录F:\CentOS_VM\CentOS.vmx文件下添加:
ethernet1.virtualDev = "e1000"
ethernet1.present = "TRUE"
ethernet2.virtualDev = "e1000"
ethernet2.present = "TRUE"
并设置为host only。打开虚拟机查看是否添加成功,使用如下命令进行查询:lspci | grep Ethernet
4.2开始安装脚本
下载源码,从官网上下载,测试版本为dpdk-1.7.0。
4.2.1添加环境变量
exportRTE_SDK=‘pwd‘
#export RTE_TARGET=x86_64-default-linuxapp-gcc
exportRTE_TARGET=i686-default-linuxapp-gcc (这个可能根据自己的目录进行调整)
由于我的是32虚拟机,所以我选择i686,将x86_64那行环境变量注释掉;建议将环境变量写入/etc/profile中。
4.2.2运行setup.sh
./tools/setup.sh
------------------------------------------------------------------------------
RTE_SDK exported as /home/pym/dpdk-1.7.0
------------------------------------------------------------------------------
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1]i686-native-linuxapp-gcc
[2]i686-native-linuxapp-icc
[3]x86_64-ivshmem-linuxapp-gcc
[4]x86_64-ivshmem-linuxapp-icc
[5]x86_64-native-bsdapp-gcc
[6]x86_64-native-linuxapp-gcc
[7]x86_64-native-linuxapp-icc
----------------------------------------------------------
Step 2: Setup linuxapp environment
----------------------------------------------------------
[8]Insert IGB UIO module
[9]Insert VFIO module
[10]Insert KNI module
[11]Setup hugepage mappings for non-NUMA systems
[12]Setup hugepage mappings for NUMA systems
[13]Display current Ethernet device settings
[14]Bind Ethernet device to IGB UIO module
[15]Bind Ethernet device to VFIO module
[16]Setup VFIO permissions
----------------------------------------------------------
Step 3: Run test application for linuxapp environment
----------------------------------------------------------
[17]Run test application ($RTE_TARGET/app/test)
[18]Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
[19]List hugepage info from /proc/meminfo
----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
[20]Uninstall all targets
[21]Unbind NICs from IGB UIO driver
[22]Remove IGB UIO module
[23]Remove VFIO module
[24]Remove KNI module
[25]Remove hugepage mappings
[26]Exit Script
4.2.3根据系统类型选择
测试环境选择1
4.2.4安装IGB_UIO
选择8
进行igb_uio.ko驱动的安装,这个驱动在编译后是,在i686-default-linuxapp-gcc/kmod/ 目录中;其实在安装igb_uio.ko之前,脚本先安装了uio模块,uio是一种用户态驱动的实现机制,dpdk有些东西时基于uio实现的;
4.2.5设置hugepage
选择11
有让你输入预留内存大小的 我输入的是 64 , 64 乘以 2M 可以128M 做个简单的测试够了。
4.2.6进行网卡bind
选择14
让你输入pci的地址, 你只要将0000:02:06.0 中的,0000冒号后面的几位输入就行了, 如 02:06.0 记得标点也要输。
4.2.7选择对应的程序进行测试
选择17或者18
5测试程序运行
主要学习/home/pym/dpdk-1.7.0/examples目录下的测试程序,下面的测试程序有助于我们较快的学习dpdk的用法。
下面学习入门程序helloworld。
5.1编译程序
进入相应目录进行编译,可能要修改Makefile文件,我在测试时修改了如下地方:RTE_TARGET = i686-native-linuxapp-gcc。
5.2运行程序
./build/helloworld -c 0x03 -n 2
-c 绑定cpu核
-n 内存通道数目
其他选项:
EALoptions:
-c COREMASK : A hexadecimal bitmask of cores to run on
-n NUM : Number of memory channels
-v : Display version information on startup
-d LIB.so : add driver (can be used multiple times)
-m MB : memory to allocate (see also --socket-mem)
-r NUM : force number of memory ranks (don't detect)
--xen-dom0 : support application running onXen Domain0 without hugetlbfs
--syslog : set syslog facility
--socket-mem : memory to allocate on specific
sockets (use comma separatedvalues)
--huge-dir : directory where hugetlbfs is mounted
--proc-type : type of this process
--file-prefix: prefix for hugepage filenames
--pci-blacklist, -b: add a PCI device inblack list.
Prevent EAL from using this PCIdevice. The argument
format is<domain:bus:devid.func>.
--pci-whitelist, -w: add a PCI device inwhite list.
Only use the specified PCIdevices. The argument format
is<[domain:]bus:devid.func>. This option can be present
several times (once per device).
[NOTE: PCI whitelist cannot beused with -b option]
--vdev: add a virtual device.
The argument format is<driver><id>[,key=val,...]
(ex:--vdev=eth_pcap0,iface=eth2).
--vmware-tsc-map: use VMware TSC map insteadof native RDTSC
--base-virtaddr: specify base virtual address
--vfio-intr: specify desired interrupt modefor VFIO (legacy|msi|msix)
--create-uio-dev: create /dev/uioX (usuallydone by hotplug)
EALoptions for DEBUG use only:
--no-huge : use malloc instead of hugetlbfs
--no-pci : disable pci
--no-hpet : disable hpet
--no-shconf: no shared config (mmap'd files)
6测试程序功能介绍
主要目的是有针对性进行学习。
6.1 cmdline_test
命令行示例应用程序演示了一个简单的应用程序使用命令行界面的英特尔®DPDK。这个应用程序是一个readline-like接口,可以用来调试一个英特尔®DPDK应用程序,在一个Linux应用程序。
6.2 exception_path
异常路径示例应用程序是一个简单的示例,演示如何使用英特尔®DPDK建立一个异常路径让数据包通过Linux内核。这是通过使用虚拟网络接口来实现。这些数据包可能被英特尔®DPDK应用程序读和写,并且作为一个标准接口出现在内核中。
6.3helloworld
Hello World例子是英特尔®DPDK应用程序中能被写的最简单的例子。这个应用程序对每一个启动lcore的输出helloworld消息。
6.4ip_fragmentation
在IPv4碎片的应用是数据包处理中使用一个简单的例子英特尔®数据平面开发套件(英特尔®DPDK)。该应用程序L3转发IPv4和IPv6的数据包碎片。
6.5ipv4_multicast
在IPv4组播应用程序是使用英特尔®数据平面开发套件(英特尔®DPDK)的数据包处理的一个简单的例子。在应用程序执行L3组播。
6.6ip_reassembly
L3转发应用是一个简单的使用英特尔®DPDK处理数据包的简单的例子。这个应用执行L3转发分片重组的IPV4和IPV6的数据包。
6.7KNI
内核NIC接口(KNI)是一个英特尔®DPDK控制面板解决方案,允许用户空间的应用程序与内核协议栈交换数据包。为了现实这一点,英特尔®DPDK用户空间应用程序使用IOCTL在linux内核上创建一个KNI虚拟设配。IOCTL调用提供接口信息和物理地址空间,地址空间被KII内核加载模块再次映射到内核地址空间,地址空间保存信息到虚拟设备的上下文中。英特尔®DPDK为每一个已分配的设备穿件FIFO队列让数据包进出内核模块。
这个KNI可加载内核模块是一个标准的网络驱动,它能接收从IOCTL调用英特尔®DPDK访问FIFO队列接收/转发来自英特尔®DPDK用户空间应用程序的数据包。在英特尔®DPDK中FIFO队列包含指向数据包的指针。
1)提供一个更快的机制去和内核网络协议栈、系统调用评估交互。
2)有处于英特尔®DPDK使用标准的网络工具。
内核NIC接口是一个简单的应用程序例子,为了说明使用英特尔®DPDK去创建一个路径使数据包通过LINUX 内核。通过为每一个英特尔®DPDK端口创建一个或多个内核网络设配来完成。这个应用程序允许使用标准的linux工具(如ethtool、ifconfig、tcpdump)、英特尔®DPDK共同使用。同时在linux内核和英特尔®DPDK应用程序之间交换数据包。
6.8 后续补充