參考: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
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目前安裝主要支持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示例:
cpu {
main-core 18 #vpp主進程綁定到第18核上
}
#interactive加上的作用就是你在啓動vpp時,直接進入交互界面
unix {
interactive cli-listen 127.0.0.1:5002 #vpp交互設置,可以telnet 127.0.0.1 5002進行登錄
log /tmp/vpp.log
full-coredump
}
dpdk {
uio-driver igb_uio #這裏只是說vpp使用igb_uio作爲網卡的驅動,但不會自己加載igb_uio,igb_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->外部網絡
vhost創建:
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