暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

root用户?安装PostgreSQL数据库?

原创 周波 2025-07-03
564

一、前言

  最近,有个同事向我询问了一个关于安装PostgreSQL数据库的问题,出于测试目的,他准备在用户提供的专用机上安装PostgreSQL数据库,操作系统为Kylin V10,CPU架构为ARM,但碰壁了,数据库软件源码编译安装结束之后,准备使用root用户执行initdb数据库初始化命令时,报类似如下的错:

initdb: error: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.

  要解决不能使用root用户(准确来说是uid=0的操作系统用户)初始化PostgreSQL数据库的问题,想到了使用docker容器,通过docker服务启动PG镜像容器以实现PG数据库的快速安装部署,方法可行,于是请我帮忙找符合软硬件条件的deb软件包,好吧,我是大好人,爽快同意帮忙找,我结合自己国产电脑上配置的麒麟软件包源,终于找到了相关源,此处留痕一下:

deb软件包源网站:https://archive.kylinos.cn/kylin/KYLIN-ALL/pool/universe/
rpm软件包源网站:https://update.cs2c.com.cn/NS/V10/V10SP1/os/adv/lic/base/

  方法是好的,可不知怎的,他没能顺利的在专用机上安装docker容器,这条路也算走到头了,没再继续考虑其它容器工具。
  仔细考虑这个报错,源代码中肯定存在某个条件判断逻辑,当使用root用户执行initdb命令时,就会提示相关信息并退出初始化程序。于是我想,能否调整源代码,以允许root用户能够执行initdb命令,详见下文。

二、调整PG源码,以允许root用户初始化数据库

  在PG源码中搜索相关报错信息:

[root@alldb /opt/software/pg14/postgresql-14.2/src]# grep -ri "cannot be run as root" .
...
./bin/initdb/initdb.c:		pg_log_error("cannot be run as root");
...

  进一步查看initdb.c源码文件,发现如下条件逻辑:

#ifndef WIN32
        if (geteuid() == 0)                     /* 0 is root's uid */
        {
                pg_log_error("cannot be run as root");
                fprintf(stderr,
                                _("Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
                                  "own the server process.\n"));
                exit(1);
        }
#endif

  这是一个典型的防止以 root 用户运行程序的检查逻辑,这段代码只会在非Windows系统上生效。当满足条件时,即geteuid() == 0,会提示相关信息,并退出程序。于是我搜索了所有源码文件,将存在geteuid() == 0条件判断的代码段中的exit(1)注释掉。如下:

[root@alldb /opt/software/pg14/postgresql-14.2/src]# grep -ri "geteuid() == 0" .
./backend/main/main.c:	if (geteuid() == 0)
./bin/pg_resetwal/pg_resetwal.c:	if (geteuid() == 0)
./bin/pg_rewind/pg_rewind.c:	if (geteuid() == 0)
./bin/pg_ctl/pg_ctl.c:	if (geteuid() == 0)
./bin/initdb/initdb.c:	if (geteuid() == 0)			/* 0 is root's uid */
vim ./backend/main/main.c
 if (geteuid() == 0)
        {
                write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n"
                                         "The server must be started under an unprivileged user ID to prevent\n"
                                         "possible system security compromise.  See the documentation for\n"
                                         "more information on how to properly start the server.\n");
                //exit(1);
        }

# 其它文件修改类似,不做赘述

  调整完之后,重新编译安装,即可使用root用户对PG数据库执行初始化、启动、停止等操作。

./configure --prefix=/data/pg14 --with-port=5432 --without-icu
make
make install

  本文针对PG源码的调整,技术含量极低,只能算是微微调,不影响PG数据库整体的功能。这种检查是重要的安全实践,因为:

  • 最小权限原则:服务程序应该以所需的最低权限运行
  • 减少风险:避免因程序漏洞导致整个系统被攻陷
  • 安全隔离:以专用用户运行服务便于权限管理和审计
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论