虚拟机VMware16+Ubuntu18.04+DPDK20.11.8安装

一、虚拟机设置

1.1 设置网卡

另外添加两个网络适配器,便于测试。

选择网络适配器,点击完成。

点击确定,完成网卡配置。

二、前期准备

#为方便配置,以后都为root身份,输入以下指令
sudo su
[sudo] password for book:(输入密码后enter)

2.1 安装meson、ninja

由于ubuntu18.04自带python2,没有python3,需要安装python3!!!由于篇幅问题,此处不写
通过pip3安装meson、ninja(dpdk20.11以后版本需通过meson+ninja 的编译方式进行编译安装)。

pip3 install meson
pip3 install ninja
ln -s /usr/local/python3/bin/meson /usr/bin/
ln -s /usr/local/python3/bin/ninja /usr/bin/

2.2 设置巨页

修改内核参数(可选2M或1G)

sudo vim /etc/default/grub

#下面序号二选一,1.为2M设置,2.为1G设置,一般选1G设置
#1.2M设置
#在GRUB_CMDLINE_LINUX参数后追加:
hugepages=1024
#如果需要开启immon功能需要追加:
intel_iommu=on iommu=pt

#2.1G设置
#在GRUB_CMDLINE_LINUX参数后追加:
default_hugepagesz=1G hugepagesz=1G hugepages=4 
#如果需要开启intel_iommu功能需要追加:
intel_iommu=on iommu=pt

重新生成引导配置

sudo grub-mkconfig -o /boot/grub/grub.cfg

挂载巨页(1G巨页)

#挂载
sudo mkdir /mnt/huge
sudo mount -t hugetlbfs pagesize=1GB /mnt/huge

#配置启动自动挂载
sudo vim /etc/fstab

#追加自动挂载:
nodev /mnt/huge hugetlbfs pagesize=1GB 0 0

重启并验证

sudo reboot
cat /proc/meminfo |grep -i HugePages
#验证iommu是否成功:
dmesg | grep DMAR

2.3 下载dpdk

dpdk版本:20.11.8
官方下载地址(速度较慢):https://core.dpdk.org/download/
其他下载地址:https://download.csdn.net/download/qq_39467371/87855104
下载完成之后得到压缩文件:dpdk-20.11.8.tar.xz

#解压文件
tar xvJf dpdk-20.11.8.tar.xz

解压完成后,得到dpdk-stable-20.11.8文件夹,进入文件夹

#进入dpdk-stable-20.11.8文件夹
cd dpdk-stable-20.11.8

三、编译源码

3.1 通过meson,ninja编译源码

#meson build会创建一个build文件夹
#如果直接
# meson build
meson -Dbuildtype=debug -Dexamples=ALL -Denable_kmods=true build

#进入build文件夹
cd build
ninja
ninja install
ldconfig

查看网卡状态

#dpdk自带的指令
dpdk_devbind.py -s

输出如下:

3.2 挂载vfio-pci驱动

#down掉第二个网卡
ifconfig ens36 down

没有Active,down成功了。
在这里插入图片描述
绑定成功!!!
在这里插入图片描述

#加载vfio-pci驱动
modprobe vfio-pci

#将enable_unsafe_noiommu_mode设为YES
echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

#绑定网卡
dpdk-devbind.py -b vfio-pci 0000:02:04.0

#查看状态
dpdk_devbind.py -s

注意:刚安装的时候缺少下面这一步,死活绑不上。
echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

四、运行示例代码

4.1 示例一

源码编译完成之后,可以运行官方提供的例程,以helloworld为例(该例程在dpdk-stable-20.11.8/examples/helloworld中)。可以将该例程复制到其他地方后再make
进入helloworld文件夹,查看当前文件夹下的文件

# 查看helloworld文件夹下的文件
ls
# 输出
main.c  Makefile  meson.build
# 执行make
make
# 输出
cc -O3 -include rte_config.h -march=native -mno-avx512f -I/usr/local/include -
DALLOW_EXPERIMENTAL_API main.c -o build/helloworld-shared  -L/usr/local/lib/x86_64-linux-gnu -
Wl,--as-needed -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table 
-lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -
lrte_reorder -lrte_rib -lrte_regexdev -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -
lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -
lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -
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
ln -sf helloworld-shared build/helloworld
# 查看helloworld文件夹下的文件,此时会多出一个build文件夹
ls
# 输出
build  main.c  Makefile  meson.build
# 进入build文件夹
cd build
# 运行helloworld
./helloworld
# 输出
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL:   using IOMMU type 8 (No-IOMMU)
EAL: Ignore mapping IO port bar(4)
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:04.0 (socket 0)
EAL: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 3
hello from core 0

4.2 示例二

进入skeleton文件夹,make,运行。

cd skeleton
make
cd build
./basicfwd -l 1 -n 4

报错了!!!

# 输出
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL:   using IOMMU type 8 (No-IOMMU)
EAL: Ignore mapping IO port bar(4)
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:04.0 (socket 0)
EAL: No legacy callbacks, legacy socket not created
EAL: Error - exiting with code: 1
  Cause: Error: number of ports must be even

Cause: Error: number of ports must be even
导致原因:端口数量不是偶数。
解决方法:再挂载一个网卡。

ifconfig ens38 down
dpdk-devbind.py -b vfio-pci 0000:02:06.0
./basicfwd -l 1 -n 4
# 输出
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL:   using IOMMU type 8 (No-IOMMU)
EAL: Ignore mapping IO port bar(4)
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:04.0 (socket 0)
EAL: Ignore mapping IO port bar(4)
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:06.0 (socket 0)
EAL: No legacy callbacks, legacy socket not created
EAL: Error enabling MSI-X interrupts for fd 17
Port 0 MAC: 00 0c 29 6f 39 2d
EAL: Error enabling MSI-X interrupts for fd 21
Port 1 MAC: 00 0c 29 6f 39 37

Core 1 forwarding packets. [Ctrl+C to quit]

Error enabling MSI-X interrupts for fd 17的报错和中断有关,在虚拟机上使用好像会出现这种情况。

MSI(Message Signaled Interrupts)是一种通过在内存中写入信息来产生中断的方式。

MSI-X(Extended Message Signaled Interrupts)是在MSI的基础上扩展的一种中断方式,它允许设备使用多个独立的中断信号,从而提高了中断处理的效率。

总的来说,MSI-X比MSI更强大,因为它允许设备使用多个中断信号,使得中断处理更加高效。然而,MSI-X需要更多的硬件资源,所以不是所有设备都能使用它。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世尘陌路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值