Ошибки при установке DPDK в Linux Alpine

Я пытаюсь установить DPDK на альпийском линуксе. Я использую Alpine Linux в Docker. Вот шаги, которые я использую:

  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

Установка завершается с ошибками и предупреждениями:

make [5]: Ничего не поделаешь для 'depdirs'.

Конфигурация выполнена

== Сборка lib

== Сборка lib / librte_compat

== Сборка lib / librte_eal

== Сборка lib / librte_eal / common

== Сборка lib / librte_eal / linuxapp

== Сборка lib / librte_eal / linuxapp / eal

CC eal_hugepage_info.o

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c: в функции 'clear_hugedir':

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:229:8: предупреждение: неявное объявление функции 'openat'; Вы имели в виду "попен"? [-Понятная-декларация-функции] fd = openat(dir_fd, dirent->d_name, O_RDONLY); ^~~~~~ попен

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:229:8: предупреждение: вложенное внешнее объявление 'openat' [-Wnested-externs]

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:229:39: error: 'O_RDONLY' undeclared (первое использование в этой функции) fd = openat(dir_fd, dirent->d_name), O_RDONLY); ^~~~~~~~ /dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:229:39: примечание: каждый необъявленный идентификатор сообщается только один раз для каждой функции, которая появляется в

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c: в функции 'eal_hugepage_info_init':

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:320:26: предупреждение: неявное объявление функции open; Вы имели в виду "попен"? [-Wimplicit-function-объявление] hpi->lock_descriptor = open(hpi->hugedir, O_RDONLY); ^~~~ попен

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:320:26: предупреждение: вложенное внешнее объявление 'open' [-Wnested-externs]

/dpdk/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c:320:45: error: 'O_RDONLY' undeclared (первое использование в этой функции) hpi-> lock_descriptor = open (hpi-> hugedir, O_RDONLY); ^ ~~~~~~~

make [7]: *** [/dpdk/dpdk-stable-16.11.8/mk/internal/rte.compile-pre.mk:140: eal_hugepage_info.o] Ошибка 1

make [6]: *** [/dpdk/dpdk-stable-16.11.8/mk/rte.subdir.mk:63: eal] ​​Ошибка 2

make [5]: *** [/dpdk/dpdk-stable-16.11.8/mk/rte.subdir.mk:63: linuxapp] Ошибка 2

make [4]: ​​*** [/dpdk/dpdk-stable-16.11.8/mk/rte.subdir.mk:63: librte_eal] Ошибка 2

make [3]: *** [/dpdk/dpdk-stable-16.11.8/mk/rte.sdkbuild.mk:80: lib] Ошибка 2

make [2]: *** [/dpdk/dpdk-stable-16.11.8/mk/rte.sdkroot.mk:127: все] Ошибка 2

make [1]: *** [/dpdk/dpdk-stable-16.11.8/mk/rte.sdkinstall.mk:86: pre_install] Ошибка 2

make: *** [/dpdk/dpdk-stable-16.11.8/mk/rte.sdkroot.mk:101: установить] Ошибка 2

ОБНОВЛЕНИЕ 1

Я исправил некоторые ошибки, но теперь появляются новые ошибки. Вот обновленные шаги:

  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. добавлять #include <fcntl.h> в lib/librte_eal/common/include/rte_common.h
  9. добавлять CFLAGS += -D_GNU_SOURCE в lib/librte_eal/linuxapp/eal/Makefile
  10. make install T=x86_64-native-linuxapp-gcc

Установка завершается с ошибками:

make [5]: Ничего не поделаешь для 'depdirs'. Конфигурация выполнена

== Сборка lib

== Сборка lib / librte_compat

== Сборка lib / librte_eal

== Сборка lib / librte_eal / common

== Сборка lib / librte_eal / linuxapp

== Сборка lib / librte_eal / linuxapp / eal

CC eal_vfio_mp_sync.o

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c: в функции 'vfio_mp_sync_send_fd':

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c:75:17: ошибка: в "struct cmsghdr" нет члена с именем "__cmsg_data" memcpy ((chdr).__ cmsg_data, & (fd), sizeof (fd)); \ ^

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c:187:2: note: в расширении макроса 'FD_TO_CMSGHDR' FD_TO_CMSGHDR (fd, * chdr); ^ ~~~~~~~~~~~~

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c: в функции 'vfio_mp_sync_receive_fd':

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c:78:24: ошибка: в "struct cmsghdr" нет члена с именем "__cmsg_data" memcpy(&(fd), (chdr).__cmsg_data., sizeof (fd)) ^

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c:228:2: примечание: в расширении макроса 'CMSGHDR_TO_FD' CMSGHDR_TO_FD (* chdr, fd); ^ ~~~~~~~~~~~~

make [7]: *** [/dpdk-stable-16.11.8/mk/internal/rte.compile-pre.mk:140: eal_vfio_mp_sync.o] Ошибка 1

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 [4]: ​​*** [/dpdk-stable-16.11.8/mk/rte.subdir.mk:63: librte_eal] Ошибка 2

make [3]: *** [/dpdk-stable-16.11.8/mk/rte.sdkbuild.mk:80: lib] Ошибка 2

make [2]: *** [/dpdk-stable-16.11.8/mk/rte.sdkroot.mk:127: all] Ошибка 2

make [1]: *** [/dpdk-stable-16.11.8/mk/rte.sdkinstall.mk:86: pre_install] Ошибка 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

Я пытался использовать это вместо musl-dev но ошибка остается прежней.

Затем, как и предполагалось, я установил glibc на моем Alpine Linux, чтобы использовать его вместо musl, Следуйте инструкциям здесь. Теперь я получаю такие ошибки:

В файле, включенном в /dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal.c:48:0:

/usr/include/limits.h:124:26: фатальная ошибка: limit.h: нет такого файла или каталога

# include_next

2 ответа

Решение

Наконец, после некоторого времени и множества обходных путей мне удалось установить DPDK в Alpine Linux, то есть в контейнер Docker, работающий под Alpine Linux.

Вот 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

Надеюсь, это сэкономит кому-то время:)

Кажется, что DPDK не совместим с musl libc, поэтому вам, вероятно, будет очень трудно исправлять ошибки одну за другой. Необходимость вручную добавлять определения и включения препроцессора в CFLAGS кажется плохим знаком.

Последняя ошибка - такая несовместимость libc:

/dpdk-stable-16.11.8/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c:78:24: ошибка: в "struct cmsghdr" нет члена с именем "__cmsg_data" memcpy(&(fd), (chdr).__cmsg_data., sizeof(fd))

В моем glibc (Ubuntu 16.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_data поле.

Другие вопросы по тегам