Linux
即使由 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。理想情況下,我不想
/
把它放進去,而是把它放在一個單獨的磁碟上,但我什至無法讓這個基本案例工作。我在這裡遺漏了一些明顯的東西嗎?
您啟用了 SELinux,但錯過了它阻止了這一點。
您可以在審核日誌中看到日誌條目
/var/log/audit/audit.log
。解決問題的最簡單方法是使用預設數據目錄位置,
/var/lib/pgsql
並且不要嘗試覆蓋它。相反,將您的儲存安裝在此位置。
我在 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
跟踪確認了一個問題:
[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
組沒有幫助。