news 2026/9/24 20:14:25

麒麟V10安装openGauss全记录:兼容性排查与源码编译实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
麒麟V10安装openGauss全记录:兼容性排查与源码编译实战

下午四点多,我接手一台刚装好银河麒麟 V10 的服务器,任务很明确:把 openGauss 跑起来。当时我心里想的是,数据库安装这种事,最多半小时搞定。结果从下午一直折腾到晚上,中间踩的坑一个接一个,最后跑通的瞬间差点没绷住。

多说一句:项目记录里写的是 “opengauess”,实际查下来就是 openGauss,那个开源的集中式数据库。所以本文记录的就是麒麟 V10 环境下安装 openGauss 的完整问题排查过程。如果你正在做同样的事,或者是第一次接触国产操作系统上的数据库部署,这篇内容大概率能帮你省掉几个小时。

先说结论:麒麟 V10 本质上是一套 Linux 发行版,但它和常见的 CentOS、Ubuntu 都有细节差异。openGauss 官方又没有针对麒麟系统的专用安装包,所以核心难点不在于 openGauss 本身,而在于怎么处理系统环境和数据库要求之间的各种“不匹配”。下面我把整个过程按问题域拆开讲。

1. 拿到机器先别急着装,花了10分钟确认版本,省了一下午

1.1 麒麟v10不是一个版本,至少先把这几项看清楚

不少人拿到机器就急着找安装包,结果下载半天,解压后一运行就报错,回头才发现是架构不匹配。麒麟 V10 有多个变体:有服务器版、桌面版,有基于 ARM64 架构的(常见于鲲鹏、飞腾处理器),也有 x86_64 架构的;不同批次的系统,底层兼容目标还不一样,有的偏 CentOS 7 的兼容层,有的偏 openEuler 的。

在动手之前,先把下面这几项记下来:

cat /etc/os-release cat /etc/kylin-release uname -m getconf LONG_BIT cat /proc/version

重点看两个信息:

  • 系统的具体版本号,比如 “Kylin Linux Advanced Server release V10” 这种;
  • CPU 架构,aarch64还是x86_64

我当时查完之后,确认手上的机器是 ARM64 架构的服务器版麒麟 V10。这个信息直接决定了后面下载哪个安装包。很多人第一次装失败,就是因为在 x86 机器上下载了 ARM 包,或者反过来。

另外,还有一个小细节:如果机器上有多个磁盘,df -h看一下挂载情况。openGauss 数据库空间会随业务增长,安装时最好把数据目录放到容量充足的独立挂载点,不要一股脑塞在根目录/下面。这个是老 DBA 的习惯,后面出现“磁盘写满导致初始化失败”的时候,你就知道这个检查有多重要了。

1.2 依赖、磁盘和yum源:安装前的底层准备

麒麟 V10 服务器版一般自带可用的 yum 源,但有时候内网环境或者定制版系统会把这些源精简掉。我当时执行yum makecache就发现有几个仓库连不上,所以先切换到了系统 ISO 镜像做临时源,确保依赖能装上。

openGauss 安装需要一批基础依赖:libaiolibaio-develflexbisonncurses-develglibc-develpatchreadline-devel这些。如果是源码编译,还需要gccgcc-c++cmakemake。可以先批量安装:

yum install -y libaio libaio-devel flex bison ncurses-devel glibc-devel patch readline-devel gcc gcc-c++ cmake make

这里踩过一个小坑:有些麒麟系统默认的gcc版本比较老,这一点我在后面第 2 章详细说。另外如果在安装过程中报 Python 相关的依赖缺失,也别慌,通常是因为系统自带的 Python 版本或环境变量问题,后面会讲到。

磁盘检查也不能省。openGauss 官方对磁盘空间有最低要求,但实际上编译安装时还需要额外的临时空间。建议至少保证安装包目录之外有 5GB 以上空闲空间,否则编译到一半“No space left on device”,整段白干。我那次就是边装边发现/tmp快满了,清理了一堆临时文件才继续。

2. 下载包选型:二进制优先还是源码编译优先,直接决定后面顺不顺利

2.1 官网没有麒麟版安装包,兼容关系要自己判断

