OvS-DPDK源码安装+实践的超完整教程
程序员文章站
2022-07-07 14:01:58
...
最近需要扩展OvS-DPDK交换机,最基础的要学会系统的搭建OvS-DPDK环境,故记录了在摸索过程中的笔记,包括从OVS-DPDK的安装验证,到简单的实践,小白菜也可以动手实现的超完整版教程~
OvS-DPDK
相比较于Native OvS,减少了内核协议栈的处理、大量cpu中断及上下文切换、锁等,性能提高了不少。对流量的处理都在用户空间完成,通过特殊的驱动可以直接从网卡收数据包交给用户空间处理,不经过内核。
搭建环境
由于硬件不足,先用virtualbox虚拟机搭建环境调试。
- Ubuntu16.04.6-server
- Ovs2.11.0
- DPDK18.11.0
前期准备
安装必需工具和依赖
apt-get update
apt-get install -y gcc python numactl libnuma-dev make autoconf automake libtool build-essential openssl desktop-file-utils groff graphviz checkpolicy python-sphinx python-twisted-core
apt-get install -y build-essential
DPDK安装
- 源码下载
wget http://fast.dpdk.org/rel/dpdk-18.11.tar.xz
tar xf dpdk-18.11.tar.xz
- 执行脚本安装
vim dpdk-install.sh
bash ./dpdk-install.sh
#!/bin/sh
export DPDK_DIR=/usr/src/dpdk-18.11
cd $DPDK_DIR
export DPDK_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
make install T=$DPDK_TARGET DESTDIR=install
注意,DESTDIR指定安装目录。 如果没有T参数和DESTDIR参数或者环境变量,默认安装到/usr/local下面。
这里的DESTDIR=install,会使得DPDK安装目录变成/usr/src/dpdk-18.11/install;即当前目录下的install文件夹。也可以换成DESTDIR=/usr/local或者其他目录。
- 验证,安装完成会输出complete信息
静态库:在/usr/src/dpdk-stable-17.11.3/install/lib下面可以看到libdpdk.a以及所有以librte_开头的文件
头文件在/usr/src/dpdk-stable-17.11.3/install/include/dpdk目录下。
OvS-DPDK安装
- 源码下载
wget https://www.openvswitch.org/releases/openvswitch-2.11.0.tar.gz
tar -zxvf openvswitch-2.11.0.tar.gz
- 执行安装脚本安装
vim dpdk-install.sh
bash ./dpdk-install.sh
#!/bin/sh
export OVS_DIR=/usr/src/openvswitch-2.11.0
export DPDK_DIR=/usr/src/dpdk-18.11
export DPDK_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
cd $OVS_DIR
./configure --with-dpdk=$DPDK_BUILD
make
make install
设置大页内存
- 设置大页, 共512个hugepage,每个page 2M,所以hugepages就占用1G内存
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
# 可以验证是否设置成功
grep Huge /proc/meminfo
- 挂载
mount -t hugetlbfs none /dev/hugepages
- 加载uio驱动
官网文档推荐用vfio驱动,但是由于我用的虚拟机不支持虚拟化,就直接用uio了。- 绑定的网卡不能是Active的,如果是需要ifconfig把它down了之后再绑定
- –bind的参数igb_uio,默认是使用e1000驱动
- 绑定成功后可以看到绑定了DPDK的网卡和非DPDK的网卡
export DPDK_DIR=/usr/src/dpdk-18.11
modprobe uio
modprobe uio_pci_generic
insmod $DPDK_DIR/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
$DPDK_DIR/usertools/dpdk-devbind.py --status
$DPDK_DIR/usertools/dpdk-devbind.py --bind=igb_uio 0000:00:08.0
# $DPDK_DIR/usertools/dpdk-devbind.py --bind=igb_uio enp0s8
$DPDK_DIR/usertools/dpdk-devbind.py --status
启动Ovs-dpdk
- 配置&启动数据库
- 设置Ovs-dpdk参数
- 启动守护进程
#!/bin/sh
export DPDK_DIR=/usr/src/dpdk-18.11
export OVS_DIR=/usr/src/openvswitch-2.11.0
cd $OVS_DIR
mkdir -p /usr/local/etc/openvswitch
mkdir -p /usr/local/var/run/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
mkdir -p /usr/local/var/log/openvswitch
ovs-vsctl --no-wait init
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach --log-file
export PATH=$PATH:/usr/local/share/openvswitch/scripts
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start
验证结果
$ovs-vsctl get Open_vSwitch . dpdk_initialized
true
$ovs-vswitchd --version
ovs-vswitchd (Open vSwitch) 2.11.0
DPDK 18.11.0
$ovs-vsctl get Open_vSwitch . dpdk_version
"DPDK 18.11.0"
- 创建网桥br0,并绑定DPDK端口
ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:06:00.0