Centos7系统部署OVS-DPDK

确定Open switch的版本以及DPDK的版本选择

通过命令“uname -a”检查Linux系统的内核版本,与Openswitch相对应,防止因内核版本不同导致,例如本服务器使用Centos7系统,

[root@localhost SOURCES]# uname -a

Linux localhost.localdomain 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

内核版本为3.10.0,因此可以安装以下的Open vSwitch版本:

2.0.x、2.6.x~2.9.x

同时,DPDK的对应版本也如下图所示,为了避免出现版本 不对应的问题,防止前期踩坑,这里贴上对应版本;

同时鉴于本Linux的内核版本3.10缘故,推荐使用如下版本的Ovs + DPDK,其他版本Linux系统的内核请自行参照版本选择适合的版本以减少不必要的时间和麻烦:

①Ovs:2.6.x + DPDK:16.07.2

②Ovs:2.7.x + DPDK:16.11.9

③Ovs:2.8.x + DPDK:17.05.2

④Ovs:2.9.x + DPDK:17.11.4

1.安装DPDK,版本:17.11.4
①安装内核开发包:

内核安装包不安装会在编译阶段报错

yum install kernel-devel-$(uname -r)         //根据‘uname -r’查询的内核版本,通过yum下载

例如:本系统Centos7的内核版本为:Linux localhost.localdomain 3.10.0-1162.119.1.el7.x86_64 但是基本上yum源可能不会刚好有你所在的内核版本的内核开发包,因此我们可以手动从镜像站下载:

https://vault.centos.org/7.7.1908/os/x86_64/Packages/kernel-devel-3.10.0-1062.el7.x86_64.rpm 请根据实际内核版本变化进行修改

sudo rpm -ivh /path/to/kernel-devel-3.10.0-1062.el7.x86_64.rpm         //使用rpm命令手动安装

②安装必要插件:

yum install numactl numactl-devel libpcap libpcap-devel autoconf automake libtool -y

③下载DPDK源码、设置环境变量:

cd /opt/          #我们选在 /opt/ 下编译安装DPDK,因为 /opt 通常用于存放第三方应用程序和库。 wget https://fast.dpdk.org/rel/dpdk-17.11.4.tar.xz tar xf dpdk-17.11.4.tar.xz

#添加环境变量的时候要按照实际安装DPDK的路径进行填写,如果实际安装DPDK的路径不是如上所示,需要根据实际需求进行修改

vim /root/.bashrc

export DPDK_DIR=/opt/dpdk-stable-17.11.4                 #这里就是我的DPDK安装目录 export DPDK_TARGET=x86_64-native-linuxapp-gcc export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET export LD_LIBRARY_PATH=$DPDK_DIR/x86_64-native-linuxapp-gcc/lib export PATH=$PATH:/usr/local/ovs/share/openvswitch/scripts export DB_SOCK=/usr/local/ovs/var/run/openvswitch/db.sock

source ~/.bashrc                                                          #使环境变量生效

④编译DPDK源码并安装:

cd /opt/dpdk-stable-17.11.4/

make config T=$DPDK_TARGET

make -j$(nproc) T=$DPDK_TARGET

make install T=$DPDK_TARGET DESTDIR=install

//如果没有安装成功,要检查环境变量和实际DPDK源码所在路径是否一致

#因为没有检查到环境变量导致没安装成功,建议检查环境变量的部分,记得做完需要使其生效,例如下面这个报错

# make install T=$DPDK_TARGET DESTDIR=install make[1]: 对“pre_install”无需做任何事。 /opt/dpdk-stable-17.11.4/mk/rte.vars.mk:61: build/.config: 没有那个文件或目录 /opt/dpdk-stable-17.11.4/mk/rte.vars.mk:84: *** RTE_ARCH is not defined。 停止。 make: *** [install] 错误 2

#

如果提示如下就代表安装成功了

# Build complete [x86_64-native-linuxapp-gcc] ================== Installing install/ Installation in install/ complete

 2.安装Openvwitch,版本:2.9.9      
①安装必要软件:

yum install wget openssl-devel python-sphinx gcc make python-devel openssl-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel python-six selinux-policy-devel python-sphinx unbound-devel -y

②下载Openvswitch源码:

cd /opt/

wget https://www.openvswitch.org/releases/openvswitch-2.9.9.tar.gz

tar -zxvf openvswitch-2.9.9.tar.gz

cd openvswitch-2.9.9

./boot.sh

./configure \

--with-dpdk=$DPDK_BUILD \

--prefix=/usr \ --exec-prefix=/usr \

--sysconfdir=/etc \

--localstatedir=/var

make && make install

安装结果:

