部署开发环境
操作系统要求
编译软件要求
名称 |
相关特性 |
版本要求 |
|---|---|---|
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控制面编译需要安装正确版本的 |
Protobuf安装
当前发布版本需要用户手动安装Protobuf,推荐以源码编译的形式安装,安装步骤如下所示。
- 下载Protobuf和编译依赖的Abseil源码包,两个源码包放在同一目录。
- 解压源码包。
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
- 生成编译配置,用户可通过--prefix指定安装路径。推荐安装在系统目录下。
mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=ON -DCMAKE_CXX_STANDARD=17
- 编译protoc及Protobuf runtime。
make -j
可使用多线程编译提高编译速度,其中{n}根据设备性能进行选择。
make -j {n} - 安装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
- 执行以下命令,查看版本。
protoc --version
若打印版本信息,表示安装成功。# libprotoc 25.1
- 创建软链接。
使用软链接替换libstdc++.so后,若执行yum、rpm等命令,可能会重置该软链接,导致编译固件过程中报错。当出现“version 'GLIBCXX_3.4.29' not found”报错时,重新执行步骤7.b。
- 观察打印信息,发现关键词“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)
- 将/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
- 观察打印信息,发现关键词“version 'GLIBCXX_3.4.29' not found”。
安装交叉编译工具链
- 进入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
- 执行以下命令,将解压后目录中的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/
- 输入以下命令,查看是否软链接成功。
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 - 执行如下命令,查询交叉编译工具链版本。
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。
- 进入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
- 设置编译参数,创建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} - 执行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)。
- 修改“/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 - 执行以下命令,查询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。
- 进入Index of /rel/,下载dpdk-23.11.tar.gz软件包,并解压至本地环境。
tar -zxvf dpdk-23.11.tar.gz cd dpdk-23.11/
- 配置编译参数。
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
- 编译安装。
ninja -C build && ninja install -C build
- 执行以下命令,查询
DPDK 版本。pkg-config --modversion libdpdk
打印信息如下所示,表示安装成功。23.11.0