我正在将一个CentOS 5.3系统从MySQL迁移到PostgreSQL。 我们机器的设置方式是将最大的磁盘分区挂载到/home 。 这是我的控制权,由托pipe服务提供商pipe理。 无论如何,我们显然希望数据库文件在/home的原因。
使用MySQL,我们做了以下工作:
my.cnf并将datadir设置更改为/home/mysql /home/mysql(/.*)? 到mysqld_db_t restorecon -R /home/mysql来分配标签 一切都很好
但是,对于PostgreSQL,我做了以下工作:
/etc/init.d/postgresql并将PGDATA和PGLOGvariables分别更改为/home/pgsql/data和/home/pgsql/pgstartup.log /home/pgsql/pgstartup.log设置为postgresql_log_t /home/pgsql/data(/.*)? 到postgresql_db_t restorecon -R /home/pgsql来分配标签 在这一点上,我仍然无法启动PostgreSQL。 pgstartup.log说:
# cat pgstartup.log postmaster cannot access the server configuration file "/home/pgsql/data/postgresql.conf": Permission denied
奇怪的是,在/var/log/messages或/var/log/secure中我没有看到与此有关的任何消息, 但是如果我closures了SElinux,那么一切正常。
我确保所有的权限都是正确的(文件为600,目录为700)以及所有权(postgres:postgres)。
谁能告诉我我做错了什么?
我从版本8.3.7的commandprompt.com使用Yum版本库。
编辑:我的问题明确提到/home目录的原因是,如果我通过所有这些步骤的任何其他目录,例如/var/lib/pgsql2或/usr/local/pgsql ,然后按预期工作。
首先检查conf文件上的标签。 在我看到的Centos5.3系统上徘徊
semanage fcontext -l | grep "postgresql_etc_t" /etc/postgresql(/.*)? all files system_u:object_r:postgresql_etc_t:s0
和政策说
sesearch -A -s postgresql_t -t postgresql_etc_t Found 3 av rules: allow postgresql_t postgresql_etc_t : file { ioctl read getattr lock }; allow postgresql_t postgresql_etc_t : dir { ioctl read getattr lock search }; allow postgresql_t postgresql_etc_t : lnk_file { read getattr };
尝试做一个
ls -Z /home/pgsql/data/postgresql.conf
如果标签不正确,有多种方法可以改变它。 快速谷歌给了我http://docs.fedoraproject.org/selinux-user-guide/f10/en-US/sect-Security-Enhanced_Linux-SELinux_Contexts_Labeling_Files-Persistent_Changes_semanage_fcontext.html
semanage是一种方式。 如果你想尝试做一个快速的testing尝试
chcon -t postgresql_etc_t /home/pgsql/data/postgresql.conf
还要确保postgresql守护进程运行在正确的域(即SELinux上下文)。 您可能会很快发现它不是通过拖拽日志,请参阅下文。 有关启动init脚本的详细信息,请参阅run_init以使其位于正确的域中。 posgresql可能会作为unconfined_t运行(在这种情况下应该没有问题,无限制可以做很多事情)。
SELinux可能还有其他问题需要进一步分析,请尝试拖尾审核日志。 (请注意,审计日志不会被写入,直到auditd启动,我已经被之前咬过,在这种情况下,检查预先审计日志消息的/ var / log / messages)
试试看看SELinux可能会抱怨什么
tail -f /var/log/audit/audit.log
或者只是为了拒绝
tail -f /var/log/audit/audit.log | grep denied
然后尝试相同的访问,即启动deamon。
你是否检查过你的#SESTATUS
[root @ yeswedeal〜]#sestatus SELinux status:disabled
即使你正确地标记了目录,selinux策略很可能禁止postgresql从/home本身访问(@ Milen的答案中提到的链接,实际上似乎暗示了这一点)。