欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于DPDK的OVS安装与配置

程序员文章站 2022-07-07 14:02:28
...

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

基于DPDK的OVS安装与配置

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

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

配置大页

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

[aaa@qq.com ~]# 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预先分配的内存
[aaa@qq.com ~]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"

# 指定在某些core上运行
[aaa@qq.com ~]# 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进程

[aaa@qq.com ~]# 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安装与配置

[aaa@qq.com ~]# ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:03:00.0
[aaa@qq.com ~]# 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. 连接控制器

[aaa@qq.com ~]# 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