虚拟机环境
- 网卡设置
我这里使用的是ubuntu20,网卡配置至少两张。一张nat用于设置虚拟机ip用于通信,其他的桥接用给dpdk使用。
对于dpdk使用的网卡,在虚拟机的路径下的xxx.vmx文件中增加修改下列的文本,注意:在虚拟机关机情况下修改。(修改此文件的目的是达到多队列网卡的目的)
# X为网卡id
ethernetX.virtualDev = "vmxnet3"
ethernetX.wakeOnPcktRcv = "TRUE"
iommu和大页配置开启:
在/etc/default/grub文件的GRUB_CMDLINE_LINUX添加iommu=pt intel_iommu=on default_hugepagesz=1G hugepagesz=1G hugepages=4
再使用grub-mkconfig -o /boot/grub/grub.cfg
然后执行update-grub再重启虚拟机
- 依赖
虚拟机需要安装一些依赖。如果编译dpdk的时候还出现了其他错误,可以根据报警信息搜索一下。
sudo apt-get install meson
sudo apt install python3-pyelftools
sudo apt-get install build-essential
sudo apt-get install libnuma-dev
- 大页
# 系统默认每个大页的大小是2M, 在这里设置256个大页
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
注意命令需要root权限
DPDK编译
- 编译裁剪
如果你想全部编译就跳过此步骤。
在drivers目录下的各各子目录下的meson.build中,针对subdirs 中的选项,如果不需要可以将其注释或删除
# 这里的build是指定构建的目录,可以替换为你自己指定的目录
meson build
ninja -C (指定到上面的路径)
sudo ninja install -C
# 将dpdk的lib库添加到系统路径
echo "/usr/local/lib64/" >> /etc/ld.so.conf.d/dpdk.conf
sudo ldconfig
# 设置pkg-config路径
echo "export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig" >> /etc/profile
# 加载vfio-pci模块
echo "modprobe vfio-pci" >> /etc/profile
source /etc/profile
# 以下命令用于检查dpdk是否安装好 有输出基本上就没问题
ldconfig -p|grep librte|wc -l
ldconfig -p | grep librte_graph
pkg-config --variable pc_path pkg-config
pkg-config --modversion libdpdk
到此dpdk就安装好了
测试
进入到源代码的examples/helloworld下,直接make然后用root权限执行build下的helloworld程序
EAL: Detected CPU lcores: 4
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 3
hello from core 0
./usertools/dpdk-devbind.py -s #查看网卡信息
./usertools/dpdk-devbind.py -b vfio-pci 后面跟上网卡名,网卡提前需要down
参考:
https://zhuanlan.zhihu.com/p/613149235?utm_id=0