环境:
VMware® Workstation 16 Pro 16.2.4
虚拟机系统:Centos 8
DPDK版本:stable-20.11.10
下载源码后,使用meson和ninja编译完成、配置并挂载大页、内核和VFIO设置完成,在dpdk源码目录下的build/example中有可以直接运行的程序:
但是这是使用meson和ninja编译的。使用make编译可以在dpdk源码目录下:
/home/wls/dpdk-stable-20.11.10/examples
这里有源码自带的例子,可以自己使用make编译并运行,也可以自己写程序放在这个目录下编译。
这里编译源码自带的helloworld程序。开头makefile变异就遇到问题:
其中makefile中是这样写的:
# Build using pkg-config variables if possible
ifneq ($(shell $(PKGCONF) --exists libdpdk && echo 0),0)
$(error "no installation of DPDK found")
endif
意思就是libdpdk找不到,网上找答案说使用命令:pkg-config libdpdk --libs找,结果没找到:
Package libdpdk was not found in the pkg-config search path.
Perhaps you should add the directory containing `libdpdk.pc'
to the PKG_CONFIG_PATH environment variable
Package 'libdpdk', required by 'virtual:world', not found
这里解决办法是设置PKG_CONFIG_PATH环境变量为:/usr/local/lib64/pkgconfig/,即执行:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig/
然后问题解决。
如果遇到:
Please define RTE_SDK environment variable
这个问题,解决办法也是一样,设置PKG_CONFIG_PATH环境变量。
编译共享库:
1.make
2.cc -O3 -I/usr/local/include -include rte_config.h -march=native -DALLOW_EXPERIMENTAL_API main.c -o build/helloworld-shared -Wl,--as-needed -L/home/wls/dpdk-stable-20.11.10/build/lib -lrte_node -lrte_graph -lrte_pipeline -lrte_table -lrte_pdump -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_regexdev -lrte_rawdev -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bpf -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs
3.ln -sf helloworld-shared build/helloworld
编译完成后又遇到问题:
[root@localhost helloworld]# ./build/helloworld
./build/helloworld: error while loading shared libraries: librte_eal.so.21: cannot open shared object file: No such file or directory
说动态库找不到,解决办法是设置共享库加载路径:
export LD_LIBRARY_PATH=/home/wls/dpdk-stable-20.11.10/build/lib/:$LD_LIBRARY_PATH
设置完成后,如果没有加载vfio驱动和绑定网卡,需要先加载vfio驱动和绑定网卡。
查看是否加载vfio驱动:lsmod|grep vfio
加载vfio驱动:modprobe vfio-pci
这里我第一次加载vfio驱动是失败了的,因为我同时在使用windows的WSL和虚拟机,控制面板-》程序-》启用或关闭Windows功能中,虚拟机平台这个选项我是勾上的,不然启动不了WSL:
但是要加载VFIO这里是不能勾选的,为了DPDK也只能委屈下我的WSL了。而且虚拟机设置-》处理器-》虚拟化引擎这三个选项都是要勾选的,不然加载vfio会失败。
vfio加载成功后然后需要挂载网卡,运行dpdk-devbind.py --status查看网卡状态:
这里我是要挂载ens192网卡,所以要把ens192 down掉,ifconfig ens192 down,再次查看已经down掉:
然后绑定网卡:dpdk-devbind.py -b vfio-pci 0000:0b:00.0
运行程序,成功:
helloworld和子目录build内容如下:
没有绑定网卡也可以运行,运行结果是这样的:
网卡解绑命令:rmmod vfio-pci
其中DPDK环境配置、环境变量配置、编译命令参考以下文章:
https://www.jianshu.com/p/61c855582921
https://www.cnblogs.com/studywithallofyou/p/17645767.html
欢迎交流!