基於DPDK的OVS安裝與配置

基於DPDK的OVS安裝與配置

說明

最近在研究openvswitch和DPDK結合的應用,ovs和dpdk是什麼我就不在這裏多說了,本文主要描述一下ovs和dpdk如何安裝,與簡單的配置,其中涉及的軟件版本爲OVS(v2.7.0)+DPDK(v16.11)。

本文主要介紹使用centos-7.3 64位系統作爲基礎環境

相關網站參考

準備工作

1. 準備編譯環境

[root@dpdk ~]# yum install -y yum install "@Development Tools" automake kernel-tools openssl-devel python-devel python-six checkpolicy selinux-policy-devel bash-completion

2. 安裝linux內核頭文件

[root@dpdk ~]# uname -a
Linux dpdk 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@dpdk ~]# yum install -y kernel-devel-3.10.0-514.el7.x86_64

ps: 先查看當前系統的內核版本,然後下載安裝當前版本相應的軟件包

源碼編譯

ovs版本和dpdk版本最好是對應的,每個ovs版本的readme裏都有描述支持到的dpdk相應版本,下表簡單列一下ovs與dpdk版本對應:

openvswitch DPDK
v2.8.0 v17.05.1
v2.7.0 v16.11
v2.6.0 v16.07
v2.5.0 v2.2

1. 編譯安裝dpdk

從官網下載dpdk源碼

[root@dpdk sdn]# wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.11.tar.gz

編譯DPDK

# 解壓編譯
[root@dpdk sdn]# tar -zxvf dpdk-16.11.tar.gz
[root@dpdk sdn]# cd dpdk-16.11/
[root@dpdk dpdk-16.11]# mkdir -p /usr/src/dpdk
[root@dpdk dpdk-16.11]# make config T=x86_64-native-linuxapp-gcc

# 這一步主要作爲後面編譯ovs使用的dpdk庫
[root@dpdk dpdk-16.11]# make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/src/dpdk

# 這一步是將dpdk正式安裝在當前系統
[root@dpdk dpdk-16.11]# make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr

2. 編譯安裝ovs

從官網下載ovs源碼

[root@dpdk ~]# wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz

編譯ovs

# 解壓編譯
[root@dpdk sdn]# tar -zxvf openvswitch-2.7.0.tar.gz
[root@dpdk sdn]# cd openvswitch-2.7.0/ 
[root@dpdk openvswitch-2.7.0]# ./boot.sh
[root@dpdk openvswitch-2.7.0]# ./configure \
--with-dpdk=/usr/src/dpdk \
--prefix=/usr \
--exec-prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var
[root@dpdk openvswitch-2.7.0]# make
[root@dpdk openvswitch-2.7.0]# make install

或者使用rpmbuild方式編譯
1.修改openvswitch-2.7.0/rhel/openvswitch.spec

