我一直在尝试在 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
组没有帮助。