TuGraph 4.5.2社区版麒麟 Kylin10 aarch64 的容器化部署全攻略

0 阅读10分钟

TuGraph 4.5.2 麒麟 Kylin10 aarch64 容器化部署全攻略

前言

本攻略针对麒麟 Kylin10 aarch64(ARM64) 国产化环境,完整梳理 TuGraph 4.5.2 社区版从基础环境搭建→依赖编译安装→tugraph 4.5.2源码编译→docker容器化封装 的全流程,解决国产化 ARM 架构下编译依赖冲突、架构兼容、权限配置等核心痛点,最终输出可直接部署的 Docker 镜像。

前置说明

  1. 环境要求:内存 ≥ 16G,ssd ≥ 500G
  2. 麒麟版本:4.19.90-24.4.v2101.ky10.aarch64
  3. 下载docker,链接:docker-aarch64.tar.gz
  4. 下载kylin10 aarch64的docker image文件,链接:kylin10-aarch64-docker-image.tar.gz
  5. 下载tugraph-4.5.2的源码包和依赖包文件,链接:tugraph-4.5.2-install.tar.gz

一、基础环境准备

1.1 安装docker

# 注意:如果自己本地已安装的docker版本必须高于18.09.0,可以跳过1.1 docker安装
su - root
groupadd tugraph
groupadd docker
useradd -d /home/tugraph -r -m -s /bin/bash tugraph
usermod -aG docker tugraph
mkdir tools && cd tools
tar -zxvf docker-18.09.0-aarch64.tar.gz
chmod +x install.docker/docker-compose
chmod +x install.docker/docker-18.09.0/bin/*
# 检查docker-compose是否可以正常执行
install.docker/docker-compose --version
# 输出:Docker Compose version v5.1.4
# 检查docker、dockerd是否可以正常执行
install.docker/docker --version
install.docker/dockerd --version
# 输出都是 Docker version 18.09.0, build 4d60db4
# 安装到/usr/bin
cp install.docker/docker-compose /usr/bin
cp install.docker/docker-18.09.0/bin/* /usr/bin
# 在/etc/profile文件末尾加入一行 export PATH=/usr/bin:$PATH,执行:
. /etc/profile

1.2 启动docker服务

cp install.docker/docker-18.09.0/docker.service /usr/lib/systemd/system/
# 启用docker服务
systemctl daemon-reload
systemctl enable docker
systemctl start docker
# 查看docker服务是否启动
systemctl status docker
# Active状态应该是: active (running) since ... 

1.3 创建专用用户(避免 root 权限风险)

su - root
groupadd tugraph
groupadd docker
useradd -d /home/tugraph -r -m -s /bin/bash tugraph
usermod -aG docker tugraph
# 切换至该用户(后续所有操作建议以该用户执行)
su - tugraph

1.4 建立local/kylin-v10容器

gzip -d kylin10-aarch64-docker-image.tar.gz
docker load -i kylin10-aarch64-docker-image.tar
# 检查kylin10的映像是否加载成功
docker images
# 输出:local/keylin-v10 base
mkdir -p ~/docker/kylin10 && cd ~/docker/kylin10
vi docker-compose.yml
# 将下面内容黏贴到docker-compose.yml
version: '3.3'

services:
  tugraph:
    image: local/kylin-v10:base
    container_name: kylin10
    restart: always
    volumes:
      - /home/tugraph/docker/kylin10/install.all:/install.all
    command: ["/bin/bash", "-c", "while true; do sleep 3600; done"]
# docker-compose.yml结束
cp tugraph-4.5.2-install.tar.gz /home/tugraph/docker/kylin10
tar -zxvf tugraph-4.5.2-install.tar.gz
# 解开后出现install.all
docker-compose up -d

# 检查kylin10容器是否运行
docker ps -a | grep local/kylin-v10:base
# STATUS是up状态后进入kylin10
docker exec -it kylin10 bash

二、安装依赖包

2.1 安装rpms包

cd /install.all/rpms
yum localinstall *.rpm
# 系统提示dbus-daemon-1:1.12.16-19.se.01.p02.ky10.aarch64安装失败,可不理睬

2.2 核心编译工具安装

2.2.1 安装 GCC 8.4.0
cd /install.all/packages/gcc-8.4.0
# 清理旧编译文件,重新构建
rm -rf build && mkdir build && cd build
# 配置编译参数(-fPIC适配ARM静态编译,关闭多架构)
../configure --disable-multilib --enable-languages=c,c++ --enable-checking=release --disable-bootstrap CFLAGS=-fPIC CXXFLAGS=-fPIC
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install

# 替换系统libstdc++.so.6,解决版本兼容问题
cp ./aarch64-*-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25 /usr/lib64/
cd /usr/lib64 && ln -sf libstdc++.so.6.0.25 libstdc++.so.6

# 清理临时文件,配置gcc软链接
rm -f /usr/local/bin/cc
ln -s /usr/local/bin/gcc /usr/local/bin/cc

# 配置环境变量,生效lib64路径
vim /etc/profile
# 文件末尾添加:
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
# 生效配置
. /etc/profile
# 清理临时文件
cd /
rm -rf /install.all/packages/gcc-8.4.0/build
2.2.2 安装 openssl-1.0.2u
cd /install.all/packages
tar -zxvf openssl-1.0.2u.tar.gz 
cd openssl-1.0.2u
./config no-asm -fPIC shared zlib --prefix=/usr --openssldir=/usr/ssl
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
mv libssl.a /usr/lib64/
mv libcrypto.a /usr/lib64/
ldconfig
# 清理临时文件
cd /
rm -rf /install.all/packages/openssl-1.0.2u
2.2.3 安装 Python 3.6.9(TuGraph 脚本依赖)
cd /install.all/packages
tar -zxvf Python-3.6.9.tgz 
cd Python-3.6.9
# 配置安装路径,启用优化
vim Modules/Setup.dist
# 找到被注释掉的 SSL 配置部分。将其取消注释,如下:
# Socket module helper for SSL support; you must comment out the other 
# socket line above, and possibly edit the SSL variable: 
SSL=/usr 
_ssl _ssl.c \ 
 -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
 -L$(SSL)/lib64 -lssl -lcrypto
# end Setup.dist

./configure --prefix=/usr/local --enable-optimizations
export JFLAG="-j$(nproc)"
make LDFLAGS="-L/usr/lib64 -lz" -j$(nproc)
make install

# 配置Python环境变量
vim /etc/profile
# 文件尾部添加:
export PATH=/usr/local/bin:$PATH
# 生效配置
. /etc/profile

# 验证版本
python3 --version  # 应输出Python 3.6.9

# 升级pip,安装离线whl包
# 不要理睬 Could not fetch URL https://pypi.org/simple/pip/ 的提示
python3 -m pip install --upgrade ../pip-21.3.1-py3-none-any.whl
pip install /install.all/whls/*.whl
cd /
rm -rf /install.all/packages/Python-3.6.9
2.2.4 安装 CMake 3.25.2
cd /install.all/packages
tar zxvf cmake-3.25.2.tar.gz
cd cmake-3.25.2 
# 初始化编译配置
export LDFLAGS="-lz -ldl"
./bootstrap 
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install

# 配置环境变量
vim /etc/profile
# 文件尾部添加:
export PATH=/usr/local/bin:$PATH
. /etc/profile

# 验证版本
cmake --version  # 输出cmake version 3.25.2

# 清理临时文件
cd /
rm -rf /install.all/packages/cmake-3.25.2
2.2.5 安装 Boost 1.68.0
cd /install.all/packages
tar zxvf boost_1_68_0.tar.gz
# 清理旧版本
rm -rf /usr/local/lib/libboost*
rm -rf /usr/local/include/boost

cd boost_1_68_0
# 初始化编译(指定需要的模块)
./bootstrap.sh --with-libraries=system,random,thread,filesystem,chrono,atomic,date_time,regex,stacktrace,log

# 编译安装(静态库+ARM适配-fPIC)
./b2 -a ${JFLAG} cxxflags="-std=c++17" cflags="-fPIC" link=static runtime-link=static --ignore-site-config install

# 修复boost geometry编译报错
sed -i '513s/BOOST_MPL_ASSERT_MSG((I < 1), INVALID_INDEX,/BOOST_MPL_ASSERT_MSG((I < 1), INVALID_INDEX_,/' /usr/local/include/boost/geometry/index/detail/predicates.hpp

# 安装geometry扩展
cd /install.all/packages
tar zxvf geometry-extensions.tar.gz 
mv extensions /usr/local/include/boost/geometry/

# 清理临时文件
cd /
rm -rf /install.all/packages/boost_1_68_0
2.2.6 安装 Protobuf 3.6.0
cd /install.all/packages
# 卸载系统自带版本,避免冲突
yum remove protobuf protobuf-devel protobuf-lite -y
tar -zxvf protobuf-3.6.0.tar.gz
cd protobuf-3.6.0
rm -f /install.all/packages/protobuf-3.6.0/third_party
cp -r /install.all/packages/

# 生成配置文件,编译静态库
./autogen.sh
./configure CFLAGS='-fPIC' CXXFLAGS='-fPIC' --prefix=/usr/local
export JFLAG="-j$(nproc)"
make ${JFLAG} 
make install
ldconfig

# 清理临时文件
cd /
rm -rf /install.all/packages/protobuf-3.6.0
2.2.7 安装 Snappy 1.1.9
cd /install.all/packages
unzip snappy-1.1.9.zip
cd snappy-1.1.9/third_party/
rm -rf *
# 复制离线依赖
cp -r /install.all/packages/snappy.googletest googletest
cp -r /install.all/packages/snappy.benchmark benchmark

# 编译安装
cd .. && mkdir build && cd build
cmake -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -Wno-error=unused-parameter ..
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install

# 清理临时文件
cd /
rm -rf /install.all/packages/snappy-1.1.9
2.2.8 安装 Gflags 2.2.1
cd /install.all/packages
tar -zxvf gflags-2.2.1.tar.gz
cd gflags-2.2.1
mkdir build && cd build
cmake -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -Wno-error=unused-parameter .. 
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install

# 清理临时文件
cd /
rm -rf /install.all/packages/gflags-2.2.1
2.2.9 安装 LevelDB 1.20
cd /install.all/packages
unzip leveldb-v1.20.zip
cd leveldb-1.20
# 编译(指定C++17和-fPIC)
CFLAGS="-fPIC -std=c++17" CXXFLAGS="-fPIC -std=c++17" make ${JFLAG}
# 替换系统库
rm -rf /usr/local/include/leveldb
rm -f /usr/local/lib/libleveldb.so.1 /usr/local/lib/libleveldb.so
cp -r ./include/leveldb/ /usr/local/include/
cp ./out-shared/libleveldb.so.1.20 /usr/local/lib/
cp ./out-static/libleveldb.a /usr/local/lib/
ln -s /usr/local/lib/libleveldb.so.1.20 /usr/local/lib/libleveldb.so.1
ln -s /usr/local/lib/libleveldb.so.1.20 /usr/local/lib/libleveldb.so

# 清理临时文件
cd /
rm -rf /install.all/packages/leveldb-1.20
2.2.10 安装 Node.js 16.20.0
cd /install.all/packages/node-v16.20.0-linux-arm64/
# 替换系统软链接
rm -f /usr/local/bin/npm /usr/local/bin/node /usr/local/bin/npx /usr/local/bin/yarn
ln -s $(pwd)/bin/npm /usr/local/bin/npm
ln -s $(pwd)/bin/node /usr/local/bin/node
ln -s $(pwd)/bin/npx /usr/local/bin/npx
ln -s $(pwd)/bin/yarn /usr/local/bin/yarn
2.2.11 配置CMAKE_OPT全局编译参数
vim /etc/profile
# 文件尾添加:
export CMAKE_OPT="-DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DBUILD_TESTS=0 -DBUILD_SAMPLES=0 -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++"
. /etc/profile
2.2.12 安装 brpc 1.2
cd /install.all/packages
unzip brpc-release-1.2.zip
cd brpc-release-1.2
mkdir build && cd build
rm -rf /usr/local/lib64/libbrpc.* /usr/local/include/brpc
cmake $CMAKE_OPT -DBUILD_UNIT_TESTS=0 -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC ..
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/brpc-release-1.2
2.2.13 安装cpprestsdk 2.10.18
cd /install.all/packages
unzip cpprestsdk-v2.10.18.zip
cd cpprestsdk-2.10.18/Release/libs/ 
rm -rf *
cp -r /install.all/packages/cpprestsdk.websocketpp websocketpp
cd ..
# 修改为静态编译
sed -i '/  set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries")/c set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries")' CMakeLists.txt
mkdir build && cd build
rm -rf /usr/local/include/cpprest /usr/local/lib64/libcpprest.*
cmake $CMAKE_OPT -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -Wno-error=unused-parameter -DBoost_USE_STATIC_LIBS=1 .. 
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/cpprestsdk-2.10.18
2.2.14 安装 googletest 1.12.1
cd /install.all/packages
unzip googletest-release-1.12.1.zip
cd googletest-release-1.12.1
mkdir build && cd build
cmake $CMAKE_OPT -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -DBUILD_SHARED_LIBS=OFF ..
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/googletest-release-1.12.1
2.2.15 安装 jwt-cpp 0.6.0
cd /install.all/packages
unzip jwt-v0.6.0.zip
cd jwt-cpp-0.6.0
rm -rf /usr/local/include/jwt-cpp /usr/local/include/picojson
cp -r include/jwt-cpp/ /usr/local/include
cp -r include/picojson/ /usr/local/include
# 清理临时文件
cd /
rm -rf /install.all/packages/jwt-cpp-0.6.0
2.2.16 安装 jemalloc 5.3.0
cd /install.all/packages
tar zxvf jemalloc-5.3.0.tar.gz
cd jemalloc-5.3.0 
CFLAGS="-fPIC" CXXFLAGS="-fPIC" ./autogen.sh
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/jemalloc-5.3.0
2.2.17 安装 RocksDB 7.8.3
cd /install.all/packages
tar zxvf rocksdb-v7.8.3.tar.gz
cd rocksdb-7.8.3
rm -rf /usr/local/include/rocksdb /usr/local/lib/librocksdb*
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS="-fPIC" -DPORTABLE=ON -DFORCE_SSE42=OFF -DWITH_JEMALLOC=ON
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/rocksdb-7.8.3
2.2.18 安装 antlr4 4.13.0
cd /install.all/packages
tar -zxvf antlr4-4.13.0.tar.gz
cd antlr4-4.13.0/runtime/Cpp
vim CMakeLists.txt
# 在CmakeLists.txt第9行后插入
# 10 set(CMAKE_CXX_STANDARD 17)
# 11 set(CMAKE_CXX_STANDARD_REQUIRED ON)
rm -rf build
rm -rf /usr/local/lib64/libantlr4-*
rm -rf /usr/local/lib/libantlr4-*
rm -rf /usr/local/include/antlr4-runtime
rm -rf /usr/local/lib64/cmake/antlr4-*
mkdir -p build && cd build
cmake -DWITH_DEMO=0 -DANTLR_BUILD_CPP_TESTS=0 -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC  -DANTLR4_INSTALL=1 -DCMAKE_INSTALL_PREFIX=/usr/local ..
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
rm -rf /opt/apache-maven-3.8.7
cp -r /install.all/packages/apache-maven-3.8.7 /opt/apache-maven-3.8.7

vim /etc/profile
# 在profile尾部添加下面两行:
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.30.7-4.p01.ky10.aarch64
# export PATH=/opt/apache-maven-3.8.7/bin:$JAVA_HOME/bin:$PATH 
. /etc/profile
rm -rf ~/.m2
mkdir ~/.m2
cp -r /install.all/maven.m2/* ~/.m2/
cd /install.all/packages/antlr4-4.13.0
mvn package -DskipTests -o
cp tool/target/antlr4-4.13.0-complete.jar /usr/local/bin
chmod 755 /usr/local/bin/antlr4-4.13.0-complete.jar
# 清理临时文件
cd /
rm -rf /install.all/packages/antlr4-4.13.0
2.2.19 安装 glog-0.3.5
cd /install.all/packages
tar zxvf glog-0.3.5.tar.gz
cd glog-0.3.5 
mkdir -p build && cd build
cmake -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_INSTALL_PREFIX=/usr/local ..
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/glog-0.3.5
2.2.20 安装 apache-arrow-13.0.0.
cd /install.all/packages
tar -zxvf apache-arrow-13.0.0.tar.gz
cd apache-arrow-13.0.0/cpp
mkdir build && cd build
export ARROW_DEPENDENCY_SOURCE=DOWNLOAD 
export ARROW_ABSL_URL=file:///install.all/packages/apache-arrow.pacakges/absl-20211102.0.tar.gz
export ARROW_AWSSDK_URL=file:///install.all/packages/apache-arrow.pacakges/aws-sdk-cpp-1.8.133.tar.gz
export ARROW_AWS_CHECKSUMS_URL=file:///install.all/packages/apache-arrow.pacakges/aws-checksums-v0.1.12.tar.gz
export ARROW_AWS_C_COMMON_URL=file:///install.all/packages/apache-arrow.pacakges/aws-c-common-v0.6.9.tar.gz
export ARROW_AWS_C_EVENT_STREAM_URL=file:///install.all/packages/apache-arrow.pacakges/aws-c-event-stream-v0.1.5.tar.gz
export ARROW_BOOST_URL=file:///install.all/packages/apache-arrow.pacakges/boost-1.75.0.tar.gz
export ARROW_BROTLI_URL=file:///install.all/packages/apache-arrow.pacakges/brotli-v1.0.9.tar.gz
export ARROW_BZIP2_URL=file:///install.all/packages/apache-arrow.pacakges/bzip2-1.0.8.tar.gz
export ARROW_CARES_URL=file:///install.all/packages/apache-arrow.pacakges/cares-1.17.2.tar.gz
export ARROW_CRC32C_URL=file:///install.all/packages/apache-arrow.pacakges/crc32c-1.1.2.tar.gz
export ARROW_GBENCHMARK_URL=file:///install.all/packages/apache-arrow.pacakges/gbenchmark-v1.6.0.tar.gz
export ARROW_GFLAGS_URL=file:///install.all/packages/apache-arrow.pacakges/gflags-v2.2.2.tar.gz
export ARROW_GLOG_URL=file:///install.all/packages/apache-arrow.pacakges/glog-v0.5.0.tar.gz
export ARROW_GOOGLE_CLOUD_CPP_URL=file:///install.all/packages/apache-arrow.pacakges/google-cloud-cpp-v1.42.0.tar.gz
export ARROW_GRPC_URL=file:///install.all/packages/apache-arrow.pacakges/grpc-v1.46.3.tar.gz
export ARROW_GTEST_URL=file:///install.all/packages/apache-arrow.pacakges/gtest-1.11.0.tar.gz
export ARROW_JEMALLOC_URL=file:///install.all/packages/apache-arrow.pacakges/jemalloc-5.3.0.tar.bz2
export ARROW_LZ4_URL=file:///install.all/packages/apache-arrow.pacakges/lz4-v1.9.4.tar.gz
export ARROW_MIMALLOC_URL=file:///install.all/packages/apache-arrow.pacakges/mimalloc-v2.0.6.tar.gz
export ARROW_NLOHMANN_JSON_URL=file:///install.all/packages/apache-arrow.pacakges/nlohmann-json-v3.10.5.tar.gz
export ARROW_OPENTELEMETRY_URL=file:///install.all/packages/apache-arrow.pacakges/opentelemetry-cpp-v1.4.1.tar.gz
export ARROW_OPENTELEMETRY_PROTO_URL=file:///install.all/packages/apache-arrow.pacakges/opentelemetry-proto-v0.17.0.tar.gz
export ARROW_ORC_URL=file:///install.all/packages/apache-arrow.pacakges/orc-1.9.0.tar.gz
export ARROW_PROTOBUF_URL=file:///install.all/packages/apache-arrow.pacakges/protobuf-v21.3.tar.gz
export ARROW_RAPIDJSON_URL=file:///install.all/packages/apache-arrow.pacakges/rapidjson-232389d4f1012dddec4ef84861face2d2ba85709.tar.gz
export ARROW_RE2_URL=file:///install.all/packages/apache-arrow.pacakges/re2-2022-06-01.tar.gz
export ARROW_SNAPPY_URL=file:///install.all/packages/apache-arrow.pacakges/snappy-1.1.9.tar.gz
export ARROW_THRIFT_URL=file:///install.all/packages/apache-arrow.pacakges/thrift-0.16.0.tar.gz
export ARROW_UCX_URL=file:///install.all/packages/apache-arrow.pacakges/ucx-1.12.1.tar.gz
export ARROW_UTF8PROC_URL=file:///install.all/packages/apache-arrow.pacakges/utf8proc-v2.7.0.tar.gz
export ARROW_XSIMD_URL=file:///install.all/packages/apache-arrow.pacakges/xsimd-9.0.1.tar.gz
export ARROW_ZLIB_URL=file:///install.all/packages/apache-arrow.pacakges/zlib-1.2.13.tar.gz
export ARROW_ZSTD_URL=file:///install.all/packages/apache-arrow.pacakges/zstd-1.5.5.tar.gz
cmake .. -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_ORC=ON -DARROW_CSV=ON -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/apache-arrow-13.0.0
2.2.21 安装 GraphAr-0.11.1
cd /install.all/packages
tar -zxvf GraphAr-0.11.1.tar.gz
cd GraphAr-0.11.1/cpp
mkdir build && cd build
cmake ..
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/GraphAr-0.11.1
2.2.22 安装 tabulate
cd /install.all/packages
tar -zxvf tabulate-3a5830.tar.gz 
mv tabulate/include/tabulate /usr/local/include
# 清理临时文件
cd /
rm -rf /install.all/packages/tabulate
2.2.23 安装 swig-4.0.2
cd /install.all/packages
tar -zxvf swig-4.0.2.tar.gz 
cd swig-4.0.2
./configure 
export JFLAG="-j$(nproc)"
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/swig-4.0.2
2.2.24 安装 FAISS
cd /install.all/packages
tar -zxvf openblas-faiss.tar.gz
cd openblas-faiss/OpenBLAS
make
make PREFIX=/opt/OpenBLAS install
cd ../faiss
mkdir build && cd build
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DFAISS_ENABLE_PYTHON=OFF \
-DFAISS_ENABLE_GPU=OFF \
-DFAISS_OPT_LEVEL=generic \
-DBUILD_TESTING=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_INSTALL_LIBDIR=lib \
-DOpenMP_CXX_FLAGS="-fopenmp" \
-DOpenMP_CXX_LIB_NAMES="gomp" \
-DOpenMP_gomp_LIBRARY="/usr/lib64/libgomp.so.1" \
-DBLA_VENDOR=OpenBLAS \
-DBLAS_LIBRARIES=/opt/OpenBLAS/lib/libopenblas.so \
-DLAPACK_LIBRARIES=/opt/OpenBLAS/lib/libopenblas.so ..
export JFLAG="-j$(nproc)"
make -C build ${JFLAG}
make -C build install
ldconfig
# 清理临时文件
cd /
rm -rf /install.all/packages/openblas-faiss
2.2.25 安装 vsag-0.11.5
cd /install.all/packages
tar -zxvf vsag-0.11.5.tar.gz
cd vsag-0.11.5
mkdir build && cd build
rm /usr/local/lib/libgfortran.so
ln -s /usr/lib64/libgfortran.so.5.0.0 /usr/local/lib/libgfortran.so
ldconfig
sed -i '/FetchContent_Declare/,/TIMEOUT 30/c\FetchContent_Declare(\n                roaringbitmap\n                URL file:\/\/\/install.all\/packages\/vsag.packages\/roaringbitmap-3.0.1.tar.gz\n' ../extern/roaringbitmap/roaringbitmap.cmake
sed -i '/URL https:\/\/archives.boost.io/,/URL_HASH SHA256/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/boost_1_67_0.tar.gz' ../extern/boost/boost.cmake
sed -i '/URL      https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/catch2-3.4.0.tar.gz' ../extern/catch2/catch2.cmake
sed -i '/URL https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/fmt-10.2.1.tar.gz' ../extern/fmt/fmt.cmake
sed -i '/URL https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/hdf5-1.14.4.tar.gz' ../extern/hdf5/hdf5.cmake
sed -i '/URL https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/json-3.11.3.tar.gz' ../extern/json/json.cmake
sed -i '/URL https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/OpenBLAS-0.3.23.tar.gz' ../extern/openblas/openblas.cmake
sed -i '/URL https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/pybind11-2.11.1.tar.gz' ../extern/pybind11/pybind11.cmake
sed -i '/URL https:\/\/github.com/,/URL_HASH MD5=/c\    URL file:\/\/\/install.all\/packages\/vsag.packages\/thread_pool.tar.gz' ../extern/thread_pool/thread_pool.cmake
 
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_INTEL_MKL=OFF -DDISABLE_AVX2_FORCE=ON -DDISABLE_AVX512_FORCE=ON .. 
export JFLAG="-j$(nproc)"
make ${JFLAG} 
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/vsag-0.11.5
2.2.26 安装 prometheus-cpp-client 1.0.1
cd /install.all/packages
unzip prometheus-cpp-client-v1.0.1.zip 
cd prometheus-cpp-1.0.1/3rdparty/
rm -rf *
cp -r /install.all/packages/prometheus-cpp-client-3rdparty/* .
cd .. && mkdir build && cd build 
cmake $CMAKE_OPT .. 
export JFLAG="-j$(nproc)"
make ${JFLAG} 
make install 
# 清理临时文件
cd /
rm -rf /install.all/packages/prometheus-cpp-1.0.1
2.2.27 安装 pybind11 2.10.0
cd /install.all/packages
unzip pybind11-v2.10.0.zip
cd pybind11-2.10.0
cp -r include/pybind11 /usr/local/include
# 清理临时文件
cd /
rm -rf /install.all/packages/pybind11-2.10.0
2.2.28 安装 braft 1.1.2
cd /install.all/packages
unzip braft-v1.1.2.zip
cd braft-1.1.2/
sed -i '/.*set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -msse4 -msse4.2")*/c\' CMakeLists.txt
mkdir build && cd build
cmake $CMAKE_OPT .. 
make ${JFLAG}
make install
# 清理临时文件
cd /
rm -rf /install.all/packages/braft-1.1.2

