RPM 版 PostgreSQL をインストールする場合,サーバー用ユーザーや環境変数がどのように設定されるのかが気になったので調べてみた.

postgresql12-server

RPM 版 PostgreSQL のインストール手順は簡単にまとめると以下のようになる.

sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf -qy install postgresql12 postgresql12-server
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb

postgresql12-server のインストールと同時に PostgreSQL サーバーの管理用のユーザー postgres が同時に作成される. インストール時やアンインストール時にどのようなスクリプトが実行されるかを調べてみた.

$ rpm -q --scripts postgresql12-server
preinstall scriptlet (using /bin/sh):
groupadd -g 26 -o -r postgres >/dev/null 2>&1 || :
useradd -M -g postgres -o -r -d /var/lib/pgsql -s /bin/bash \
    -c "PostgreSQL Server" -u 26 postgres >/dev/null 2>&1 || :
postinstall scriptlet (using /bin/sh):
/sbin/ldconfig
if [ $1 -eq 1 ] ; then
   /bin/systemctl daemon-reload >/dev/null 2>&1 || :
   
if [ $1 -eq 1 ] ; then 
        # Initial installation 
        systemctl --no-reload preset postgresql-12.service &>/dev/null || : 
fi 

   
systemd-tmpfiles --create  &>/dev/null || : 

fi

# postgres' .bash_profile.
# We now don't install .bash_profile as we used to in pre 9.0. Instead, use cat,
# so that package manager will be happy during upgrade to new major version.
echo "[ -f /etc/profile ] && source /etc/profile
PGDATA=/var/lib/pgsql/12/data
export PGDATA
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile" > /var/lib/pgsql/.bash_profile
chown postgres: /var/lib/pgsql/.bash_profile
chmod 700 /var/lib/pgsql/.bash_profile
preuninstall scriptlet (using /bin/sh):
if [ $1 -eq 0 ] ; then
    # Package removal, not upgrade
    /bin/systemctl --no-reload disable postgresql-12.service >/dev/null 2>&1 || :
    /bin/systemctl stop postgresql-12.service >/dev/null 2>&1 || :
fi
postuninstall scriptlet (using /bin/sh):
/sbin/ldconfig
 /bin/systemctl daemon-reload >/dev/null 2>&1 || :
if [ $1 -ge 1 ] ; then
    # Package upgrade, not uninstall
    /bin/systemctl try-restart postgresql-12.service >/dev/null 2>&1 || :
fi

# Create alternatives entries for common binaries and man files

PostgreSQL サーバー用のユーザー

インストール時に実行されるスクリプトの以下の箇所でグループとユーザーの作成が行われている.

groupadd -g 26 -o -r postgres >/dev/null 2>&1 || :
useradd -M -g postgres -o -r -d /var/lib/pgsql -s /bin/bash \
    -c "PostgreSQL Server" -u 26 postgres >/dev/null 2>&1 || :

ユーザーディレクトリは /var/lib/pgsql に設定されている.

一方,アンインストール時にグループやユーザーを削除する処理は行われていない. したがって,RPM でインストールした PostgreSQL を完全にアンインストールするには,以下のようにグループやユーザーを手動で削除してやる必要がある.

sudo userdel -r postgres

環境変数 $PGDATA

インストール時に実行されるスクリプトの以下の箇所で /var/lib/pgsql/.bash_profile/var/lib/pgsql/.pgsql_profile という 2 つのファイルが作成されている.

# postgres' .bash_profile.
# We now don't install .bash_profile as we used to in pre 9.0. Instead, use cat,
# so that package manager will be happy during upgrade to new major version.
echo "[ -f /etc/profile ] && source /etc/profile
PGDATA=/var/lib/pgsql/12/data
export PGDATA
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile" > /var/lib/pgsql/.bash_profile

コメントに書かれているとおり,環境変数などをカスタマイズをしたい場合,/var/lib/pgsql/.bash_profile ではなく /var/lib/pgsql/.pgsql_profile に記述することになる. これは /var/lib/pgsql/.bash_profile の後に /var/lib/pgsql/.pgsql_profile が読み込まれるためである, 例えば,デフォルトの $PGDATA/var/lib/pgsql/.bash_profile で設定されているとおり /var/lib/pgsql/12/data となっているが,これを変更したい場合,/var/lib/pgsql/.pgsql_profile$PGDATA を設定すればよい.