VMware_ubuntu_vpp_dpdk安装运行

ubuntu系统运行2101版vpp

安装虚拟机(VMware或者VirtualBox均可),只添加一张NAT模式的网卡,用来访问外网

vpp编译安装运行
  1. 下载vpp源码
git clone https://github.com/FDio/vpp.git fdio-vpp
cd fdio-vpp
  1. 查看分支,切换到所需分支(以2101版本为例)
git branch -a
git checkout -b stable_2101 remotes/origin/stable/2101
  1. 编译vpp源码
# 首次编译可执行vpp自带的脚本,所有环境都会准备好
./extras/vagrant/build.sh

注意:在编译时报错,可能是机器内存不够,4G内存时会报一个ipsec的错误,虚拟机分配了8G内存就没有报错了

上述命令执行完毕后,vpp 配置文件目录 /etc/vpp/startup.conf

  1. 启动vpp service vpp start,查看vpp运行状态 systemctl status vpp

  2. 虚拟机添加两张主机模式的网卡

  3. 加载vfio-pci驱动 modprobe vfio-pci

  4. 重启vpp生效,命令: service vpp restart

vpp+dpdk环境部署完毕

PS. 执行make test 可以跑vpp自带的全部测试项目,跑之前需将原有的vpp服务停掉service vpp stop


最开始搭建环境时,对一些步骤不熟悉,导致走了许多弯路,也碰到了各种问题,下面是一些问题合集,基本的坑全在下面了。
virtualbox 开启VX-t

因虚拟机这一项勾选框是灰色的,可采用windows命令行开启

在这里插入图片描述
进到VirtualBox的安装目录,执行如下所示命令:

VBoxManage.exe list vms
>>> "ubuntu-dsk" {27c2cecb-0e39-4dcf-926f-a92e66583ac6}

VBoxManage.exe modifyvm "ubuntu-dsk" --nested-hw-virt on
virtualbox添加两张网卡
  • NAT模式 - 用来连接外网,这个地址主机是ping不通的
  • Host-Only(主机模式) - 主机访问虚拟机,samba访问的地址
虚拟机设置与安装

虚拟机:VMware 16.1.1 (SVN 开发工具)
系统版本:ubuntu-18.04.5-live-server-amd64.iso

注意:ubuntu-server安装需要断开网络连接,否则安装后期会一直报错

虚拟机网络模式设置

可参考文档说明,几种网络模式区别,进行选择
参考文档:https://blog.csdn.net/fancyop/article/details/90461379

注意:在虚拟机安装前网卡如已选择多张,在安装时会分配好网络配置,无需手动修改,如后期根据需要额外添加网卡,则需手动配置网络

添加两张网卡
  • NAT模式 - 用来连接外网
    • 对应宿主机网络适配器VMnet8
    • 宿主机上VMnet8配置IP地址,即可控制虚拟机IP地址自动分配的段
  • Host-Only(主机模式)
    • 对应宿主机网络适配器VMnet1
Ubuntu server 18.04网络配置

新增一张网卡后,开机,如需进行地址分配,可参考如下操作

# yaml文件名字根据实际情况
sudo vi /etc/netplan/00-installer-config.yaml

# 默认有一个网卡配置,双网卡需再新增一个
# 动态分配IP
network:
  ethernets:
    # 原本存在的
    ens33:
      dhcp4: true
    # 新增的
    ens38:
       dhcp4: true
  version: 2

# 配置静态IP
network:
  ethernets:
    # 原本存在的
    ens33:
      dhcp4: true
    # 新增的
    ens38:
       addresses: [1.1.1.1/24]
       dhcp4: false
  version: 2

修改完毕后,执行如下两步生效

sudo netplan apply
reboot

VPP编译安装运行

git clone https://github.com/FDio/vpp.git fdio-vpp
cd fdio-vpp

# 查看分支,切换到所需分支
git branch -a

#此处使用的是2101分支
git checkout -b stable_2101 remotes/origin/stable/2101

#首次编译可执行vpp自带的脚本,可将vpp环境完全部署好
./extras/vagrant/build.sh

