我正在将 CentOS 5.3 系统从 MySQL 迁移到 PostgreSQL。我们机器的设置方式是将最大的磁盘分区挂载到/home
. 这是我无法控制的,由托管服务提供商管理。/home
无论如何,出于这个原因,我们显然希望数据库文件处于打开状态。
使用 MySQL,我们执行了以下操作:
- 编辑
my.cnf
并将datadir
设置更改为/home/mysql
- 添加了一个新的“文件类型”策略记录(我希望我使用正确的术语)设置
/home/mysql(/.*)?
为mysqld_db_t
- 跑来
restorecon -R /home/mysql
分配标签
一切都很好。
然而,使用 PostgreSQL,我做了以下事情:
- 分别将和变量编辑
/etc/init.d/postgresql
和更改为和PGDATA
PGLOG
/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
奇怪的是我在or中没有看到任何与此相关的消息/var/log/secure
,但是如果我关闭 SElinux,那么一切正常。
我确保所有权限都正确(文件为 600,目录为 700)以及所有权(postgres:postgres)。
谁能告诉我我做错了什么?
我正在使用来自commandprompt.com的 Yum 存储库,版本 8.3.7。
编辑: 我的问题特别提到/home
目录的原因是,如果我对任何其他目录(例如/var/lib/pgsql2
or )执行所有这些步骤/usr/local/pgsql
,那么它会按预期工作。
这个线程看起来很相关 - http://archives.postgresql.org/pgsql-admin/2007-11/msg00228.php。
首先检查conf文件上的标签。在 Centos5.3 系统上闲逛,我看到了
政策说
尝试做一个
如果标签不正确,有多种方法可以更改它。一个快速的谷歌给了我http://docs.fedoraproject.org/selinux-user-guide/f10/en-US/sect-Security-Enhanced_Linux-SELinux_Contexts_Labeling_Files-Persistent_Changes_semanage_fcontext.html
管理是一种方式。如果您想尝试进行快速测试,请尝试
还要确保 postgresql 守护进程在正确的域(即 SELinux 上下文)中运行。您可能会很快发现它不是通过拖尾日志,见下文。有关启动 init 脚本以使其位于正确域中的详细信息,请参阅 run_init。posgresql 可能作为 unconfined_t 运行(在这种情况下不应该有问题, unconfined 可以做很多事情)。
SELinux 可能还有其他问题需要进一步分析,请尝试跟踪审核日志。(请注意,在 auditd 启动之前不会写入审计日志,我之前被它所困扰。在这种情况下,请检查 /var/log/messages 以获取预审计日志消息)
试试看 SELinux 可能会抱怨什么
或寻找否认
然后尝试相同的访问,即启动守护进程。
你检查过你的#SESTATUS
[root@yeswedeal ~]# sestatus SELinux 状态:禁用
即使您正确标记了目录,selinux 策略也很有可能禁止 postgresql
/home
访问自身(实际上,@Milen 的答案中提到的链接似乎暗示了这一点)。