Contents

ovs-dpdk系列配置实验-—1. 安装

构建要求

DPDK安装

安装过程参考自这里,有关于构建软件meson的安装补充

下载

1
2
3
4
5
cd /usr/src/
wget https://fast.dpdk.org/rel/dpdk-22.11.1.tar.xz
tar xf dpdk-22.11.1.tar.xz
export DPDK_DIR=/usr/src/dpdk-stable-22.11.1
cd $DPDK_DIR

配置与安装DPDK

注意,这个文件夹里很多命令都需要sudo权限

此外, meson需要手动安装,我使用的是python3.6, 使用pip安装meson,手动指定版本具体命令:

1
2
pip3 install --user meson==0.53.2
meson --version #查看版本,不一定能行,因为它安装在了本地

接下来将meson配置为全局的:

1
2
3
nano ~/.bashrc #在这个文件末尾加入下行这行,然后保存退出
export PATH=$HOME/.local/bin:$PATH
source ~/.bashrc # 这个命令是使f以bash的更改生效

接下来可以编译与安装DPDK了

1
2
3
4
5
export DPDK_BUILD=$DPDK_DIR/build
meson build
ninja -C build
sudo ninja -C build install
sudo ldconfig

安装完后看一下版本,若能输出版本号,说明DPDK安装成功

1
pkg-config --modversion libdpdk

OVS安装

下载好对应的版本安装就行,configure阶段要选用dpdk,不需要安装内核模块,其他的步聚不变,我的一键脚本如下:

安装脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
./configure --with-dpdk
echo ''
echo -e "\033[47;30m end configure \033[0m"
sleep 3

make
echo -e "\033[47;30m end make \033[0m"
sleep 3

sudo make install
echo -e "\033[47;30m end make install \033[0m"
sleep 3

sudo mkdir -p /usr/local/etc/openvswitch
echo -e "\033[47;30m end sudo mkdir -p /usr/local/etc/openvswitch \033[0m"
sleep 3

sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema # 这里没出现找不到路径的问题,可能是安装了内核版本的原因
echo -e "\033[47;30m end ovsdb-tool \033[0m"
sleep 3

sudo mkdir -p /usr/local/var/run/openvswitch
echo -e "\033[47;30m end sudo mkdir -p /usr/local/var/run/openvswitch \033[0m"

sleep 3
sudo 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
echo -e "\033[47;30m end sudo ovsdb-server \033[0m"
sleep 3

sudo ovs-vsctl --no-wait init
echo -e "\033[47;30m end sudo ovs-vsctl --no-wait init \033[0m"
sleep 3

sudo ovs-vswitchd --pidfile --detach --log-file
echo -e "\033[47;30m end sudo ovs-vswitchd --pidfile --detach --log-file \033[0m"
sleep 3

sudo mn --test pingall
echo -e "\033[47;30m end sudo mn --test pingall \033[0m"
sleep 3

echo -e "\033[47;30m show dmesg \033[0m"
dmesg | tail # 这时能查到我们插入源码的信息

把这个脚本放到.sh文件里,文件放到ovs解压后的文件下,再赋运行权限,运行就行

如果输出信息有如下,代表成功了

即 mn –test pingall 的输出结果是通的代表安装成功

卸载脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# 停止其运行
sudo /usr/local/share/openvswitch/scripts/ovs-ctl stop

sleep 2

# 依次删除脚本;还有两个不知道干嘛的
sudo rm -rf /usr/local/share/openvswitch/scripts
sudo rm -rf /usr/local/etc/openvswitch/
sudo rm -rf /usr/local/var/run/openvswitch/

sleep 2

# 移除内核模块
echo 'lsmod | grep openvswitch'
lsmod | grep openvswitch
echo 'sudo rmmod openvswitch'
sudo rmmod openvswitch
echo 'lsmod | grep openvswitch'
lsmod | grep openvswitch


# 若移除内核失败,执行下面两条命令
#    sudo ovs-dpctl show # 查看是否被占用
#    sudo ovs-dpctl del-dp ovs-system # 删除

这个是带内核的卸载脚本,直接用就行,提示没有内核模块不用管

配置

配置大页内存

两种办法,一种是长久配置,一种是运行时配置

1
2
echo 'vm.nr_hugepages=2048' > /etc/sysctl.d/hugepages.conf # 长久配置
sudo sysctl -w vm.nr_hugepages=2048  # where N = No. of 2M huge pages 运行时配置

验证是否配置成功: 我使用的是运行时配置,第一种长久配置没成功

1
grep HugePages_ /proc/meminfo

以上命令输出应该是有结果就算成功, 截图如下:

挂载大内存:

1
sudo mount -t hugetlbfs none /dev/hugepages

挂载完好像没有提示信息,如下:

在DPDK中,使用大页内存可以提高包处理的性能和吞吐量,减少CPU和内存的开销。

在启用大页内存支持后,需要使用内核模块来分配大页内存,然后将其映射到用户空间。

为了映射大页内存,需要将大页内存挂载到文件系统中。‘mount -t hugetlbfs none /dev/hugepages’ 是一条挂载大页内存(Huge Pages Memory)的命令,它的作用是将大页内存挂载到文件系统中,以便用户空间应用程序可以访问大页内存。

但是如果系统重新启动或者重新挂载文件系统,大页内存会被释放. 所需要的大页h内存影响因素见这里.

上述命令放在一个脚本里:

1
2
3
sudo sysctl -w vm.nr_hugepages=2048
grep HugePages_ /proc/meminfo
sudo mount -t hugetlbfs none /dev/hugepages

使用VFIO配置DPDK设备

