前言
此系列文章是对自己工作中使用vpp 的总结和从新学习。从毕业到现在也工作好几年了。我开始接触VPP大约是,在2018年开始接触DPDK+VPP 的方案。当时工作的时候自己对于VPP也没有深入学习,但是是对DPDK比较感兴趣,业务大部分时间都去研究DPDK 了和玩游戏了。自己对于VPP的理解还仅限于VPP充当DPDK的协议栈。VPP是面向数据面的,对数据本身的操作。中途换工作,新工作不需要这个方案,自己也就断了对于DPDK和VPP的学习。大约2年的时间没有在研究过这个方案。随着年龄的增长,有时候回顾近几年的工作经、历,我有时候感觉到迷茫.恐惧。我感到了这几年我颓废了,我应该利用业余时间在研究点什么。我决定还是深入研究研究DPDK 和VPP 。
一、VPP是什么
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、VPP安装
2.1 环境
选择ubuntu 版本,也是看到centos 未来的趋势向收费方向走,还是后期使用ubuntu.
**ubuntu **: Ubuntu 9.4.0-1ubuntu1~20.04.1
vpp: stable/2206
下载地址:vpp下载地址
三. VPP 安装
3.1 使用脚本安装
# ./extras/vagrant/build.sh # make
结果
3.2 查询DPDK支持的网卡类型
关闭计划用dpdk接管的网卡接口,并查询其pci端口号,可以通过lspci |grep Ethernet查看。此时需要确认本机物理网卡或虚拟网卡为DPDK支持类型,查询网址查询
3.3 选择NIC网卡驱动模块
为了正常工作,不同物理介质关联层接口(PMD)可能需要不同驱动程序。取决正在使用的PMD,同时加载对应的内核驱动并绑定网络端口。这里网卡可加载模块驱动类型包含uio_pci_generic、igb_uio、vfio-pci等。
目前内核基本都自带vfio-pci或者uio_pci_generic驱动,可满足基本需求,但是igb_uio也有自己的特点,而且从2101版本开始igb_uio被移除了,vpp 2206 版本可以使用uio_pci_generic,VPP 能够正常运行。
注意
- 作为uio_pci_generic替代方案,DPDK包含igb_uio模块。对于一些不支持传统中断的设备,例如虚拟化功能(VF)设备,可能需要使用igb_uio來代替uio_pci_generic。
- 如果启用UEFI安全引导,则Linux可能会禁止在系统上使用UIO。因此,由DPDK使用的设备应绑定到vfio-pci内核模块,而不是使用igb_uio或uio_pci_generic。VFIO内核模块自Linux内核3.6.0版以来已包含在内核中,通常是默认存在的,请查阅您的发行版文档以确保是这样的。此外,要使用VFIO,内核和BIOS必须支持并配置为使用IO虚拟化(如Intel®VT-d)
VPP1801
该版本还需要使用igb_uio 驱动。vpp利用dpdk收包,需要编译igb_uio这个网卡驱动。
两种方式编译igb_uio驱动:
方法一 :下载VPP对应的DPDK版本,然后编译出igb_uio.ko 然后加载上驱动。
方式二 :是修改配置文件,让vpp编译安装dpdk时编译igb_uio驱动。
cd /home/vpp-20.09/build/external/packages vi dpdk.mk # 找到 $(call set,RTE_EAL_IGB_UIO,n) # 把 n 改成 y 并保存退出
推荐使用方法一,这样把dpdk 和vpp 分开编译。效率高。
3.4 加载网卡驱动
因为虚拟机的系统内核为3.10,内置vfio,所以直接加载vfio-pci。读者可根据实际情况选用uio_pci_generic/igb_uio/vfio-pci等。(如果igb_uio,需要单独编译dpdk获取igb_uio.ko,并采用命令insmod igb_uio.ko进行安装)
#0.启动对应驱动模块,此处选用vfio modprobe vfio modprobe vfio-pci #modprobe igb-uio #modprobe uio #modprobe uio_pci_generic #1.如果采用vfio,启动非安全NO IOMMU模式(仅在系统没有IOMMU时) ,启动该选项VPP可自动接管网卡显示在vppctl中 echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
3.5配置静态大页
1.配置大页
# 分配巨页1024*2M=2G echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages // 大页个数 # 后面方法也可行sysctl -w vm.nr_hugepages=2048 # 查看大页分配数目 cat /proc/meminfo| grep Huge
- 配置静态1G大页
配置1G大页只能在系统启动的时候开辟。避免后期1G大业开辟错误
vim /etc/default/grub # 修改 GRUB_CMDLINE_LINUX 这一行并保存退出 GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet default_hugepagesz=1G hugepagesz=1G hugepages=1" # 在尾部添加了 default_hugepagesz(默认大页大小) hugepagesz(大页大小) hugepages(大页个数) # 这里是设置了1个大页内存 大页内存大小是1G linux还支持2M的大页 grub2-mkconfig -o /boot/grub2/grub.cfg reboot # 通过/proc/meminfo 查看大页内存情况 cat /proc/meminfo
查看大业是否配置成功
cat /proc/meminfo |grep Hug
安装vpp 生成的dep表
安装要求,先安装vpp lib ,在安装vpp, 剩下的安装没有顺序。剩下的deb 实在不会区分那就全部安装上。
dpkg i libvppinfra_22.06.0-4~gd03b3bf62_amd64.deb // vpp 底层驱动 lib 库 dpkg i libvppinfra-dev_22.06.0-4~gd03b3bf62_amd64.de // vpp 底层设备 dpkg i vpp_22.06.0-4~gd03b3bf62_amd64.deb // vpp dpkg i vpp-dbg_22.06.0-4~gd03b3bf62_amd64.deb // vpp debug dpkg i vpp-dev_22.06.0-4~gd03b3bf62_amd64.deb // vpp 驱动 dpkg i vpp-plugin-devtools_22.06.0-4~gd03b3bf62_amd64.deb dpkg i vpp-plugin-core_22.06.0-4~gd03b3bf62_amd64.deb dpkg i vpp-plugin-dpdk_22.06.0-4~gd03b3bf62_amd64.deb dpkg i python3-vpp-api_22.06.0-4~gd03b3bf62_amd64.deb // 使用python 相关安装
查看
dpkg -l |grep xx
查看 配置文件
ls /etc/vpp/ startup.conf.default ls /usr/lib/x86_64-linux-gnu/vpp_plugins/ abf_plugin.so dhcp_plugin.so l2tp_plugin.so nat64_plugin.so srv6as_plugin.so acl_plugin.so dispatch_trace_plugin.so l3xc_plugin.so nat66_plugin.so srv6mobile_plugin.so adl_plugin.so dns_plugin.so lacp_plugin.so nat_plugin.so
查看网卡 pci
# lspci|grep Ethernet 02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) 02:06.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) 03:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01) 0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01) root@ubuntu:/home# sudo lshw -class network -businfo Bus info Device Class Description ======================================================= pci@0000:02:01.0 eth2 network 82545EM Gigabit Ethernet Controller (Copper) pci@0000:02:06.0 eth3 network 82545EM Gigabit Ethernet Controller (Copper) pci@0000:03:00.0 network VMXNET3 Ethernet Controller pci@0000:0b:00.0 eth1 network VMXNET3 Ethernet Controller
配置启动文件
需要在配置文件内加入如下信息
unix { nodaemon log /var/log/vpp/vpp.log full-coredump cli-listen /run/vpp/cli.sock //监听 gid vpp } dpdk { ## Whitelist specific interface by specifying PCI address dev 0000:03:00.0 { // 添加自己的网卡pci 地址 用于绑定的网卡 name dpdk0 } }
创建 日志目录
mkdir -p /var/log/vpp
启动vpp
先down 掉绑定的网卡
// 绑定的网卡down 掉 vpp -c /etc/vpp/startup.conf.default & //后台启动
通过vppctl控制台登录服务进行管理
./vppctl -s /run/vpp/cli.sock
思考
- 对于驱动的特点还得是深入了解 igb_uio uio_pci_generic vfio 等NIC驱动?
- 加大对大业的理解