基於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