暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

openGauss6.0.0适配操作系统自带的软件,不依赖三方库

来杯拿铁 2025-04-18
248

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. 对比三库组件和系统自带软件

开源组件

版本

是否定制修改

openEuler 24.03(x86)

是否兼容24.03

备注

cmake

>=3.16

3.27.9

兼容

gcc

10.3

12.3.1

aws-sdk-cpp

1.11.327

不兼容

亚马逊服务,pg_probackup使用了;考虑建仓

boost

1.76

1.83.0

兼容

cjson

1.7.15

patch

1.7.15

兼容

etcd

源码中没有该软件包,只是创建了3个文件

移除该组件,修改代码适配

iperf

3.11

3.16

兼容

网络性能测试工具

jemalloc

5.2.1

5.3.0

兼容

通用内存分配器

kerberos

1.18.3

patch

1.21.2

不兼容

网络认证协议,升级后好多api没了

libcgroup

2.0

3.1.0

兼容

libcurl

7.78.0

patch

8.4.0

兼容

免费且易用的客户端URL传输库,支持多种协议,如HTTP、FTP、DMTP等

libedit

20210910-3.1

3.1

兼容

用于实现命令行编辑的库

libxml2

2.9.13

patch

2.11.5

兼容

llvm

12.0.1

patch

17.0.6

不兼容

目前代码中设置了支持10~12

lz4

1.9.3

patch

1.9.4

兼容

numactl

2.0.14

2.0.16

兼容

加解密算法

openssl

1.1.1m

patch

3.0.12

兼容

pljava

1.5.2

不兼容

只拷贝文件,实际没用到,移除该组件,修改代码适配

unixodbc

2.3.9

patch

2.3.9

兼容

xgboost(dmlc-core)

1.4.1

考虑在openEuler建仓,并且将dmlc-core放在一起

zlib

1.2.12

定制patch

不兼容

只能在opengauss-server仓库引入;数据压缩与解压缩的库

zstd

1.5.2

patch

1.5.5

兼容

快速压缩与解压缩算法

openjdk

1.8

1.8

兼容

Huawei_Secure_C

V100R001C01SPC010B002

boudcheck 1.1.11

兼容

安全函数

dmlc-core

v0.5

xgboost需要,可以考虑在openEuler建仓

esdk_obs_api

3.19.9.3

patch

不兼容

可以修改代码,将相关的部分删除

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论