'/usr/local/ovs/share/openvswitch/scripts' make[3]: 离开目录“/opt/openvswitch-2.9.9” make[2]: 离开目录“/opt/openvswitch-2.9.9” make[1]: 离开目录“/opt/openvswitch-2.9.9” [root@localhost openvswitch-2.9.9]

没有报错,安装成功了

mkdir -p /etc/openvswitch                                //准备ovs相关路径

mkdir -p /var/run/openvswitch

ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema

//启动OSDB server

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

#第一次启动OVS需要初始化

ovs-vsctl --no-wait init

[root@localhost bin]# ovs-vsctl show

b06eb305-029f-41ff-ade9-177135761f76

3. 配置大页Huge Pages:

Huge Pages涉及到如何分配和管理大页内存(Huge Pages),这是在高性能网络应用中(例如使用 OVS-DPDK)非常关键的设置。

默认情况下:系统尚未配置任何 Huge Pages。

[root@localhost bin]# grep HugePages_ /proc/meminfo

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

echo 1024 > /proc/sys/vm/nr_hugepages //临时设置大页的方法,重启失效 或者也可以

# vim /etc/sysctl.d/hugepages.conf            //永久修改系统中的大页配置,重启后不失效         vm.nr_hugepages=4096                   //建议你为 Huge Pages 分配不超过总内存的 50%-75%, 例如8GB 内存等于 8192MB,所以如果你选择 2MB 的 Huge Pages 大小,最多可以分配 4096 个 Huge Pages

# sysctl -p /etc/sysctl.d/hugepages.conf         //应用使其生效

# mount -t hugetlbfs none /dev/hugepages         //挂载hugepages

# [root@localhost bin]# grep HugePages_ /proc/meminfo         //查看当前Huge Pages的配置情况 HugePages_Total: 3385

HugePages_Free: 3385

HugePages_Rsvd: 0

HugePages_Surp: 0

4.配置DPDK网卡驱动:

[root@localhost bin]# ifconfig

ens18: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

        inet 10.3.101.114 netmask 255.255.255.0 broadcast 10.3.101.255

        ether bc:24:11:8b:99:0e txqueuelen 1000 (Ethernet)

        RX packets 54950 bytes 33695263 (32.1 MiB) 

        RX errors 0 dropped 0 overruns 0 frame 0

        TX packets 34577 bytes 5336059 (5.0 MiB)

        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens19: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

        ether bc:24:11:23:1d:7c txqueuelen 1000 (Ethernet)

        RX packets 43336 bytes 4232851 (4.0 MiB)

        RX errors 0 dropped 7 overruns 0 frame 0

        TX packets 0 bytes 0 (0.0 B)

        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

两张网卡,ens18保持原本网卡驱动不变,针对ens19绑定到DPDK驱动;

# modprobe uio                                                         //加载 uio_pci_generic 模块

# insmod $DPDK_DIR/build/kmod/igb_uio.ko

[root@localhost dpdk-stable-17.11.4]# lsmod | grep igb_uio //验证 igb_uio 模块加载情况

igb_uio         13414         0

uio                 19338         2         uio_pci_generic,igb_uio        

查询检查网络设备是否可以支持绑定到 igb_uio 驱动:

[root@localhost usertools]# dpdk-devbind.py --status

Network devices using DPDK-compatible driver ============================================

<none>

Network devices using kernel driver

===================================

0000:00:12.0 '82540EM Gigabit Ethernet Controller 100e' if=ens18 drv=e1000 unused=igb_uio,vfio-pci,uio_pci_generic *Active*

0000:00:13.0 '82540EM Gigabit Ethernet Controller 100e' if=ens19 drv=e1000 unused=igb_uio,vfio-pci,uio_pci_generic

从 dpdk-devbind.py --status 的输出来看,0000:00:12.0 和 0000:00:13.0 这两个网卡设备仍然在使用内核驱动 e1000,并没有绑定到 igb_uio 驱动程序上。 虽然 igb_uio 出现在 unused 列表中,但这表示设备还没有切换到 igb_uio 驱动。

# dpdk-devbind.py --bind=uio_pci_generic ens19 //使用 dpdk-devbind.py 工具来绑定你的网卡 ens19 到 uio_pci_generic 驱动

如果提示:-bash: dpdk-devbind.py: 未找到命令,没有找到路径,其实是环境变量设置有问题

方法一:添加环境变量

<DPDK_DIR>/usertools/dpdk-devbind.py         //针对安装DPDK路径的 /usertools/ 路径下的dpdk-devbind.py脚本绑定至系统环境变量中

这里我的安装路径是 “/opt/dpdk-stable-17.11.4/usertools” ,