# 增加dpdk的選項
%build
./configure --with-dpdk=/usr/src/dpdk --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir}
# 修改libdir文件安裝
%{_libdir}/lib*.so.*
%{_libdir}/lib*.so
這兩行改成:
%{_libdir}/*

2.編譯

[root@dpdk openvswitch-2.7.0]# mkdir -p ~/rpmbuild/SOURCES
[root@dpdk openvswitch-2.7.0]# cp ../openvswitch-2.7.0.tar.gz ~/rpmbuild/SOURCES/
[root@dpdk openvswitch-2.7.0]# rpmbuild -ba --nocheck openvswitch.spec 

3.安裝

[root@dpdk ~]# yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.7.0-1.x86_64.rpm

網卡綁定

在使用ovs前,需要先把物理網卡綁定到dpdk,以供ovs使用

1. 系統設置

系統BIOS需要打開VT-d,並且通過grub配置iommu和intel_iommu參數來支持VFIO驅動,修改/boot/grub2/grub.cfg,找到引導的相應內核參數,在後面添加:
iommu=pt intel_iommu=on,例如,

linux16 /vmlinuz-3.10.0-327.36.2.el7.x86_64 root=/dev/mapper/centos_dell-root ro crashkernel=auto rd.lvm.lv=centos_dell/root rd.lvm.lv=centos_dell/swap nomodeset rhgb quiet iommu=pt intel_iommu=on

可在系統啓動後使用如下命令查看:

[root@dpdk ~]# cat /proc/cmdline

2. 設置dpdk驅動

爲VFIO

[root@dpdk ~]# modprobe vfio-pci

或者爲uio_pci_generic

[root@dpdk ~]# modprobe uio_pci_generic

3. 網卡綁定到dpdk

本例中,將物理網卡p2p2和p2p3綁定到dpdk,綁定後,使用系統命令ifconfig就看不到這兩個網卡了

[root@dpdk ~]# dpdk-devbind --status

這裏寫圖片描述

[root@dpdk ~]# dpdk-devbind --bind=vfio-pci p2p2
[root@dpdk ~]# dpdk-devbind --bind=vfio-pci p2p3

可以看到兩個物理網卡已在DPDK-compatible driver這一欄中
這裏寫圖片描述

配置大頁

1. 查看當前的hugepage

[root@dpdk ~]# grep HugePages_ /proc/meminfo

2. 修改hugepage的頁數爲1024

臨時設置大頁的方法,重啓失效:

[root@dpdk ~]# echo 1024 > /proc/sys/vm/nr_hugepages

配置保存的設置方法,重啓生效:

[root@dpdk ~]# echo 'vm.nr_hugepages=1024' > /etc/sysctl.d/hugepages.conf

ps: 設置1024個hugepage,系統每個page默認佔2M,所以hugepages佔用2G內存

3. 掛載hugepages

[root@dpdk ~]# mount -t hugetlbfs none /dev/hugepages

啓動ovs進程

1. 準備ovs相關路徑

[root@dpdk ~]# mkdir -p /etc/openvswitch
[root@dpdk ~]# mkdir -p /var/run/openvswitch

2. 刪除舊的ovs配置數據和創建新的(可選)

如果不需要舊配置時,可以選擇該操作

[root@dpdk ~]# rm /etc/openvswitch/conf.db
[root@dpdk ~]# ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema

3. 啓動ovsdb server

[root@dpdk ~]# ovsdb-server /etc/openvswitch/conf.db \
-vconsole:emer -vsyslog:err -vfile:info \
--remote=punix:/var/run/openvswitch/db.sock \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir \
--log-file=/var/log/openvswitch/ovsdb-server.log \
--pidfile=/var/run/openvswitch/ovsdb-server.pid \
--detach --monitor

4. 第一次啓動ovs需要初始化

[root@dpdk ~]# ovs-vsctl --no-wait init

5. 初始化dpdk

從ovs-v2.7.0開始,開啓dpdk功能已不是vswitchd進程啓動時指定–dpdk等參數了,而是通過設置ovsdb來開啓dpdk功能

[root@dpdk ~]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

自定義一些dpdk的參數(可選)

# 指定的sockets從hugepages預先分配的內存
[root@dpdk ~]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"

# 指定在某些core上運行
[root@dpdk ~]# ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x02

查看自定義的dpdk參數

[root@dpdk ~]# ovs-vsctl get Open_vSwitch . other_config:dpdk-socket-mem
[root@dpdk ~]# ovs-vsctl get Open_vSwitch . other_config:pmd-cpu-mask
[root@dpdk ~]# ovs-vsctl get Open_vSwitch . other_config:dpdk-init

6. 啓動vswitchd進程

[root@dpdk ~]# ovs-vswitchd unix:/var/run/openvswitch/db.sock \
-vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid \
--detach --monitor

到這裏,ovs和dpdk的安裝就已經結束了,下文簡單講述ovs添加dpdk端口,並寫流表。


ovs工具使用

1. 創建openvswitch網橋

[root@dpdk ~]# ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev

2. 把dpdk端口加入網橋

# 先使用dpdk-devbind命令查看當前已綁定的dpdk網卡,並記住相應的PCI地址
[root@dpdk ~]# dpdk-devbind --status

這裏寫圖片描述

[root@dpdk ~]# ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:03:00.0
[root@dpdk ~]# ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:03:00.1

ovs添加端口,ovs從v2.7.0版本開始,dpdk端口命名可以自定義,而舊版本只能以dpdk(id)格式命名,dpdk-devargs參數指定的就是物理網卡的PCI地址,這就使自定義的dpdk端口名和物理口對應上了。

3. 查看配置

[root@dpdk ~]# ovs-vsctl show

這裏寫圖片描述

4. 連接控制器

[root@dpdk ~]# ovs-vsctl set-controller br0 tcp:x.x.x.x:6633

5. 查看當前流表

[root@dpdk ~]# ovs-ofctl dump-flows br0

6. 查看當前控制器狀態

[root@dpdk ~]# ovs-vsctl list controller br0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章