## 三、编译 TuGraph 4.5.2 源码

### 3.1 环境变量
```bash
vim /etc/profile
# 文件尾部添加以下内容:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.30.7-4.p01.ky10.aarch64
export LD_LIBRARY_PATH=/usr/local/lib64/lgraph:/usr/local/lib64:/usr/local/lib:/usr/lib/jvm/java-11-openjdk-11.0.30.7-4.p01.ky10.aarch64/lib/server:$LD_LIBRARY_PATH
export PYTHONPATH=/usr/local/lib64/lgraph:/usr/local/lib64:$PYTHONPATH
export PATH=/opt/apache-maven-3.8.7/bin:$JAVA_HOME/bin:$PATH
export LANG=zh_CN.utf8
export LC_ALL=zh_CN.utf8

# 生效配置
. /etc/profile
# 配置字符集
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8

3.2 编译源码

cd /install.all/TuGraph-DB/deps
# 配置npm镜像(加速前端依赖下载)
npm config set registry https://registry.npmmirror.com
# 编译依赖
./build_deps.sh

# 编译TuGraph主程序
cd ..
rm -rf build
mkdir build && cd build
# 配置编译参数(适配麒麟aarch64,指定Boost静态库)
export CMAKE_OPT="-DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -DBOOST_ROOT=/usr/local -DBOOST_INCLUDEDIR=/usr/local/include -DBoost_NO_SYSTEM_PATHS=ON -DBUILD_SHARED_LIBS=OFF"
export CXXFLAGS="-std=c++17 -fPIC"

# 核心编译命令(关键:-DENABLE_BUILD_ON_AARCH64=ON 适配ARM64)
git config --global --add safe.directory /install.all/TuGraph-DB
vim ../toolkits/CMakeLists.txt
# 在54行后面插入: target_link_libraries(lgraph_monitor PRIVATE ssl crypto), 如下:
 51 target_link_libraries(${TARGET_LGRAPH_MONITOR}
 52          lgraph_client_cpp_rpc
 53          libprometheus-cpp-pull.a
 54          libprometheus-cpp-core.a)
 55 
 56 target_link_libraries(${TARGET_LGRAPH_MONITOR} ssl crypto)

cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ -DBOOST_ROOT=/usr/local -DBOOST_INCLUDEDIR=/usr/local/include -DBoost_LIBRARY_DIR_RELEASE=/usr/local/lib -DBoost_NO_SYSTEM_PATHS=ON -DBoost_NO_BOOST_CMAKE=ON -DBoost_USE_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=ON -DOURSYSTEM=centos7 -DCMAKE_EXE_LINKER_FLAGS="-lgfortran" -DENABLE_BUILD_ON_AARCH64=ON -DOPENSSL_ROOT_DIR=/usr -DOPENSSL_LIBRARIES=/usr/lib64

# 编译+打包(生成rpm/deb安装包)
make ${JFLAG} 
make package
ls -l tugraph-4.5.2-1.el7.aarch64.rpm  # 编译好的安装包

3.3 建立打包目录

cd /install.all/TuGraph-DB/build
mkdir tugraph
cp -r output/* tugraph
rm tugraph/resource
cp -r /install.all/TuGraph-DB/src/restful/server/browser-resource tugraph/resource
cd tugraph
mkdir data
mkdir logs
vim lgraph.json
# 填入下面内容
{
    "directory" : "/install.all/TuGraph-DB/build/tugraph/data",
    "host" : "0.0.0.0",
    "port" : 7070,
    "rpc_port" : 9090,
    "enable_rpc" : true,
    "enable_plugin": true,
    "bolt_port": 7687,
    "bolt_io_thread_num": 100,
    "enable_ha" : false,
    "verbose" : 1,
    "log_dir" : "/install.all/TuGraph-DB/build/tugraph/logs/lgraph_log",
    "log_level": "INFO",
    "disable_auth" : false,
    "ssl_auth" : false,
    "server_root": "/install.all/TuGraph-DB/build/tugraph/",
    "server_key" : "",
    "server_cert" : "",
    "web" : "/install.all/TuGraph-DB/build/tugraph/resource"
}
# lgraph.json结束
./lgraph_server --log_dir "/install.all/TuGraph-DB/build/tugraph/logs" --config /install.all/TuGraph-DB/build/tugraph/lgraph.json
看到logs/下的日志输出下面信息,恭喜安装已成功:
**********************************************************************
*                  TuGraph Graph Database v4.5.2                     *
*                                                                    *
*    Copyright(C) 2018-2023 Ant Group. All rights reserved.          *
*                                                                    *
**********************************************************************
Server is configured with the following parameters:
  Backup log enable:                   0
  DB directory:                        /install.all/TuGraph-DB/build/tugraph/data
  HA enable:                           0
  HTTP port:                           7070
  HTTP web dir:                        /install.all/TuGraph-DB/build/tugraph/resource
  RPC enable:                          1
  RPC port:                            9090
  SSL enable:                          0
  Whether the token is unlimited:      0
  audit log enable:                    0
  bind host:                           0.0.0.0
  bolt port:                           7687
  bolt raft node id:                   0
  bolt raft port:                      0
  disable auth:                        0
  durable:                             0
  log dir:                             /install.all/TuGraph-DB/build/tugraph/logs
  log verbose:                         1
  number of bolt io threads:           100
  optimistic transaction:              0
  reset admin password if you forget:  0
  subprocess idle limit:               600
  thread limit:                        0
[20260601 06:35:52.464215 0x0000fffc53a87d30 INFO  src/server/lgraph_server.cpp:195] Core dump file limit size, soft limit: 18446744073709551615, hard limit: 18446744073709551615
[20260601 06:35:52.464247 0x0000fffc53a87d30 INFO  src/server/lgraph_server.cpp:201] Core dump file path: |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h

[20260601 06:35:52.484412 0x0000fffc53a87d30 INFO  src/server/lgraph_server.h:77] [StateMachine] Builtin services are disabled according to ServerOptions.has_builtin_services
[20260601 06:35:52.484849 0x0000fffc53a87d30 INFO  src/server/lgraph_server.cpp:310] Listening for RPC on port 9090
[20260601 06:35:52.506907 0x0000fffc53a87d30 INFO  src/restful/server/rest_server.cpp:479] Listening for REST on port 7070
[20260601 06:35:52.508500 0x0000fbf85efdb360 INFO  src/server/bolt_server.cpp:37] bolt server run
[20260601 06:35:52.508575 0x0000fffc53a87d30 INFO  src/server/lgraph_server.cpp:379] Server started.

四、常见问题排查

  1. 编译时提示 libgfortran 缺失:执行 yum install -y libgfortran-devel
  2. ARM 架构编译报错 “illegal instruction” :编译时添加 -DFORCE_SSE42=OFF 参数,禁用 x86 指令集;
  3. 容器启动后无法访问:检查容器端口映射(-p 参数)、服务器防火墙 / 安全组是否放行 7070/9090 端口;
  4. libstdc++.so.6 版本过低:替换为 GCC 8.4.0 编译生成的 libstdc++.so.6.0.25(见 2.1 步骤)。
  5. g++: 致命错误:已杀死 signal terminated program cc1plus 编译中断。: 内存不足,用make -j1,改为一个线程后再次尝试

总结

  1. 麒麟 Kylin10 aarch64 部署 TuGraph 4.5.2 的核心是适配 ARM 架构编译参数(-fPIC)+ 静态库编译 + 禁用 x86 指令集
  2. 依赖安装需严格按顺序执行,重点解决 Boost/Protobuf/RocksDB 的 ARM 兼容问题;
  3. 容器化封装后可直接分发部署,需挂载数据卷保证数据持久化,暴露 7070/9090 端口提供服务。

联系方式:

Email: gzsubrain@139.com