因此 echo "export PATH=$PATH:/opt/dpdk-stable-17.11.4/usertools" >> ~/.bashrc

        source ~/.bashrc

方法二:使用全局路径执行dpdk的绑定网卡脚本:(不推荐) 

/opt/dpdk-stable-17.11.4/usertools/dpdk-devbind.py --bind=uio_pci_generic + 需要绑定的网卡名称

[root@localhost usertools]# dpdk-devbind.py --bind=igb_uio 0000:00:13.0

[root@localhost usertools]# dpdk-devbind.py --status

Network devices using DPDK-compatible driver ============================================ 0000:00:13.0 '82540EM Gigabit Ethernet Controller 100e' drv=igb_uio unused=e1000,vfio-pci,uio_pci_generic

//ens19已经绑定了DPDK驱动了

Network devices using kernel driver

===================================

0000:00:12.0 '82540EM Gigabit Ethernet Controller 100e' if=ens18 drv=e1000 unused=igb_uio,vfio-pci,uio_pci_generic *Active*

5. 启动OVS:
①初始化OVS:

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

//从ovs-v2.7.0开始,开启dpdk功能已不是vswitchd进程启动时指定–dpdk等参数了,而是通过设置ovsdb来开启dpdk功能

②指定DPDK参数(可选):

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="4096,0"

//指定的sockets从hugepages预先分配的内存,根据实际服务器内存大小设置Huge Page,本机设置为4096

ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x02

//指定在某些core上运行(选做),本机没有进行指定

#查看自定义的dpdk参数

ovs-vsctl get Open_vSwitch . other_config:dpdk-socket-mem

ovs-vsctl get Open_vSwitch . other_config:pmd-cpu-mask

ovs-vsctl get Open_vSwitch . other_config:dpdk-init

③启动vswitchd进程:

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

6.配置OVS-dpdk接口绑定:

ovs-vsctl add-br ovs-br0 -- set bridge ovs-br0 datapath_type=netdev

ovs-vsctl add-port ovs-br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:00:13.0

#创建一个名为vlan10的接口,类型为internal

ovs-vsctl add-port ovs-br0 vlan10 -- set Interface vlan10 type=internal

ovs-vsctl set port vlan10 tag=10

ovs-vsctl set port ovs-br0 trunk=10

ip link set up ovs-br0

ip link set up ovs-netdev

ip addr add 192.168.10.10/24 dev vlan10

ip link set up vlan10

[root@localhost openvswitch-2.9.9]# ovs-vsctl show

31c69243-5d10-4c87-a955-e2a0931f1458

        Bridge "ovs-br0"

                Port "vlan10"

                        tag: 10

                        Interface "vlan10"

                                type: internal

                        Port "dpdk0"

                                Interface "dpdk0"

                                        type: dpdk

                                        options: {dpdk-devargs="0000:00:13.0"}

                        Port "ovs-br0"

                                trunks: [10]

                                Interface "ovs-br0"

                                        type: internal

此时,我们创建了一个虚拟接口vlan10,并配置其为Access模式,针对此接口发出的数据报文打上tag=10,并配置桥接口ovs-br0放行vlan10,模式为Trunk;同时物理接口ens19,配置了DPDK

ID为0000:00:13.0;

物理接口绑定DPDK驱动后,将无法通过ifconfig查询到接口状态;

7.配置OVS-DPDK脚本,避免开机后DPDK失效

cd /home/

touch ovs-dpdk.sh

#!/bin/bash

#加载 uio_pci_generic 模块

modprobe uio

insmod $DPDK_DIR/build/kmod/igb_uio.ko

#/使用 dpdk-devbind.py 工具来绑定你的网卡 ens19 到 uio_pci_generic 驱动

dpdk-devbind.py --bind=igb_uio 0000:00:13.0

#准备ovs相关路径

mkdir -p /etc/openvswitch

mkdir -p /var/run/openvswitch

#启动OSDB server

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

#启动vswitchd进程

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需要初始化

ovs-vsctl --no-wait init

#通过设置ovsdb来开启dpdk功能

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

#指定的sockets从hugepages预先分配的内存,根据实际服务器内存大小设置Huge Page,本机设置为4096

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="4096,0"

#配置DPDK接口地址以及开启DPDK接口

ip link set up ovs-br0

ip link set up ovs-netdev

ip addr add 192.168.10.10/24 dev vlan10

ip link set up vlan10

chmod +x ovs-dpdk.sh

此脚本无法添加至/etc/rc.local,使其开机自启,有可能会导致开机失败,只能开机后手动配置脚本

8.报错提示以及解决方法:

由于HugePages设置导致内存分配不足影响开机的问题

通过增大内存或减小HugePages值解决;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值