开发者
资源
文档评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

部署开发环境

操作系统要求

FlexDA编程框架的操作系统如表 操作系统要求所示。

表1 操作系统要求

特性

操作系统

架构

推荐版本

OVS

openEuler

AArch64

22.03 LTS SP3

Ubuntu

AArch64

22.04 LTS

CentOS

AArch64

CentOS 9-Stream

OVS控制面

openEuler

AArch64

22.03 LTS SP3

编译软件要求

FlexDA编程框架的编译环境软件要求如表2所示。

表2 编译环境软件要求

名称

相关特性

版本要求

GCC

OVS

推荐版本12.3.0。

LLVM

OVS

12.0.1~15.0.3,推荐版本12.0.1。

Clang

OVS

12.0.1~15.0.3,推荐版本12.0.1。

交叉编译工具链

OVS

推荐版本14.2.Rel1。

编程框架提供的编程库使用LTO优化,交叉编译工具链版本需要与编程库使用的工具链保持一致,防止编译失败。

安装方式可参见安装交叉编译工具链

CMake

OVS

3.22.0~3.25.0,推荐版本3.22.0。

Make

OVS

4.3.0~4.4.0,推荐版本4.3.0。

OpenSSL

OVS

1.1.1~3.0.12,推荐版本1.1.1。

Protobuf

OVS

推荐版本25.1。详情请参见Protobuf安装

Python

OVS

3.11.4~3.11.13,推荐版本3.11.4。

OVS场景需要安装Python,参见安装Python

DPDK

OVS控制面

23.11(与运行环境保持一致)。

OVS控制面编译需要安装正确版本的DPDK,详情可参见安装DPDK

Protobuf安装

