代码之家  ›  专栏  ›  技术社区  ›  NutCracker

在Linux上安装DPDK时出错

  •  1
  • NutCracker  · 技术社区  · 7 年前

    DPDK 在Alpine Linux上。我在Docker中运行Alpine Linux。以下是我使用的步骤:

    1. docker pull alpine
    2. docker run -it alpine /bin/sh
    3. wget https://git.dpdk.org/dpdk-stable/snapshot/dpdk-stable-16.11.8.tar.gz
    4. tar -xzf dpdk-stable-16.11.8.tar.gz
    5. cd dpdk-stable-16.11.8
    6. apk add --no-cache make gcc libc-dev bsd-compat-headers linux-headers musl-dev
    7. apk add numactl-dev --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
    8. make install T=x86_64-native-linuxapp-gcc

    安装失败,并出现以下错误和警告:

    配置完成

    ==生成库

    ==构建库/库兼容

    ==构建库/库/公共

    ==构建库/librte\u eal/linuxapp

    抄送eal\u hugepage\u info.o

    /dpdk/dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u hugepage\u info.c:在函数“clear\u hugedir”中:

    /dpdk/dpdk-stable-16.11.8/lib/librteïeal/linuxapp/eal/ealïhugepageïu info.c:229:8:警告:函数“openat”的隐式声明;你是说“波本”吗[-Wimplicit函数声明]

    /dpdk/dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u hugepage\u info.c:229:8:警告:“openat”的嵌套外部声明[-Wnested externs]

    fd=打开(dir\u fd,dirent->d\名称,仅限O\ RDU); ^~~~~~~~ /dpdk/dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u hugepage\u info.c:229:39:注意:每个未声明的标识符对于它出现的每个函数只报告一次

    /dpdk/dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u hugepage\u info.c:在函数“eal\u hugepage\u info\u init”中:

    hpi->锁定描述符=打开(hpi->仅限hugedir); 波本

    /dpdk/dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u hugepage\u info.c:320:26:警告:“open”的嵌套外部声明[-Wnested externs]

    /dpdk/dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u hugepage\u info.c:320:45:错误:未声明“O\u RDONLY”(首次在此函数中使用) ^~~~~~~~

    make[7]:***[/dpdk/dpdk-stable-16.11.8/mk/internal/rte.compile pre.mk:140:eal\u hugepage\u info.o]错误1

    make[4]:***[/dpdk/dpdk-stable-16.11.8/mk/rte.subdir.mk:63:librte\u eal]错误2

    make[3]:***[/dpdk/dpdk-stable-16.11.8/mk/rte.sdkbuild.mk:80:lib]错误2

    make[1]:***[/dpdk/dpdk-stable-16.11.8/mk/rte.sdkinstall.mk:86:预安装]错误2

    make:**[/dpdk/dpdk-stable-16.11.8/mk/rte.sdkroot.mk:101:安装]错误2

    更新1

    我修复了一些错误,但现在出现了新的错误。 以下是更新的步骤:

    1. wget公司https://git.dpdk.org/dpdk-stable/snapshot/dpdk-stable-16.11.8.tar.gz
    2. 光盘dpdk-stable-16.11.8
    3. 添加 #include <fcntl.h> lib/librte_eal/common/include/rte_common.h
    4. 添加 CFLAGS += -D_GNU_SOURCE lib/librte_eal/linuxapp/eal/Makefile

    安装现在失败,出现以下错误:

    配置完成

    ==构建库/库兼容

    ==构建库/库/公共

    抄送eal\u vfio\u mp\u sync.o

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:在函数“vfio\u mp\u sync\u send\u fd”中:

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:75:17:错误:“struct cmsghdr”没有名为“\u cmsg\u data”的成员 ^

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:187:2:注意:在宏“FD\u TO \u CMSGHDR”的扩展中 ^~~~~~~~~~~~~

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:在函数“vfio\u mp\u sync\u receive\u fd”中:

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:78:24:错误:“struct cmsghdr”没有名为“\u cmsg\u data”的成员 内存(&P)(fd),(chdr).\u cmsg\u data,sizeof(fd)) ^

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:228:2:注意:在宏“CMSGHDR\u TO\u FD”的扩展中 CMSGHDR\u到\u FD(*chdr,FD);

    make[6]:***[/dpdk-stable-16.11.8/mk/rte.subdir.mk:63:eal]错误2

    make[5]:***[/dpdk-stable-16.11.8/mk/rte.subdir.mk:63:linuxapp]错误 2

    make[3]:***[/dpdk-stable-16.11.8/mk/rte.sdkbuild.mk:80:lib]错误2

    make[1]:***[/dpdk-stable-16.11.8/mk/rte.sdkinstall.mk:86:预安装]错误2

    make:**[/dpdk-stable-16.11.8/mk/rte.sdkroot.mk:101:安装]错误2

    /usr/include/x86_64-linux-gnu/bits/socket.h , struct cmsghdr 定义如下:

    /* Structure used for storage of ancillary data object information.  */
    struct cmsghdr
    {
        size_t cmsg_len;
        /* Length of data in cmsg_data plus length
           of cmsghdr structure.
           !! The type should be socklen_t but the
           definition of the kernel is incompatible
           with this.  */
        int cmsg_level;     /* Originating protocol.  */
        int cmsg_type;      /* Protocol specific type.  */
    #if __glibc_c99_flexarr_available
        __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
    #endif
    };
    

    __glibc_c99_flexarr_available ? 我能把这个弄出来吗?

    更新2

    我试着用 this musl-dev

    glibc musl . 按照步骤操作 here . 现在我得到这样的错误:

    /usr/include/limits.h:124:26:致命错误:limits.h:没有这样的文件或目录

    #下一步包括

    2 回复  |  直到 7 年前
        1
  •  3
  •   valiano    7 年前

    似乎DPDK与muslibc不兼容,所以您可能很难逐一修复错误。必须手动将预处理器定义和包含添加到CFLAGS似乎是一个不好的迹象。

    最后一个错误是libc不兼容:

    /dpdk-stable-16.11.8/lib/librte\u eal/linuxapp/eal/eal\u vfio\u mp\u sync.c:78:24:错误:“struct cmsghdr”没有名为“\u cmsg\u data”的成员memcpy(&(fd),(chdr).\u cmsg\u data,sizeof(fd))

    在我的glibc(ubuntu16.04)中, cmsghdr 定义如下 bits/socket.h

    /* Structure used for storage of ancillary data object information.  */
    struct cmsghdr
      {
        size_t cmsg_len;            /* Length of data in cmsg_data plus length
                                       of cmsghdr structure.
                                       !! The type should be socklen_t but the
                                       definition of the kernel is incompatible
                                       with this.  */
        int cmsg_level;             /* Originating protocol.  */
        int cmsg_type;              /* Protocol specific type.  */
    #if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
        __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
    #endif
      };
    

    请注意 __cmsg_data 最后。

    cmsghdr公司 定义为:

    struct cmsghdr {
            socklen_t cmsg_len;
            int __pad1;
            int cmsg_level;
            int cmsg_type;
    };
    

    __cmsg\U数据

        2
  •  3
  •   NutCracker    7 年前

    最后,经过一段时间和大量的变通之后,我成功地在Alpine Linux上安装了DPDK,即在运行Alpine Linux的Docker容器上。

    下面是我创建的Dockerfile(注释是内联的):

    FROM alpine:latest
    
    ARG DPDK_VER=16.11.8
    ARG KERNEL_VER=4.9.4
    
    RUN wget https://git.dpdk.org/dpdk-stable/snapshot/dpdk-stable-$DPDK_VER.tar.gz && \
        tar -xzf dpdk-stable-$DPDK_VER.tar.gz && \
        \
        # Install Alpine packages
        apk add --no-cache make gcc linux-headers bsd-compat-headers binutils coreutils diffutils && \
        apk add --no-cache gettext bash grep sed texinfo perl util-linux vim build-base libexecinfo libexecinfo-dev && \
        apk add --no-cache abuild bc cmake ncurses-dev ca-certificates wget && \
        apk add numactl-dev --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted && \
        \
        # Enable usage of High Precision Timers
        sed -i "/\b\(CONFIG_RTE_LIBEAL_USE_HPET\|n\)\b/d" /dpdk-stable-$DPDK_VERSION/config/common_base && \
        sed -ie '/CONFIG_RTE_LOG_HISTORY=256/a CONFIG_RTE_LIBEAL_USE_HPET=y' /dpdk-stable-$DPDK_VERSION/config/common_base && \
        \
        # Add following lines / workarounds to header files 
        sed -ie '/int cmsg_type;/a unsigned char __cmsg_data;' /usr/include/bits/socket.h && \
        sed -i.old '1s;^;#include <fcntl.h>\n;' /dpdk-stable-$DPDK_VER/lib/librte_eal/common/include/rte_common.h && \
        sed -ie '/#define _VNIC_DEVCMD_H_/a typedef u32 u_int32_t;' /dpdk-stable-$DPDK_VER/drivers/net/enic/base/vnic_devcmd.h && \
        \
        # Prevent usage of the header files on /usr/include/fortify path by deleting them
        # Instead of them header files from /usr/include path will be used
        rm -rf /usr/include/fortify/* && \
        \
        # Add CFLAGS += -D_GNU_SOURCE to the following Makefiles
        cd /dpdk-stable-$DPDK_VER && \
        sed -ie '/CFLAGS/a CFLAGS += -D_GNU_SOURCE' lib/librte_ring/Makefile && \
        sed -ie '/CFLAGS/a CFLAGS += -D_GNU_SOURCE' lib/librte_mempool/Makefile && \
        sed -ie '/CFLAGS/a CFLAGS += -D_GNU_SOURCE' lib/librte_mbuf/Makefile && \
        sed -ie '/CFLAGS/a CFLAGS += -D_GNU_SOURCE' lib/librte_timer/Makefile && \
        sed -ie '/CFLAGS/a CFLAGS += -D_GNU_SOURCE' lib/librte_net/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_eal/linuxapp/eal/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_ether/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_cryptodev/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_vhost/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_hash/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_lpm/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_acl/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_ip_frag/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_sched/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_distributor/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_kni/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_port/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_table/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_pipeline/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' lib/librte_reorder/Makefile && \
        \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/af_packet/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/bonding/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/cxgbe/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/e1000/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/ena/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/enic/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/fm10k/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/i40e/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/ixgbe/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/bnxt/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/null/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/qede/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/ring/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/virtio/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/vmxnet3/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/net/vhost/Makefile && \
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' drivers/crypto/null/Makefile && \
        \
        # Enable tests for compiling
        sed -ie '/EXECENV_LDLIBS  += -ldl/a EXECENV_LDLIBS  += -lexecinfo' mk/exec-env/linuxapp/rte.vars.mk && \
        sed -ie '/#include <string.h>/a #include <features.h>' lib/librte_eal/linuxapp/eal/eal_pci_uio.c && \
        sed -ie '/#define OFF_MAX/a static inline void outb_p (unsigned char __value, unsigned short int __port) { __asm__ __volatile__ ("outb %b0,%w1\\noutb %%al,$0x80": :"a" (__value), "Nd" (__port)); }' lib/librte_eal/linuxapp/eal/eal_pci_uio.c && \
        sed -ie '/#define OFF_MAX/a static inline void outw_p (unsigned short int __value, unsigned short int __port) { __asm__ __volatile__ ("outw %w0,%w1\\noutb %%al,$0x80": :"a" (__value), "Nd" (__port)); }' lib/librte_eal/linuxapp/eal/eal_pci_uio.c && \
        sed -ie '/#define OFF_MAX/a static inline void outl_p (unsigned int __value, unsigned short int __port) { __asm__ __volatile__ ("outl %0,%w1\\noutb %%al,$0x80": :"a" (__value), "Nd" (__port)); }' lib/librte_eal/linuxapp/eal/eal_pci_uio.c && \
        # - test
        sed -ie '/LDLIBS += -lm/a LDLIBS += -lrte_pmd_ring -lrte_pmd_null' app/test/Makefile && \
        # - test-acl
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' app/test-acl/Makefile && \
        # - test-pipeline
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' app/test-pipeline/Makefile && \
        # - test-pmd
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' app/test-pmd/Makefile && \
        sed -ie '/DEPDIRS-y += lib drivers/a LDLIBS += -lrte_pmd_ixgbe' app/test-pmd/Makefile && \
        sed -ie '/typedef uint16_t streamid_t/a typedef unsigned int uint;' app/test-pmd/testpmd.h && \
        # - proc_info
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' app/proc_info/Makefile && \
        # - pdump
        sed -ie '/CFLAGS += $(WERROR_FLAGS)/a CFLAGS += -D_GNU_SOURCE' app/pdump/Makefile && \
        cd / && \
        \
        # Install missing Alpine Linux kernel modules
        wget -nv -P /srv https://www.kernel.org/pub/linux/kernel/v4.x/linux-$KERNEL_VER.tar.gz && \
        tar -C /srv -zxf /srv/linux-$KERNEL_VER.tar.gz && \
        cd /srv/linux-$KERNEL_VER && \
        make defconfig && \
        ([ ! -f /proc/1/root/proc/config.gz ] || zcat /proc/1/root/proc/config.gz > .config) && \
        echo 'CONFIG_USB=m' >> .config && \
        echo 'CONFIG_USB_HID=m' >> .config && \
        echo 'CONFIG_USB_SUPPORT=y' >> .config && \
        echo 'CONFIG_USB_COMMON=m' >> .config && \
        echo 'CONFIG_USB_ARCH_HAS_HCD=y' >> .config && \
        echo 'CONFIG_USB_DEFAULT_PERSIST=y' >> .config && \
        echo 'CONFIG_USBIP_CORE=m' >> .config && \
        echo 'CONFIG_USBIP_VHCI_HCD=m' >> .config && \
        echo 'CONFIG_USBIP_VHCI_HC_PORTS=8' >> .config && \
        echo 'CONFIG_USBIP_VHCI_NR_HCS=1' >> .config && \
        echo 'CONFIG_USBIP_HOST=m' >> .config && \
        sed -i'.bak' '/hcd->amd_resume_bug/{s/^/\/\//;n;s/^/\/\//}' ./drivers/usb/core/hcd-pci.c && \
        make oldconfig && \
        make modules_prepare && \
        make modules && \
        make modules_install && \
        make clean && \
        cd / && \
        \
        # Install DPDK
        mkdir /dpdk-build && \
        cd dpdk-stable-$DPDK_VER && \
        make install T=x86_64-native-linuxapp-gcc RTE_KERNELDIR=/srv/linux-$KERNEL_VER DESTDIR=/dpdk-build
    

    我希望这能节省一些人的时间:)

    推荐文章