openGauss 官网下载页并不会提供 “Kylin V10” 专用包,一般给的是针对 CentOS、openEuler 等系统的分发包。麒麟 V10 不是 CentOS,也不是 openEuler,所以这里就出现了一个问题:到底下载哪个?

我的判断逻辑是:先看系统自己的发行版底子。麒麟 V10 不同版本底子不同,有的兼容 CentOS 7,有的更接近 openEuler。可以用rpm -qi centos-releasecat /etc/redhat-release这类命令辅助判断,不过不是每台机器都能查得出来。比较朴素的验证方法是“小成本试错”:先下载一个自认为兼容性最高的二进制包,解压后看能否正常运行;不行再换。

这里我没法给一个“选A一定对”的结论,因为麒麟 V10 的变体太多了。但方向是明确的:优先选择与系统 glibc 版本兼容的包,而不是看名字像不像。系统里执行ldd --version就能看到 glibc 版本,然后对比安装包的要求。

2.2 二进制包方案:快,但容易被glibc和openssl卡住

二进制包方案是最快的,解压后直接安装依赖就能跑。openGauss 的分发包一般是一个 tar.gz 或多个 rpm 的组合,里面包含了编译好的二进制文件、依赖库、脚本等。好处是不需要本地编译器,省去了 gcc 版本问题的烦恼。

但代价也明显:如果系统 glibc 版本比较新,或者缺少某些libssl.solibcrypto.so之类的兼容库,二进制包跑起来就会报error while loading shared libraries。这种情况我在现场见过不止一次,最常见的就是缺libssl.so.1.1

一种处理思路是安装兼容版本库:

yum install -y openssl11 openssl11-devel

然后用LD_LIBRARY_PATH指过去,或者做软链接。但这样做有一定风险,因为 openGauss 自带了一部分库在安装目录的lib下,如果系统库和自带库混在一起,版本冲突会更难排查。所以我的建议是:如果系统提示缺某个.so,先检查 openGauss 自带lib目录里有没有,再决定是系统层面的问题还是安装包本身的问题。

2.3 源码编译方案:稳妥但要先搞定gcc

源码编译最大的好处是能根据当前系统环境生成可执行文件,glibc 不匹配的概率会低很多。代价是编译时间长,而且对 gcc 版本有硬性要求。openGauss 文档里明确要求高版本 GCC,一般是 7.3 以上;如果系统自带的 gcc 是 4.8.5,编译时大概率会翻车。

麒麟 V10 有的版本自带 gcc 就是 4.8.5,这是和 CentOS 7 兼容的产物。遇到这种情况,有几个解决方向:

  • 用 SCL 软件集安装更高版本 gcc,例如devtoolset-7,但麒麟的源里不一定有;
  • 自行编译安装新版 gcc,耗时较长;
  • 切换到二进制包方案,绕开编译。

我当时先试了二进制包方案,在解压后测试阶段碰到几个依赖库问题,花了不少时间。后来决定转源码编译,因为这台机器以后还要装其他组件,编译器版本高了总归是好事。编译 gcc 的过程比较枯燥,但值得记录一个关键点:编译前需要yum install -y gmp-devel mpfr-devel libmpc-devel,否则在 configure 阶段就会报错,这又是一个容易提前踩的坑。

2.4 我这次实际走的路线

坦白讲,我不建议所有人都一上来就源码编译。如果你只为了把 openGauss 跑起来做测试,或者对系统依赖不熟悉,优先试二进制包;如果是为了生产环境长期使用,源码编译一次,后面会省心很多。

我这次最终是按源码编译路线跑通。整个编译过程耗时大概一个多小时,主要是 gcc 和 openGauss 本体各占一部分。编译完成后,后续的安装反而比二进制包更顺,因为很多依赖已经在那一次编译准备阶段一并解决了。如果你拿到的机器配置不高,编译时间会更长,这时候建议开个终端挂着,随时看输出。

3. 安装执行过程里的几类拦路虎

3.1 缺依赖的报错排查:不要盲目“yum install 一切”

openGauss 的安装脚本跑起来后,如果发现缺依赖,会直接中断并提示缺少哪个包。很多人第一反应是yum install -y 包名,装完继续跑,结果下一个依赖又报错,如此反复。

