确定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值解决;