vpp+dpdk 安装与运行

参考:http://blog.csdn.net/icebluechao/article/details/51208560  (感谢 VPP&DPDK 417538415的群主,欢迎加入此群共同学习)


vpp主页:https://wiki.fd.io/view/VPP


一、获取vpp:

1、git方式(https://wiki.fd.io/view/VPP/Pulling,_Building,_Running,_Hacking_and_Pushing_VPP_Code

    gitclone https://gerrit.fd.io/r/vpp,获取简单,也是最新的代码,不是release版本

2、yum方式(https://wiki.fd.io/view/VPP/Installing_VPP_binaries_from_packages         

 Add fd.io repo

 [Collapse

CentOS 7.2 - VPP Release RPMs (VPP 16.09)

Create a file /etc/yum.repos.d/fdio-release.repo with contents:

[fdio-release]
name=fd.io release branch latest merge
baseurl=https://nexus.fd.io/content/repositories/fd.io.centos7/
enabled=1
gpgcheck=0

这种方式获取的事rpm,对于研发来说不太方便

3、发行版压缩包方式(https://git.fd.io/cgit/vpp/)

 开发建议使用这种方式,不用每天对比vpp代码,因为vpp代码每天都在更新!vpp主页->Getting the Current Release (16.xx)->Download a vpp tarball vpp。主页版本更新有点慢,外面显示的是16.09,其实里面是16.06。06.09改动还有点大,最大的区别就是09把插件独立出来了,最好获取16.09以后的代码。
备注:发行版压缩包方式原来可以直接下载tar包,现在找不到了
二、编译安装
参考icebluechao的专栏

VPP目前安装主要支持debian和redhat系,本人在CentOS7(64)上验证。编译机一定要联网!
1、  根据上面获取源码
2、  进入目录并且安装: cd vpp; make install-dep;这一步的主要作用就是下载vpp环境所需的依赖包,这一步相当重要,一定要仔细查看执行情况,若有问题,一定要一一解决,不然在后面编译问题多,基本就是在环境搭建的第一次执行。
3、  生成Makefile: cd vpp/build-root; make distclean && /bootstrap.sh;  脚本/bootstrap.sh执行要完全无错误
4、  执行make,如下图所示

        开发一般编译测试版,执行make build编译vpp主程序,执行make plugins编译插件,make wipe清除,带有release的就是发型版本了。dpdk不用专门下载,在执行make build的时候会自动下载dpdk到vpp/dpdk目录下。
只要执行make build和make plugins后,vpp基本就编译成功了

编译成功后vpp位置: vpp/build-root/install-vpp-native/vpp/bin/vpp 
编译成功后插件位置:vpp/build-root/install-vpp-native/plugins/lib64/vpp_plugins/
igb_uio.ko位置:vpp/build-root/install-vpp-native/dpdk/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko
                        vpp/build-root/install-vpp-native/dpdk/kmod/igb_uio.ko

igb_uio.ko可以说是dpdk编译后生成的网卡驱动,vpp好像不能自动加载igb_uio.ko,需要自己手动加载 insmod igb_uio.ko

vpp运行加载插件默认位置是/usr/lib/vpp_plugins/ ,没有yum安装过vpp的话需要自己手动创建这个目录

三、配置文件

vpp默认配置文件位置在/etc/vpp/startup.conf, -c 参数可以指定startup.conf配置文件。

配置文件参考:http://blog.csdn.net/icebluechao/article/details/51615503
                        https://wiki.fd.io/view/VPP/Command-line_Arguments

配置文件startup.conf示例:

详细参考https://wiki.fd.io/view/VPP/Using_VPP_In_A_Multi-thread_Model
cpu {

 main-core 18   #vpp主进程绑定到第18核上 #corelist-workers  4-5,20-21,workers 3  
}

#interactive加上的作用就是你在启动vpp时,直接进入交互界面
unix {
  interactive cli-listen 127.0.0.1:5002 #vpp交互设置,可以telnet 127.0.0.1 5002进行登录
  log /tmp/vpp.log
  full-coredump #gdb core
}

dpdk {
    uio-driver igb_uio #这里只是说vpp使用igb_uio作为网卡的驱动,但不会自己加载igb_uioigb_uio需要自己加载insmod igb_uio.ko
    dev 0000:02:05.0  #将网卡和上面的igb_uio 进行绑定0000:02:05.0这是网卡的pci编号(lspci | grep Ethernet 查看网卡对应的pci编号)
    dev 0000:02:06.0
    dev 0000:02:07.0
    vdev eth_bond0,mode=2,slave=0000:02:06.0,slave=0000:02:07.0,xmit_policy=l34 #这个设置是将2个物理网卡绑定成一个使用
    socket-mem 512,512  #有numa的设置2个,没有numa的只设置一个就行了,设置的大小 <= free大页的大小,不然启动不了
}

api-trace {
  on
}

注意:要绑定的网卡一定要down掉

四、运行vpp

vpp运行环境:
1、加载 igb_uio.ko(也可是其他的,例如vfio-pci),
2、 设置物理机支持大页(参考https://software.intel.com/zh-cn/articles/using-open-vswitch-with-dpdk-for-inter-vm-nfv-applications?utm_source=CSDN.com&utm_medium=Syndication&utm_campaign=MC_PRC_Q4-15_syndication)。
      手动设置(不推荐)
              echo 10 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages (10G)
              echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages    (2G)

运行:vpp/build-root/install-vpp-native/vpp/bin/vpp -c /etc/vpp/startup.conf


五、测试环境
A:vpp基本测试


基本测试按照这个拓扑就可以了。
简单转发:vpp转发从port0进,port1出,
虚拟机和外部机器测试:vm->vhost->vpp->port0->外部网络
vm通过vhostuser接口和vpp连接

vhostuser创建:
vpp#create vhost socket /tmp/sock2.sock server
vpp#set interface state VirtualEthernet0/0/0

启动qemu虚拟机时绑定这个vhost口(参考https://software.intel.com/zh-cn/articles/using-open-vswitch-with-dpdk-for-inter-vm-nfv-applications?utm_source=CSDN.com&utm_medium=Syndication&utm_campaign=MC_PRC_Q4-15_syndication关于vhost的接口使用)

vpp支持vrf(l3fib,l2fib),这里的vrf意思是独立的路由表,及其vrf下加入的接口,可以模拟vrouter功能,二层道理一样,可以模拟vswitch

B:VPP多vrf实验

关键配置如下(我现在只发现vrf间用veth进行连接,还没发现其他方法)
参考:https://wiki.fd.io/view/VPP/Tutorial_Routing_and_Switching

将port0和port2接口分配给vrouter0的fib
vpp#set int ip table GigabitEthernet0/0/0 0
vpp#set int ip table GigabitEthernet0/0/2 0

将port1和port3接口分配给vrouter1的fib
vpp#set int ip table GigabitEthernet0/0/1 1
vpp#set int ip table GigabitEthernet0/0/3 1

在物理机上创建vethA,vethB(必须先于下步vpp添加loopback接口的操作)
linux#ip link add vethA type veth peer name vethB

在vpp创建对应vethA,vethB的接口,分别分给不同的vrf
vpp#create host-interface name vethA
vpp#set int ip table vethA 0
vpp#set interface ip address host-vethA 192.168.1.1/24
vpp#set int state host-vethA up

vpp#create host-interface name vethB
vpp#set int ip table vethB 0
vpp#set interface ip address host-vethB 192.168.1.1/24
vpp#set int state host-vethB up

其他:在启动vpp时有时发现hugepage不够,但你已经设置了,分析hugepage请查看http://blog.csdn.net/shaoyunzhe/article/details/54614077

猜你喜欢

转载自blog.csdn.net/shaoyunzhe/article/details/53096932
今日推荐