构建要求
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配置文件:
完事之后重启系统, 再输入命令看看有没有输出:
有了,希望开启成功
确定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 这个是绑定的接口
|
出错如下:
目前尝试解决方法:
- 在grup添加’pci=realloc=on’ 未起作用
- 安装’libdpdk-dev’包, 未起作用
将dpdk物理网卡绑定到ovs端口就一直出错, 未找到原因,到此为止吧. 前面的步骤都没问题.
在sudo ovs-vsctl add-br br0 – set bridge br0 datapath_type=netdev 这个命令中设定type为netdev而不是kernel, 即可让数据包的转发在用户态进行而不进入内核态