当前发布版本需要用户手动安装Protobuf,推荐以源码编译的形式安装,安装步骤如下所示。

  1. 下载Protobuf和编译依赖的Abseil源码包,两个源码包放在同一目录。
  2. 解压源码包。
    tar -zxvf abseil-cpp-20230802.2.tar.gz
    tar -xzf protobuf-25.1.tar.gz
    mv abseil-cpp-20230802.2/* protobuf-25.1/third_party/abseil-cpp/
    cd protobuf-25.1
  3. 生成编译配置,用户可通过--prefix指定安装路径。推荐安装在系统目录下。
    mkdir build && cd build
    cmake .. -DCMAKE_INSTALL_PREFIX=/usr -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=ON -DCMAKE_CXX_STANDARD=17
  4. 编译protoc及Protobuf runtime。
    make -j

    可使用多线程编译提高编译速度,其中{n}根据设备性能进行选择。

    make -j {n}
  5. 安装protoc及Protobuf runtime,并刷新动态库配置缓存。
    # 非root账号需要使用sudo安装
    sudo make install
    sudo ldconfig
    • 若用户指定安装目录为/usr,则protoc安装在“/usr/bin”目录下,libprotobuf.a & *.so安装在“/usr/lib”目录下。
    • 若用户指定安装路径非系统目录,则需要将bin和lib路径导入到环境变量,示例如下。
      # 若指定--prefix=/path/to/protobuf
      export PATH=/path/to/protobuf/bin:$PATH
      export LD_LIBRARY_PATH=/path/to/protobuf/lib:$LD_LIBRARY_PATH
  6. 执行以下命令,查看版本。
    protoc --version
    若打印版本信息,表示安装成功。
    # libprotoc 25.1
  7. 创建软链接。

    使用软链接替换libstdc++.so后,若执行yum、rpm等命令,可能会重置该软链接,导致编译固件过程中报错。当出现“version 'GLIBCXX_3.4.29' not found”报错时,重新执行步骤7.b

    1. 观察打印信息,发现关键词“version 'GLIBCXX_3.4.29' not found”。
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libprotoc.so.25.1.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libprotobuf.so.25.1.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_log_internal_message.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_log_internal_log_sink_set.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_flags_marshalling.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_flags_reflection.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_status.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_cord.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_cordz_handle.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_crc_cord_state.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_str_format_internal.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /usr/bin/../lib64/libabsl_synchronization.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_strings.so.2308.0.0)
      protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_time_zone.so.2308.0.0)
    2. 将/usr/lib64/libstdc++.so.6软链接到libstdc++.so.6.0.29及以上。

      例如环境已经按照要求安装了GCC 12.3.0,可以执行以下命令进行软链接:

      sudo ln -sf /usr/local/gcc-12/lib64/libstdc++.so.6.0.30 /usr/lib64/libstdc++.so.6

安装交叉编译工具链

  1. 进入arm-gnu-toolchain-downloads,根据操作系统的架构,选择相应的软件包版本。
    • 对于x86环境,建议安装arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz
    • 对于arm环境,建议安装arm-gnu-toolchain-14.2.rel1-aarch64-aarch64-none-elf.tar.xz。

    不同操作系统的安装步骤一致,本节以x86环境的软件包为例进行说明。在x86环境下载工具链包并解压至本地环境。

    tar -xvf arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz
  2. 执行以下命令,将解压后目录中的bin文件夹内的文件软链接至/usr/bin目录下。
    ln -sf {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/* /usr/bin/

    例如:

    ln -sf /root/arm-gnu-toolchain/bin/* /usr/bin/
  3. 输入以下命令,查看是否软链接成功。
    ll /usr/bin |grep aarch64-none-elf

    打印信息如下所示,即链接成功。

    lrwxrwxrwx  1 root root          88 May 29 10:48 aarch64-none-elf-addr2line -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-addr2line
    lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-ar -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ar
    lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-as -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-as
    lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-c++ -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-c++
    lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-c++filt -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-c++filt
    lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-cpp -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-cpp
    lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-elfedit -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-elfedit
    lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-g++ -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-g++
    lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-gcc -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc
    lrwxrwxrwx  1 root root          89 May 29 10:48 aarch64-none-elf-gcc-13.2.1 -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-13.2.1
    lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-gcc-ar -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-ar
    lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-gcc-nm -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-nm
    lrwxrwxrwx  1 root root          89 May 29 10:48 aarch64-none-elf-gcc-ranlib -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-ranlib
    lrwxrwxrwx  1 root root          83 May 29 10:48 aarch64-none-elf-gcov -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcov
    lrwxrwxrwx  1 root root          88 May 29 10:48 aarch64-none-elf-gcov-dump -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcov-dump
    lrwxrwxrwx  1 root root          88 May 29 10:48 aarch64-none-elf-gcov-tool -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcov-tool
    lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-gdb -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb
    lrwxrwxrwx  1 root root          92 May 29 10:48 aarch64-none-elf-gdb-add-index -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb-add-index
    lrwxrwxrwx  1 root root          87 May 29 10:48 aarch64-none-elf-gfortran -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gfortran
    lrwxrwxrwx  1 root root          84 May 29 10:48 aarch64-none-elf-gprof -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gprof
    lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-ld -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ld
    lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-ld.bfd -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ld.bfd
    lrwxrwxrwx  1 root root          87 May 29 10:48 aarch64-none-elf-lto-dump -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-lto-dump
    lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-nm -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-nm
    lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-objcopy -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objcopy
    lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-objdump -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objdump
    lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-ranlib -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ranlib
    lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-readelf -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-readelf
    lrwxrwxrwx  1 root root          83 May 29 10:48 aarch64-none-elf-size -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-size
    lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-strings -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-strings
    lrwxrwxrwx  1 root root          84 May 29 10:48 aarch64-none-elf-strip -> {本地下载的包路径}/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-strip
  4. 执行如下命令,查询交叉编译工具链版本。
    aarch64-none-elf-gcc -v

    打印信息如下所示,表示安装成功。

    Using built-in specs.
    COLLECT_GCC=aarch64-none-elf-gcc
    COLLECT_LTO_WRAPPER=/home/CIDA/flexdacc/packages/arm-gnu-toolchain-14.2.rel1-aarch64-aarch64-none-elf/bin/../libexec/gcc/aarch64-none-elf/14.2.1/lto-wrapper
    Target: aarch64-none-elf
    Configured with: /data/jenkins/workspace/GNU-toolchain/arm-14/src/gcc/configure --target=aarch64-none-elf --prefix=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/install --with-gmp=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --with-mpfr=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --with-mpc=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --with-isl=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --disable-shared --disable-nls --disable-threads --disable-tls --enable-checking=release --enable-languages=c,c++,fortran --with-newlib --with-gnu-as --with-headers=yes --with-gnu-ld --with-native-system-header-dir=/include --with-sysroot=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/install/aarch64-none-elf --with-bugurl=https://bugs.linaro.org/ --with-pkgversion='Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52)'
    Thread model: single
    Supported LTO compression algorithms: zlib
    gcc version 14.2.1 20241119 (Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52))

安装Python

通过源码安装python前,需要安装依赖软件GCC、CMake、Make。

本节以openEuler操作系统为例展示如何通过源码安装Python。

  1. 进入Python-downloads-source,下载Python 3.11.x版本的XZ软件包,并解压至本地环境。
    本节以Python 3.11.4作为安装版本,“/opt/buildtools”为安装目录示例。
    cd /opt/buildtools
    tar -xf Python-3.11.4.tar.xz
  2. 设置编译参数,创建Python工作目录“/opt/buildtools/python-3.11”
    tmp_cpus=$(grep -w processor /proc/cpuinfo|wc -l)
    install_dir=/opt/buildtools/python-3.11
    mkdir -p ${install_dir}
  3. 执行Python编译。
    cd Python-3.11.4
    ./configure CFLAGS="-D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong" CPPFLAGS="-D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong" LDFLAGS="-Wl,-z,relro,-z,now -s" --prefix=${install_dir} -enable-shared
    make -j ${tmp_cpus}
    make install
    sudo cp libpython3.11.so.1.0 libpython3.11.so /usr/lib64

    若操作系统非openEuler,需将libpython3.11.so.1.0和libpython3.11.so拷贝到对应的系统库目录中(例如,arm架构下,Ubuntu中为/lib/aarch64-linux-gnu)。

  4. 修改“/usr/local/bin”下的Python软链接,如需回退应备份原Python文件。
    [ -f /usr/local/bin/python3 ] && rm -f /usr/local/bin/python3
    [ -e ${install_dir}/bin/python3.11 ] && ln -sf ${install_dir}/bin/python3.11 /usr/local/bin/python3
    [ -f /usr/local/bin/python ] && rm -f /usr/local/bin/python
    [ -e ${install_dir}/bin/python3.11 ] && ln -sf ${install_dir}/bin/python3.11 /usr/local/bin/python
    [ -f /usr/local/bin/pip3 ] && rm -f /usr/local/bin/pip3
    [ -e ${install_dir}/bin/pip3.11 ] && ln -sf ${install_dir}/bin/pip3.11 /usr/local/bin/pip3
  5. 执行以下命令,查询Python版本。
    /usr/local/bin/python3 -V
    打印信息如下所示,表示安装成功。
    Python 3.11.4
  • 完成上述安装后,编译固件时报错,形如“xxx /usr/bin/python3 xxx”。重新打开终端后,继续执行固件编译命令。
  • 上述步骤仅修改了/usr/local/bin下的Python软链接,未对/usr/bin下的Python软链接进行修改,避免对操作系统命令如yum造成影响,如后续正常操作过程中遇到Python报错,可尝试恢复/usr/local/bin下Python软链接进行修复。

安装DPDK

通过源码安装DPDK前,需要安装依赖软件tar、meson、automake、libtool、openssl-devel、python3-pyelftools以及numactl-devel。

  1. 进入Index of /rel/,下载dpdk-23.11.tar.gz软件包,并解压至本地环境。
    tar -zxvf dpdk-23.11.tar.gz
    cd dpdk-23.11/
  2. 配置编译参数。
    meson --prefix=/usr -Ddisable_drivers=net/cnxk -Dc_args='-O0 -fstack-protector-strong' -Dmax_ethports=960 -Dc_link_args='-Wl,-z,relro,-z,now,-z,noexecstack' -Dplatform=generic build
  3. 编译安装。
    ninja -C build && ninja install -C build
  4. 执行以下命令,查询DPDK版本。
    pkg-config --modversion libdpdk
    打印信息如下所示,表示安装成功。
    23.11.0