更高效的做法是先了解脚本到底在用哪些命令。openGauss 的安装过程实质上是把二进制文件、动态库、配置模板拷贝到目标目录,然后调用初始化程序。所以依赖问题主要集中在:

  • 动态库缺失,例如libaio.so.1
  • 命令不存在,例如bisonflex
  • 系统版本判断脚本没有识别出麒麟系统。

其中第三个问题最隐蔽。openGauss 的安装脚本有时会读取/etc/os-release里的字段,如果发现既不是 centos 也不是 openEuler,就可能直接走“不支持的系统”分支,甚至什么都不说就失败。我当时查脚本源码,发现它其实会对系统名做关键词匹配,麒麟系统里ID=kylin这个值它可能不认识。

解决办法也简单:不要纠结于“让脚本认识麒麟”,而是手动走完它该走的步骤。比如把脚本里的系统判断条件临时改成支持的分发版名称,或者干脆手动完成目录拷贝和环境变量配置。这里提示一句:修改安装脚本前先备份原文件,免得改错了无法恢复。

3.2 “common包找不到”类报错的真实原因

在安装过程中,我碰到一个很典型的报错,大概意思是提示找不到common相关包。一开始我以为是自己拼错了,后来仔细看安装脚本才发现:openGauss 分发包并不是一个单一文件,而是包含多个子包,比如 server、om、common 等。如果下载的时候漏了某一块,或者解压后目录结构不完整,安装脚本就会报“找不到 common 包”。

网上很多人把这个报错写成“不存在 commom 包”,其实错误文本里可能就是这个拼写,但根因都一样:安装脚本在固定路径下找某个 rpm 或目录,没找到。

解决思路也不复杂:

  1. 重新确认下载包完整性,用官方提供的校验工具或 sha256 校验文件对比;
  2. 解压后查看子目录结构,确保 server、common、om 这些模块都在同一个父目录下;
  3. 如果安装脚本允许指定目录,把目录路径指到实际位置。

我在现场遇到过另一种情况:从内网仓库下载时,rpm 包被重新命名过,导致脚本按原文件名找不到。解决方法是在脚本中搜索文件名,改成实际下载后的名字。

3.3 openssl库和系统自带库冲突的处理思路

麒麟 V10 系统自带的 openssl 版本一般比较新,而 openGauss 部分历史版本依赖的是libssl.so.1.1libcrypto.so.1.1。如果系统只有libssl.so.3,在启动或初始化阶段就会报类似libssl.so.1.1: cannot open shared object file的问题。

我的建议处理顺序是:

  • 先查 openGauss 安装目录lib下有没有自带 libssl 相关文件,很多官方包其实内置了,只是没有写进LD_LIBRARY_PATH
  • 如果内置版本和系统版本冲突,优先在启动脚本里把 openGauss 自己的 lib 目录放到LD_LIBRARY_PATH最前面,避免加载系统库;
  • 确认源码编译时到底链接的是哪个 openssl,必要时在 configure 阶段用--with-openssl指定。

这里有个容易忽略的细节:不只是 openGauss 主程序,它的gs_ctlgsqlgs_initdb这些工具也会受库版本影响。排错的时候别只盯一个命令,把常用工具都手动跑一遍ldd检查一下。

4. 初始化实例:权限、内核参数、日志判断一个都不能少

4.1 为什么openGauss拒绝用root运行,以及怎么正确切换用户

openGauss 出于安全考虑,禁止 root 用户直接初始化和运行实例。新手第一次跑初始化命令时经常被这个规则卡住,还以为是权限不够,直接chmod 777把整个目录改了,最后问题反而更复杂。

正确做法是创建专用系统用户:

useradd omm passwd omm

然后把安装目录归属到这个用户:

chown -R omm:omm /opt/openGauss

后面所有初始化、启动、连接操作,都先切换到 omm 用户:

su - omm

为什么要这样做?因为 openGauss 实例一旦以 root 身份启动,数据文件的权限边界会变得危险。这个设计其实和 PostgreSQL 的思路一致:数据库专用账户对数据目录拥有完全控制权,但不会影响系统其他部分。运维阶段很多“为什么连不上”“为什么启动失败”的问题,有一半是因为用了错误的用户去执行命令。

4.2 内核参数调整:哪些是必须的,哪些可以后调