使用VFIO(Virtual Function I/O)技术可以将DPDK设备绑定到用户空间,从而提高DPDK的性能和可扩展性。VFIO技术提供了一种安全的方式,允许用户空间应用程序直接访问设备资源,而不需要通过内核

要确保系统支持VFIO有两点:内核版本大于3.6, BIOS允许VT-d.

运行以下命令确定VT-d已在BIOS中被允许:

1
dmesg | grep -e DMAR -e IOMMU

有DMAR的相关信息,我的应该是支持VT-d的.(最后一行), 如果不支持,就啥都不输出

运行以下命令确定VT-d在内核处被允许:

1
2
cat /proc/cmdline | grep iommu=pt
cat /proc/cmdline | grep intel_iommu=on

我的没有输出, 看来是内核没开启,需要往grub文件里添加开启参数:

使用命令:

1
sudo nano /etc/default/grub

往文件里的GRUB_CMDLINE_LINUX_DEFAULT行添加 ‘intel_iommu=on iommu=pt’ 有多个使用空格隔开

更新grub配置文件:

1
sudo update-grub

完事之后重启系统, 再输入命令看看有没有输出:

有了,希望开启成功

确定VT-d开启后加载需要的模块并将VFIO绑定到NIC

1
2
3
4
5
sudo modprobe vfio-pci
sudo chmod a+x /dev/vfio
sudo chmod 0666 /dev/vfio/*
sudo /usr/src/dpdk-stable-22.11.1/usertools/dpdk-devbind.py --bind=vfio-pci enp3s0
/usr/src/dpdk-stable-22.11.1/usertools/dpdk-devbind.py --status

上面命令中, dpdk-devbind –status这一行是用来看驱动状态的,会有Network devices using DPDK-compatible driver 或 Network devices using kernel driver. 没绑定时结果如下:

绑定完结果如下:

如果绑定没成功, 就不会没出现DPDK-compatible driver的设备, 而且绑定哪个设备电脑就找不到哪个设备了, 需要重启(别问我怎么知道的)

绑定时可以使用设备名,也可以使用前面那个数,比如在上面截图中我想绑定有线网卡, 下面两个命令都可以使用:

1
2
sudo /usr/src/dpdk-stable-22.11.1/usertools/dpdk-devbind.py --bind=vfio-pci enp3s0
sudo /usr/src/dpdk-stable-22.11.1/usertools/dpdk-devbind.py --bind=vfio-pci 03:00.0

这里绑定没成功时的错误提示:(原因是当时不会开启grub部分的iommu, 后来开启了就绑定成功了),绑完网卡就没了,记录下错误:

错误提示

1
Error: bind failed for 0000:03:00.0 - Cannot bind to driver vfio-pci: [Errno 19] No such device

dmesg信息:

最后面那个-22那个应该就是我的错误,看不懂.

绑定成功了就不会有probe of … 这个错误

配置OVS

命令总结在后面,这里列出每个命令绍其作用

1
2
3
4
export PATH=$PATH:/usr/local/share/openvswitch/scripts
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock # 这两个是导出路径, 但只对当前命令行起作用, 所以重新打开后要重新执行
sudo ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true #这里相当于启动vsctl, 但是后面配置了dpdk参数
sudo ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start # 这里就是启动ovs-ctl了

如果出现 ‘ovs-ctl command not found’类似的错误, 则说明scripts的路径没配置对, 检查安装时scripts的path, 一般就是这个, 注意检查空格什么的, 或者在删除脚本里的路径核对一下. db.sock路径也要检查与安装时的是否相同,否则也会出错.

命令都成功了,不知道为什么最后验证的时候是false…难受啊.

经过几次调试成功开启了dpdk, 截图如下:

之前是false, 因为安装时我就在脚本里写了要启动它, 没有配上dpdk的信息, 后来配置dpdk信息时已经启动过了, 所以查看的时候就老是false. 将ovs-vswitchd关闭重启一下

这里的命令总结如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
export PATH=$PATH:/usr/local/share/openvswitch/scripts
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
# 以上是导出path信息, 注意检查不要出错
sudo /usr/local/share/openvswitch/scripts/ovs-ctl stop
# 先将其关闭, 因为安装ovs时开启过, 这里要重开一下
sudo 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
# 关闭后要重新配置一下数据库
sudo ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
sudo ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start
# 这里是按要求正常启动
sudo ovs-vsctl get Open_vSwitch . dpdk_initialized
# 这里是看有没有启动成功, 如果输出true(如上面截图)就说明成功了

验证

验证命令如下:

1
2
3
sudo ovs-vsctl get Open_vSwitch . dpdk_initialized
ovs-vswitchd --version
sudo ovs-vsctl get Open_vSwitch . dpdk_version

如果输出如下, 则表示安装成功:

添加dpdk网桥并向网桥中添加dpdk接口, 命令如下:

1
2
3
sudo ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
sudo ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:06:00.0
# 上面第二个命令的目的是将物理网卡(最后那一串数是网卡的pci地址, 可以作用dpdk-devbind.py -s命令查看)绑定到ovs网桥br0上, myportnameone 这个是绑定的接口

出错如下:

目前尝试解决方法:

  1. 在grup添加’pci=realloc=on’ 未起作用
  2. 安装’libdpdk-dev’包, 未起作用

将dpdk物理网卡绑定到ovs端口就一直出错, 未找到原因,到此为止吧. 前面的步骤都没问题.

在sudo ovs-vsctl add-br br0 – set bridge br0 datapath_type=netdev 这个命令中设定type为netdev而不是kernel, 即可让数据包的转发在用户态进行而不进入内核态