openGauss6.0.0适配操作系统自带的软件,不依赖三方库
1. 简介
openGauss6.0.0 企业版适配 openEuler 2403 操作系统自带的软件,不依赖三方库组件
2. 适配原理
先整理出来 openGauss6.0.0 企业版目前用了三方库的哪些组件,分析 openEuler 2403 操作是否有这些软件,如果没有,考虑在 openEuler 建仓或者先编译需要的三方库,再编译 server;如果有,分析三方库中的软件和 openEuler 2403 操作系统所带的软件版本是否匹配,是否兼容;如果不兼容,那么还是在编译的时候需要先编译三方库的软件,再编译 server;兼容则使用系统自带的软件。
3. 详细操作步骤
3.1 将三方库的里面的开源组件先统计出来
对三方库大致有个印象,并且可以对各个组件进行标识,哪些一定要,哪些不确定,方便后续验证
aws-sdk-cpp
boost
cjson
etcd (install会用到)
event (有待确定)
fio (无,有待确定)
iperf (有待确定)
jemalloc (有待确定)
kerberos
libcgroup
libcurl
libedit
libobs (无,有待确定)
libxml2
llvm (有待确定)
lz4
masstree (有待确定 mot)
memcheck (无,有待确定)
mysql_fdw (无,有待确定)
nng (有待确定)
numactl
openssl
oracle_fdw (无,有待确定)
pljava (这个修改下代码,就可以,实际没有用到这里面的库,只是拷贝了文件)
tassl (无,有待确定)
unixodbc
xgboost
zlib1.2.11
zstd
3.2 统计操作系统已经拥有的软件以及版本
通过 yum search xxx,可以查找操作系统是否有对应的软件,以及版本。
3.3 对进行标识的组件进行编译验证
上面提到的(无,有待确定的)指的是:和openGauss5.0.0统计的开源组件相比没有的
(有,有待确定的)指的是:和openGauss5.0.0统计的开源组件中存在的
3.4 验证的原理
- 先将操作系统已经有的软件通过 yum 下载;
- 编译 server 仓库的时候,先使用官方提供的三方库;如果说想验证哪些库,那么将三方库对应的库删掉
3.4.1 先验证(无,有待确定的),是否需要这些库
rm -rf libobs/ memcheck/ mysql_fdw/ oracle_fdw/ etcd/ fio/ tassl/
libobs 需要(编译用到了)
etcd (install的时候用到了)
3.4.2 其次验证 (有,有待确定的),是否需要这些库
rm -rf event/ iperf/ masstree/ llvm/ nng/ jemalloc/
llvm (编译需要)
iperf (install需要)
jemalloc (编译需要)
4. 对比三库组件和系统自带软件
openjdk8 config会校验三方库有没有,没有报错;会将jre放到 jre目录下
pljava 只有在lite版本中,才会用到,并且只是将里面的jar,lib,udstools.py一起打包到lib/postgresql/java share/postgres/tmp
5. openEuler repo源需要下载的组件的命令
yum install -y cmake gcc gcc-c++ openssl-devel python tar \
lz4-devel zstd-devel boost-devel cjson-devel libcgroup-devel libcurl-devel \
unixODBC-devel jemalloc-devel java-1.8.0-openjdk-devel libedit-devel \
libaio-devel bison flex DCF numactl-devel libxml2-devel xerces-c-devel
编译plugin企业版还需要
- xerces-c
- xerces-c-devel
查询版本号:
krb5-config --version
xml2-config --version
llvm-config --version
openssl version
mot依赖的组件有:
- masstree
编译server的命令
-DENABLE_MULTIPLE_NODES=OFF -DENABLE_THREAD_SAFETY=ON -DWITH_OPENEULER_OS=ON -DENABLE_OPENEULER_MAJOR=ON
6. 不用三方库,用系统依赖编译server
需要注意的是,如果确定要用的三方库并且系统没有或者不兼容,需要在新系统中,重新编译下再使用。
6.1. 去掉obs组件
参考pr:https://gitee.com/opengauss/openGauss-server/pulls/2021
6.2. 机器不支持avx512,只有avx,avx2
导致编译dataevc插件有问题
通过编译宏来控制
6.3. krb不兼容,krb5.h头文件没有krb5_set_profile_path方法
krb5 版本1.21.2
三方库的版本是1.18.3
krb5_set_profile_path 在krb1.21 被移除了
krb5_clean_cache_profile_path 该方法在,krb5 1.20 被移除了,需要手动实现
6.4. 将securec替换为-l${SECURE_C_CHECK}
boundscheck
securec
6.5. jni.h 这是 openjdk 的库
下载 openjdk8,并且配置相关的配置
格式化
find /tmp/lh/gitee/server_600_1 -type f -exec dos2unix {} +
6.6. llvm支持的版本在10~12
三方库是12
openEuler2403 是17
比较:头文件和类的重构:
在 LLVM 的不同版本之间,某些 API 可能会发生变化,某些类和方法可能会被重命名、移动或删除。这可能会导致依赖于旧 API 的代码在新版本中无法编译。
6.7. openssl3.0 和 openssl1.1 api 不同
经过测试目前,有一个 api 不同 (去官网搜下)
1.1 EVP_PKEY_set_alias_type
3.0 EVP_PKEY_set_type
6.8. cmake install 的时候,如果是 yum 下载的包,就不用 install
系统已经存在的包,在 cmake 中就不需要 install 了,所以需要修改 src/CMakeLists.txt 文件
6.9. datavec 插件需要 cpu 支持 avx512
如果机器不支持 avx512 指令,那么需要添加判断条件
7. 编译三方库
编译aws-sdk-cpp 需要在 openEuler2403 建立仓库
编译需要 libcurl.so,修改脚本,使用系统的
zlib-devel libcurl-devel
sh build.sh
xgboost 需要在openEuler2403 建立仓库
zlib 做过定制修改,不兼容
sh build.sh -m build
krb 版本不兼容
python3 build.py -m all -f krb5-1.18.3-final.tar.gz -t "comm|llt"
llvm 版本不兼容(去除,不使用)
sh build.sh -m build
8. 问题
8.1. llvm
Triple.h 是 LLVM 中的一个头文件,定义了 llvm::Triple 类,该类用于表示目标三元组(target triple),即描述目标平台的字符串格式。这个头文件在 LLVM 的早期版本中是存在的,但在 LLVM 版本 14 及以后的版本中,LLVM 进行了重构,导致某些头文件和类的组织发生了变化。
版本变化
LLVM 14 及以后的版本:
在 LLVM 14 版本中,Triple.h 头文件被移动到 llvm/TargetParse/Triple.h。因此,如果您在使用 LLVM 14 或更高版本,您应该使用 #include <llvm/TargetParse/Triple.h> 来包含这个头文件。
从代码中,可以看到llvm的版本要在10~12,三方库的是12,openEuler2403是17
其中llvm组个组件使用的模块有codegen,mot ,但是这两个模块目前不可用,所以删除(二进制占用了48M)
8.2. openssl3.0 一些 api 被移除
EVP_PKEY_set_alias_type 3.0 修改EVP_PKEY_set_type
8.3. fatal error: sys/sysctl.h: No such file or directory、
这个是因为在 openEuler 系统中头文件是linux/sysctl.h 之前-DENABLE_OPENEULER_MAJOR=ON 这个宏已经定义了,所以只要加上这宏就可以
8.4. -DOPENSSL_SUPPRESS_DEPRECATED 抑制 openssl 告警
这是一个预处理器宏定义 -DOPENSSL_SUPPRESS_DEPRECATED,让我来解释它的作用:
1. -D 是编译器的预处理器选项,用于定义一个宏
OPENSSL_SUPPRESS_DEPRECATED 是宏的名称
这个宏的主要作用是:
抑制 OpenSSL 库中关于使用废弃(deprecated)函数的警告信息
当你使用了一些 OpenSSL 中已经被标记为废弃的 API 时,编译器通常会发出警告
通过定义这个宏,可以暂时禁用这些警告信息
使用场景:
当你的代码还在使用一些旧版本的 OpenSSL API
在代码迁移过程中临时使用,以避免大量警告信息干扰开发
在某些必须使用旧 API 的特殊情况下
注意事项:
不建议在生产环境中长期使用此宏
最好是更新代码以使用新的推荐 API
这只是一个临时的解决方案,应该计划逐步更新废弃的函数调用
步骤
git clone https://gitee.com/hengliue/Plugin.git -b 600_new_2
git clone https://gitee.com/hengliue/openGauss-server-1.git -b new_600_2




