创建 postgres 表空间权限被拒绝,即使它归 postgres 所有

创建 postgres 表空间权限被拒绝,即使它归 postgres 所有

我一直在尝试在 postgresql 9.5 中创建表空间,但一直遇到权限被拒绝的问题。我最终决定创建一个目录,/看看是否能正常工作,但到目前为止还没有成功。

以供参考:

[root@server ~]# cd /
[root@server /]# mkdir test
[root@server /]# chown postgres:postgres test
[root@server /]# su postgres
bash-4.3$ psql
psql (9.5.5)
Type "help" for help.

postgres=# CREATE TABLESPACE test LOCATION '/test';
ERROR:  could not set permissions on directory "/test": Permission denied
postgres=# \q
bash-4.3$ cd test
bash-4.3$ chmod 777 .
bash-4.3$ ls -alh
total 8.0K
drwsrwsrwx.  2 postgres postgres 4.0K Jan 27 20:15 .
dr-xr-xr-x. 19 root     root     4.0K Jan 27 20:15 ..
bash-4.3$ pwd -P
/test
bash-4.3$ psql
psql (9.5.5)
Type "help" for help.

postgres=# CREATE TABLESPACE test LOCATION '/test';
ERROR:  could not set permissions on directory "/test": Permission denied

我甚至给目录赋值为 777,很明显它归 postgres 所有。此时我不确定该怎么做才能让它工作。我正在运行 fedora-25。我理想情况下不想把它放进去,/而是把它放在一个单独的磁盘上,但我甚至无法让这个基本情况工作。我是不是忽略了什么明显的东西?

答案1

您已启用 SELinux,但却错过了它正在阻止此功能。

您可以在审计日志中看到日志条目/var/log/audit/audit.log

解决该问题最简单的方法是使用默认数据目录位置,/var/lib/pgsql并且不要尝试覆盖它。相反,请在此位置安装您的存储。

答案2

我在 Fedora 上也遇到过类似的问题。甚至/var/log/audit/audit.log没有人提供任何线索,说原因是 SElinux。

表空间目录正常。

[me@my /]$ ls -alr /psql
drwx------.  2 postgres postgres 4096 14.Mar 22.56 a
dr-xr-xr-x. 19 root     root     4096 14.Mar 15.13 ..
drwxr-xr-x.  3 postgres postgres 4096 14.Mar 15.21 .

但是 CREATE TABLESPACE 失败。

[me@my /]# psql -U postgres 
postgres=# create tablespace test_index location '/psql/a';
ERROR:  could not set permissions on directory "/psql/a": Permission denied
postgres=# \quit

Stracing 确认了一个问题:

[me@my /]$ ps ax |grep postgres
18719 ?        S      0:00 /usr/bin/postgres -D /var/lib/pgsql/data
18720 ?        Ss     0:00 postgres: logger process
18722 ?        Ss     0:00 postgres: checkpointer process
18723 ?        Ss     0:00 postgres: writer process
18724 ?        Ss     0:00 postgres: wal writer process
18725 ?        Ss     0:00 postgres: autovacuum launcher process
18726 ?        Ss     0:00 postgres: stats collector process
20446 ?        Ss     0:00 postgres: postgres postgres [local] idle

strace failed:

[me@my /]$ sudo strace -p 20446
strace: Process 20446 attached
epoll_pwait(3, [{EPOLLIN, {u32=2672404064, u64=94302974355040}}], 1, -1, NULL, 8) = 1
recvfrom(11, "Q\0\0\0005create tablespace test_inde"..., 8192, 0, NULL, NULL) = 54
lseek(5, 0, SEEK_END)                   = 8192
chmod("/psql/a", 0700)                  = -1 EACCES (Permission denied)

关闭SElinux终于解决了问题

[me@my /]# setenforce 0
[me@my /]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31
[me@my /]# psql -U postgres 
psql (9.6.7)

postgres=# create tablespace test_index location '/psql/a';
CREATE TABLESPACE

strace 成功:

epoll_pwait(3, [{EPOLLIN, {u32=3479758432, u64=94226472298080}}], 1, -1, NULL, 8) = 1
recvfrom(11, "Q\0\0\0005create tablespace test_inde"..., 8192, 0, NULL, NULL) = 54
lseek(5, 0, SEEK_END)                   = 8192
chmod("/psql/a", 0700)                  = 0
mkdir("/psql/a/PG_9.6_201608131", 0700) = 0
symlink("/psql/a", "pg_tblspc/16454")   = 0

注意:将postgres用户添加到root组没有帮助。

相关内容