openGauss 对内核有一些参数要求,主要集中在共享内存和进程数上。官方文档会给一组推荐值,像kernel.semkernel.shmmaxkernel.shmallfs.aio-max-nrfs.file-max等。

如果你不确定当前值,可以一次性查出来:

sysctl kernel.sem kernel.shmmax kernel.shmall fs.aio-max-nr fs.file-max

临时生效可以直接写:

sysctl -w kernel.sem="250 32000 100 128" sysctl -w kernel.shmmax=4294967295 sysctl -w kernel.shmall=1048576

但要注意,临时方式重启后失效。如果要长期生效,需要把参数写进/etc/sysctl.conf然后执行sysctl -p

这里区分一下“必须调”和“可以后调”:不调kernel.sem的话,初始化阶段很容易失败;而vm.overcommit_memory这类参数,不调整会影响数据库在高并发下的表现,但不至于连初始化都过不去。如果你在低配置虚拟机上装,内存本身就紧张,调完共享内存参数后反而可能因为shmmax过大导致内存分配异常,所以建议先小后大,初始化成功后再按官方文档调整到生产值。

4.3 初始化失败时的日志排查顺序

初始化失败是最高频的问题,而且报错信息往往很简短。我的排查顺序基本固定:

  1. 权限问题:看安装目录和数据目录的 owner 是不是 omm;ls -l瞅一眼,不是就 chown。
  2. 磁盘空间df -h看数据目录所在分区是否已满,满的话清理临时文件。
  3. 环境变量:确认PATH里有没有 openGauss 的bin目录,LD_LIBRARY_PATH有没有指向 openGauss 的lib目录。
  4. 日志文件:在数据目录下的log子目录中找gs_initdb_*.log,按时间戳排在最前面的就是最新的报错记录。

有一个坑需要单独说:日志文件里的时间戳不一定和当前时间一致,因为可能是容器环境下时间未同步。不要只看文件名,要tail -n 100翻一下内容,根据具体错误去搜网上信息。

5. 启动连库与开机自启:收尾阶段最有价值的三件事

5.1 gsql连不上的时候,先按这个顺序自查

初始化完成之后,启动实例、用 gsql 连库,按说应该一路畅通,但实际总会冒出几个怪问题。我总结了一套自查清单:

  • 进程是否在跑:ps -ef | grep gauss
  • 端口是否监听:ss -lntp | grep 5432
  • 防火墙是否放行:firewall-cmd --list-ports
  • 环境变量是否在当前会话中生效:echo $GAUSSHOMEecho $GAUSSDATA

如果 gsql 本机都连不上,先看端口,再看认证配置pg_hba.conf和监听配置postgresql.conf。openGauss 默认行为和 PostgreSQL 有相似之处,但也有差异。有一个坑是:改完监听地址后,需要重启实例才能生效,不要只 reload。

连接的经典测试命令是:

gsql -d postgres -p 5432 -r

如果出现口令错,多半是初始化时设置的密码和当前输入不一致;如果是could not connect to server,大概率还是端口或监听地址的问题。

5.2 给openGauss配置systemd或rc.local自启动

openGauss 自带的启停工具是gs_ctl,但它没有自动注册 systemd 服务。服务器重启后,如果没人手动执行gs_ctl start,数据库就不会起来。生产环境必须解决开机自启问题。

我习惯用 systemd 管理,配置文件大致是:

[Unit] Description=openGauss Database After=network.target [Service] User=omm Group=omm Environment=GAUSSHOME=/opt/openGauss Environment=GAUSSDATA=/opt/openGauss/data ExecStart=/bin/su - omm -c '/opt/openGauss/bin/gs_ctl start -D /opt/openGauss/data' ExecStop=/bin/su - omm -c '/opt/openGauss/bin/gs_ctl stop -D /opt/openGauss/data' Restart=on-failure Type=forking [Install] WantedBy=multi-user.target

有几个注意事项:

  • 不要用User=root去跑gs_ctl,openGauss 会拒绝 root 启动,所以用/bin/su - omm -c切换;
  • Type=forking是因为gs_ctl start会 fork 出后台进程,如果类型设错,systemd 可能会以为服务没起来,反复拉起;
  • 必须写对GAUSSDATA路径,指向的是数据目录,不是安装目录。

