DPDK编译环境搭建

发布于 2022-07-17  55 次阅读


DPDK编译环境搭建

系统我个人用的debian 10.2, 硬件用的阿里云ECS.S6, 规格1核处理器, 2G内存, 2张网卡, 1M带宽.

安装需要的程序和包

apt install pkgconf gcc-multilib numactl libdpdk-dev linux-headers-$(uname -r)  && pip3 install meson ninja pyelftools

下载源码并解压

curl -O http://fast.dpdk.org/rel/dpdk-21.11.1.tar.xz && xz -d dpdk-21.11.1.tar.xz && tar -xvf dpdk-21.11.1.tar && mv dpdk-stable-21.11.1 dpdk && rm dpdk-21.11.1.tar

编译

cd dpdk && meson build && cd build && ninja && ninja install && ldconfig

加载驱动内核

modprobe uio_pci_generic

配置大页

配置了128个2MB大页内存.

echo 128 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages && mkdir /mnt/huge && mount -t hugetlbfs pagesize=1GB /mnt/huge

检查配置是否成功.

grep -i HugePages_Total /proc/meminfo # 查看大页是否配置成功
mount | grep hugetlbfs # 查看是否挂载成功
cat /proc/meminfo | grep Huge # 查看详细的大页信息

绑定网卡

./usertools/dpdk-devbind.py --bind=uio_pci_generic <device name or <bus>:<device>.<function>

查看网卡具体信息.

./usertools/dpdk-devbind.py --status # 查看网卡具体信息

配置环境变量

vim .bashrc
# export RTE_SDK=/root/dpdk
# export RTE_TARGET=x86_64-native-linuxapp-gcc

TLDK安装

编译安装.

git clone git@github.com:FDio/tldk.git && cd tldk && make all

vpp安装(可选)

直接安装编译好的包, 下面是debian的, 如果你的系统没有好的软件生态则需要自行编译.

curl -s https://packagecloud.io/install/repositories/fdio/release/script.deb.sh | sudo bash && apt update && apt install vpp vpp-plugin-core vpp-plugin-dpdk

配置大页,绑定网卡,导入环境变量脚本

#!/bin/bash

#配置大页
echo 1024 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mount -t hugetlbfs pagesize=1GB /mnt/huge

# 绑定网卡
modprobe uio_pci_generic
~/dpdk/usertools/dpdk-devbind.py --bind=uio_pci_generic <device name or <bus>:<device>.<function>

# 配置环境变量
export RTE_SDK=/root/dpdk
export RTE_TARGET=x86_64-native-linuxapp-gcc

将执行该脚本写入.bashrc中, 使得其可开机自行配置.

echo "~/dpdk/dpdk-init.sh" >>~/.bashrc

VScode设置(可选)

这步可自行选择编辑器和编译器, 我这里只提供VScode + make cmake gcc gdb的解决方案, 由于选择的dpdk版本为21.1.1, 所以也可以选择meson和ninja.

记得安装编译调试软件, 以及安装vscode所需要的插件.

apt install cmake make gdb gcc #软件安装

工作区根目录下新建.vscode文件夹和CMakeLists.txt, 在.vscode文件夹下新建tasks.json和launch.json.

tasks.json如下.

{
    "tasks": [
        {
            "type": "shell",
            "label": "cmake",
            "command": "cmake",
            "args": [
                "-DCMAKE_BUILD_TYPE=DEBUG",
                "."
            ],
            "options": {
                "cwd": "{workspaceFolder}"
            }
        },
        {
            "type": "shell",
            "label": "make",
            "command": "make",
            "args": [],
            "options": {
                "cwd": "{workspaceFolder}"
            },
            "dependsOn": [
                "cmake"
            ]
        }
    ],
    "version": "2.0.0"
}

launch.json如下.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "{command:cmake.launchTargetPath}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "{command:cmake.launchTargetDirectory}",
            "environment": [
                {
                    "name": "PATH",
                    "value": "PATH:{command:cmake.getLaunchTargetDirectory}"
                }
            ],
            "externalConsole": false,
            "avoidWindowsConsoleRedirection": false,            
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "make",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

CMakeList.txt如下.

# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 3.13.4 )

# 声明项目名
set( PROJECT_NAME demo)

# 添加gcc标准支持
set( CMAKE_C_COMPLIE "gcc" )

# 声明一个cmake工程
project( {PROJECT_NAME} )

# 开启调试模式
set(CMAKE_C_FLAGS_DEBUG "-g -DEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-g -DEBUG")

# 找到后面需要库和头文件的包
find_package( PkgConfig REQUIRED )
pkg_check_modules( dpdk REQUIRED IMPORTED_TARGET libdpdk )

# 编译器
set(CMAKE_CXX_COMPILER "/usr/bin/gcc")

# 头文件
include_directories({PROJECT_SOURCE_DIR}
 {PROJECT_SOURCE_DIR}/include{EIGEN3_INCLUDE_DIR}
)

# 源文件
aux_source_directory({PROJECT_SOURCE_DIR}/src DIR_SRCS)

# 生成可执行文件
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY{PROJECT_SOURCE_DIR}/bin)
add_executable({PROJECT_NAME}{DIR_SRCS})

# 添加pkg-config库 
target_link_libraries({PROJECT_NAME} PRIVATE PkgConfig::dpdk{CMAKE_THREAD_LIBS_INIT})

人生如逆旅,我亦是行人。