Я пытался создать табличное пространство в 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
группа не помогла.