如果不想折腾 systemd,也可以用传统 rc.local:

sudo -u omm /opt/openGauss/bin/gs_ctl start -D /opt/openGauss/data

然后给/etc/rc.d/rc.local加执行权限。但说实话,systemd 的日志记录和状态管理更清晰,我最终用的是 systemd 方案。

5.3 建议趁早养成的备份和巡检习惯

数据库起来不代表事情结束了,运维阶段更重要。openGauss 自带gs_dump可以做逻辑备份,我也建议定期把postgresql.confpg_hba.conf这些配置单独拷贝一份到安全位置。

还有一个容易忽略的点:日志文件会一直增长,长时间不清理会占用大量空间。可以在系统层面配置 logrotate,对$GAUSSDATA/log下的日志做周期切割。openGauss 的日志命名里有时间戳,切割策略可以按天来做。

我在实际使用中发现,很多紧急故障其实都是“小事积累”出来的:磁盘慢了、日志爆了、权限被误改了。所以建议隔一段时间就跑一遍gs_checkperf之类的工具做健康检查,或者至少看下日志目录大小和进程 CPU 占用。趁早养成这些习惯,后面能省掉不少救火时间。

再说回我这次安装过程,最耗时间的部分并不是 openGauss 本身的安装动作,而是我在反复试错系统兼容性。如果你现在正准备在一台麒麟 V10 上部署 openGauss,我的建议是先把系统版本、架构、glibc 版本这三个信息查清楚,再决定用二进制包还是源码编译。看到报错先稳定心态,按“日志路径 → 环境变量 → 权限 → 依赖库”的顺序排查,很多坑其实不需要全踩一遍也能绕过去。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 20:13:54

2026年多步骤办公自动化工具实战选型指南

1. 这不是“AI办公助手”排行榜,而是2026年真实可用的多步骤任务自动化工具实战图谱你搜“2026年AI办公工具排名”,页面跳出一堆带“权威发布”“十大榜单”字样的软文,点开全是厂商通稿、参数罗列、截图堆砌——用了一周发现:它根…

作者头像 李华
网站建设 2026/9/24 20:13:25

CNN遥感影像地物分类实战:Landsat数据处理与Python源码详解

简介:一套基于PyTorch的CNN深度学习遥感影像地物分类项目源码,面向人工智能、遥感、自动化、电子信息等专业的高校师生与从业者,适用于毕业设计、课程设计或项目初期演示。代码经严格测试可正常运行,包含数据切块、模型训练、新影…

作者头像 李华
网站建设 2026/9/24 20:12:42

FineReport替代方案全解析:选型、迁移与数据校验实战

1. 为什么2026年大家开始认真聊FineReport替代先说一个我今年遇到的实际场景。年初帮一家制造企业做报表平台改造,他们用FineReport差不多六年,模板两百多张,光报表服务器就部署了三台,一年授权费加服务费大几十万。原本没觉得有什…

作者头像 李华
网站建设 2026/9/24 20:12:37

伦理量子信息学:用量子纠缠解释道德认知与AI对齐

1. 从两套语言的困境说起:为什么需要这门交叉学科我做量子信息研究有年头了,平时接触的论文和同行交流,几乎全是希尔伯特空间、密度矩阵、纠缠熵这类抽象术语。我另一个长期关注的方向是伦理学——不是书斋里的规范伦理学,而是跟科…

作者头像 李华
网站建设 2026/9/24 20:10:13

CAS单点登录从原理到实战:TGT/ST票据交互与系统接入全解析

做统一登录这么多年,CAS这套东西我属实是又爱又恨。爱的是它老而弥坚,设计思路干净,撑起了无数老系统的认证半边天;恨的是初次接触的人,十有八九会被它那一堆 filter、service 参数和回调地址绕得晕头转向。但平心而论…

作者头像 李华
网站建设 2026/9/24 20:09:58

2026数据治理选型指南:AI原生平台能力分化与落地路径

1. 数据治理的2026分水岭:为什么“AI原生”不再是口号如果你在数据治理这个行当里摸爬滚打了几年,应该有一个明显的体感:2023年之前,大家聊的还是“数据质量怎么提上去”“元数据怎么补全”“血缘怎么画清楚”;到了202…

作者头像 李华