最近在研究openvswitch和DPDK结合的应用,ovs和dpdk是什么我就不在这里多说了,本文主要描述一下ovs和dpdk如何安装,与简单的配置,其中涉及的软件版本为OVS(v2.7.0)+DPDK(v16.11)。
本文主要介绍使用centos-7.3 64位系统作为基础环境
[root@dpdk ~]# yum install -y yum install "@Development Tools" automake kernel-tools openssl-devel python-devel python-six checkpolicy selinux-policy-devel bash-completion
[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 |
从官网下载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
从官网下载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使用
系统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
为VFIO
[root@dpdk ~]# modprobe vfio-pci
或者为uio_pci_generic
[root@dpdk ~]# modprobe uio_pci_generic
本例中,将物理网卡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这一栏中
[root@dpdk ~]# grep HugePages_ /proc/meminfo
临时设置大页的方法,重启失效:
[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内存
[root@dpdk ~]# mount -t hugetlbfs none /dev/hugepages
[root@dpdk ~]# mkdir -p /etc/openvswitch
[root@dpdk ~]# mkdir -p /var/run/openvswitch
如果不需要旧配置时,可以选择该操作
[root@dpdk ~]# rm /etc/openvswitch/conf.db
[root@dpdk ~]# ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
[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
[root@dpdk ~]# ovs-vsctl --no-wait init
从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
[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端口,并写流表。
[root@dpdk ~]# ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
# 先使用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端口名和物理口对应上了。
[root@dpdk ~]# ovs-vsctl show
[root@dpdk ~]# ovs-vsctl set-controller br0 tcp:x.x.x.x:6633
[root@dpdk ~]# ovs-ofctl dump-flows br0
[root@dpdk ~]# ovs-vsctl list controller br0