也可以按步执行如下命令

# 分步执行的命令
make install-dep
make install-ext-deps

#编译release版本
make build-release

#编译debug版本
make build

# build deb包
make pkg-deb

# 安装 vpp packages
dpkg -i build-root/*.deb

# 上一步可能报错,报错 vpp-api-python 不成功
# 使用 apt --fix-broken install即可解决

release版本编译成功后,vpp配置文件目录
fdio-vpp/build-root/install-vpp-native/vpp/etc/vpp/

vpp 可执行文件目录
fdio-vpp/build-root/install-vpp-native/vpp/bin/

debug版本路径:
fdio-vpp/build-root/install-vpp_debug-native/vpp/

运行vpp几种方法

对应版本目录下运行
# release版本
cd fdio-vpp/build-root/install-vpp-native/vpp/bin/
./vpp -c ../etc/vpp/startup.conf

# 进入vpp cli命令行
cd fdio-vpp/build-root/install-vpp-native/vpp/bin/
./vppctl
make命令行运行
# 方便起见,可将配置文件拷贝到指定目录,如/etc/vpp/
mkdir -p /etc/vpp/
cp fdio-vpp/build-root/install-vpp-native/vpp/etc/vpp/startup.conf /etc/vpp/

# 在vpp源码所在目录执行
# release 版本运行, 且指定startup.conf文件路径
make run-release STARTUP_CONF=/etc/vpp/startup.conf

#debug 版本
make run STARTUP_CONF=/etc/vpp/startup.conf

如不指定配置文件,执行 make run 会执行进入 vpp cli命令行

进行系统配置, 启动vpp

注:./extras/vagrant/build.sh 这一步已经把如下操作执行完了

mkdir -p /etc/vpp
cp build-root/install-vpp-native/vpp/etc/vpp/startup.conf /etc/vpp/
cp build-root/install-vpp-native/vpp/etc/sysctl.d/80-vpp.conf /etc/sysctl.d/

# 启动 vpp
service vpp start

# 查看vpp启动状态
systemctl status vpp.service

# 根据配置文件不同,不同方式进入cli 命令行
#通过telnet 0 5002进入vpp cli命令行
cli-listen localhost:5002

# 执行vppctl进行命令行
cli-listen /run/vpp/cli.sock
配置文件修改
unix {
  nodaemon
  log /var/log/vpp/vpp.log
  full-coredump
  #cli-listen /run/vpp/cli.sock
  cli-listen localhost:5002    //新增,可通过telnet 0 5002进入vpp cli命令行
  gid vpp

  ## run vpp in the interactive mode
  # interactive

  ## do not use colors in terminal output
  # nocolor

  ## do not display banner
  # nobanner
}
若启动vpp报如下错误

执行
./vpp -c ../etc/vpp/startup.conf or make run-release STARTUP_CONF=/etc/vpp/startup.conf

报错:api_segment_config: group vpp does not exist

解决办法有两种:

  1. 修改配置文件, 注释掉gid vpp
  2. 添加用户组,groupadd -f -r vpp
vpp make test

make test 时,要把运行中的vpp进程杀掉
如果在开始download一些.whl文件时报一大堆错误,可能因为网络原因,再重新跑一次可能就好了

dpdk编译安装运行 (vpp编译会包含dpdk,不必另外编译)

查看机器硬件是否支持dpdk:https://core.dpdk.org/supported/

VPP编译后,会自动下载dpdk的压缩包,目录:fdio-vpp/build/external/downloads

# 解压
xz -d dpdk-20.11.tar.xz
tar -xvf dpdk-20.11.tar

cd dpdk-20.11/
meson build
cd build
ninja
# 需 root权限执行
ninja install

# 检查是否安装成功
pkg-config --modversion libdpdk
20.11.0

注意:

  • dpdk编译对meson版本有要求,meson_version: '>= 0.47.1',如果版本不符合要求会有报错提示
  • 系统安装meson方法 sudo apt-get install meson,使用Ubuntu自带的源下载的版本可能比较旧,不符合要求

下载meson最新版本常用方法

sudo apt install python3-pip
pip3 install --user meson

# 安装完成后发现 meson的版本还是旧的版本,因为 pip安装后,命令默认路径是在~/.local/bin/
# 可通过修改环境变量的查找路径顺序解决
vi ~/.bashrc

# 最后添加一行
`export PATH=~/.local/bin:$PATH`

source ~/.bashrc #使修改生效

如果没有ninja的话,执行如下命令

git clone https://github.com/ninja-build/ninja.git
cd ninja
./configure.py --bootstrap
sudo cp ./ninja /usr/bin/

ninja install报错:

Traceback (most recent call last):
  File "/home/name/.local/bin/meson", line 7, in <module>
    from mesonbuild.mesonmain import main
ModuleNotFoundError: No module named 'mesonbuild'
FAILED: meson-install
/home/name/.local/bin/meson install --no-rebuild
ninja: build stopped: subcommand failed.

sudo ninja install执行

加载dpdk驱动与手动绑定网卡

加载vfio驱动
modprobe vfio-pci

查看是否加载成功

lsmod |grep vfio

vfio_pci               45056  0
vfio_virqfd            16384  1 vfio_pci
vfio_iommu_type1       24576  0
vfio                   28672  2 vfio_iommu_type1,vfio_pci
irqbypass              16384  2 vfio_pci,kvm

查看要绑定网卡的bus info
ethtool -i ens01
=> bus-info: 0000:02:06.0

down掉要绑定的网卡
ifconfig ens01 down

使用dpdk提供的tool
路径:dpdk-20.11/usertools/

查看网卡状态
./dpdk-devbind.py -s

未绑定前
在这里插入图片描述
手动进行绑定,vpp启动时会自动绑定down掉的网卡
./dpdk-devbind.py -b vfio-pci 0000:02:06.0

绑定后状态
在这里插入图片描述
如果手动执行绑定命令时报如下错误:
1、Warning: routing table indicates that interface 0000:02:06.0 is active. Not modifying
=> 绑定网卡没有down掉

2、

Error: bind failed for 0000:02:06.0 - Cannot bind to driver vfio-pci
Error: unbind failed for 0000:02:06.0 - Cannot open /sys/bus/pci/drivers//unbind

# 执行dmesg |tail 报如下错误
[  550.780076] vfio-pci: probe of 0000:02:06.0 failed with error -22
[  550.780119] vfio-pci: probe of 0000:02:06.0 failed with error -22

=> VFIO使用依赖于iommu,几个检查点

  • Linix kernel version >= 3.6.0
  • 内核和BIOS必须支持并配置为使用IO virtualization(例如Intel®VT-d)
  • 使能iommu

解决办法

# 使能 iommu
# 修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX中加入如下配置:
iommu=pt intel_iommu=on

sudo update-grub

reboot

如果修改后发现还是报相同的错误,在虚拟机环境下,是由于虚拟机配置中,虚拟化和iommu选项没有勾选
关机,然后勾选如下图所示选项
在这里插入图片描述
开机,重新加载驱动,执行绑定网卡命令即可成功

查看是否支持VT-d或VT-d是否成功打开

主板支持Intel® VT-x、VT-d
dmesg | grep -e DMAR -e IOMMU

内核支持Intel® VT-x、VT-d

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

参考文档:https://blog.csdn.net/linggang_123/article/details/114394339

修改vpp配置文件,使能dpdk

将注释部分放开,并且修改为正确的PCI address

dpdk {
	## Change default settings for all interfaces
	#dev default {
		## Number of receive queues, enables RSS
		## Default is 1
		#num-rx-queues 3

		......
	#}

	## Whitelist specific interface by specifying PCI address
	#dev 0000:02:06.0
  .......
	## Change UIO driver used by VPP, Options are: igb_uio, vfio-pci,
	## uio_pci_generic or auto (default)
	#uio-driver vfio-pci
  ......
}
vpp+dpdk遇到的问题(手动使能iommu导致的,依开头步骤操作即可正常使用)

以上操作全部正确执行,进入vpp cli命令行,show interface没有绑定的网卡

show logging显示信息如下

notice     dpdk           EAL: Detected 2 lcore(s)
notice     dpdk           EAL: Detected 1 NUMA nodes
notice     dpdk           EAL: Selected IOVA mode 'VA'
notice     dpdk           EAL: No available hugepages reported in hugepages-1048576kB
notice     dpdk           EAL: No free hugepages reported in hugepages-1048576kB
notice     dpdk           EAL: No available hugepages reported in hugepages-1048576kB
notice     dpdk           EAL: Probing VFIO support...
notice     dpdk           EAL: VFIO support initialized
notice     dpdk           EAL: WARNING! Base virtual address hint (0xa80001000 != 0x7f2b80000000) not respected!
notice     dpdk           EAL:    This may cause issues with mapping memory into secondary processes
notice     dpdk           EAL: WARNING! Base virtual address hint (0xec0c61000 != 0x7f277fe00000) not respected!
notice     dpdk           EAL:    This may cause issues with mapping memory into secondary processes
notice     dpdk           EAL: WARNING! Base virtual address hint (0xec18c2000 != 0x7f237fc00000) not respected!
notice     dpdk           EAL:    This may cause issues with mapping memory into secondary processes
notice     dpdk           EAL: WARNING! Base virtual address hint (0xec2523000 != 0x7f1f7fa00000) not respected!
notice     dpdk           EAL:    This may cause issues with mapping memory into secondary processes
notice     dpdk           EAL:   Invalid NUMA socket, default to 0
notice  dpdk EAL:   0000:02:02.0 VFIO group is not viable! Not all devices in IOMMU group bound to VFIO or unbound
notice     dpdk           EAL: Requested device 0000:02:02.0 cannot be used
notice     dpdk           EAL:   Invalid NUMA socket, default to 0
notice  dpdk  EAL:   0000:02:03.0 VFIO group is not viable! Not all devices in IOMMU group bound to VFIO or unbound
notice     dpdk           EAL: Requested device 0000:02:03.0 cannot be used
notice     dpdk           EAL: Bus (pci) probe failed.

报错信息里有这么一句,0000:02:02.0 VFIO group is not viable! Not all devices in IOMMU group bound to VFIO or unbound,网上文档介绍是由于这个iommu group里其他device没有绑定vfio驱动,根据网上介绍,做了如下尝试

设备所在iommu_group的所有设备绑定vfio驱动

注意:此方式有问题,因所有网卡都在一个iommu group中,与vfio驱动绑定后,dpdk就找不到网卡设备了

加载vfio-pci驱动
modprobe vfio-pci

查看网卡设备所属iommu group
ll /sys/bus/pci/devices/0000\:02\:03.0/

=> iommu_group -> ../../../../kernel/iommu_groups/5/

查看设备所在iommu_group的所有设备
ls /sys/kernel/iommu_groups/5/devices/

将设备与对应的驱动解绑
echo 0000:02:01.0 |sudo tee /sys/bus/pci/devices/0000:02:01.0/driver/unbind

查看设备的Vendor和DeviceID
lspci -n -s 0000:02:01.0
=> 02:01.0 0200: 8086:100f (rev 01)

将设备绑定到vfio-pci module
echo 8086 100f |sudo tee /sys/bus/pci/drivers/vfio-pci/new_id

查看是否绑定成功,如果绑定成功,/dev/vfio目录下会出现该device所属的iommu_group号
ls /dev/vfio
=> 5 vfio

启动vpp, show logging 显示DPDK drivers found no Ethernet devices...

另一种绑定网卡方式(启用vfio,禁用iommu)

如果之前使能了iommu,在/etc/default/grub中要移除掉

关闭计划用dpdk接管的网卡接口
ifconfig ens35 down

查询网卡的pci端口号
lspci |grep Ethernet

安装NIC网卡驱动模块并启动非安全NOIOMMU模式
modprobe vfio-pci
echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

注意:机器重启,重新加载驱动,enable_unsafe_noiommu_mode为N

dpdk绑定网卡
./dpdk-devbind.py -b vfio-pci 0000:02:03.0

这种方式可以成功

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值