基于DPDK的OVS安装与配置

基于DPDK的OVS安装与配置

说明

最近在研究openvswitch和DPDK结合的应用,ovs和dpdk是什么我就不在这里多说了,本文主要描述一下ovs和dpdk如何安装,与简单的配置,其中涉及的软件版本为OVS(v2.7.0)+DPDK(v16.11)。

本文主要介绍使用centos-7.3 64位系统作为基础环境

相关网站参考

  • [openvswitch releases]
  • [openvswitch github]
  • [Using Open vSwitch with DPDK]
  • [Open vSwitch with DPDK]

准备工作

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

基于DPDK的OVS安装与配置_第1张图片

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

可以看到两个物理网卡已在DPDK-compatible driver这一栏中
基于DPDK的OVS安装与配置_第2张图片

配置大页

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

基于DPDK的OVS安装与配置_第3张图片

[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

基于DPDK的OVS安装与配置_第4张图片

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

你可能感兴趣的:(dpdk,ovs)