ubuntu系统运行2101版vpp
安装虚拟机(VMware或者VirtualBox均可),只添加一张NAT模式的网卡,用来访问外网
vpp编译安装运行
- 下载vpp源码
git clone https://github.com/FDio/vpp.git fdio-vpp
cd fdio-vpp
- 查看分支,切换到所需分支(以2101版本为例)
git branch -a
git checkout -b stable_2101 remotes/origin/stable/2101
- 编译vpp源码
# 首次编译可执行vpp自带的脚本,所有环境都会准备好
./extras/vagrant/build.sh
注意:在编译时报错,可能是机器内存不够,4G内存时会报一个ipsec的错误,虚拟机分配了8G内存就没有报错了
上述命令执行完毕后,vpp 配置文件目录 /etc/vpp/startup.conf
-
启动vpp
service vpp start
,查看vpp运行状态systemctl status vpp
-
虚拟机添加两张主机模式的网卡
-
加载vfio-pci驱动
modprobe vfio-pci
-
重启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
解决办法有两种:
- 修改配置文件, 注释掉
gid vpp
- 添加用户组,
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
这种方式可以成功