我已将 /var/lib/mysql 目录移至 nfs 共享,更新了所有配置文件并在适当位置创建了符号链接。当我关闭 selinux 时,此方法有效,但当开启 selinux 时,mysqld 无法启动。我在 Google 上搜索解决方案,但未找到任何有效的方法。我怀疑我遗漏了一些简单的东西。
以下是我尝试过的:
yum install policycoreutils-python
semanage fcontext -a -t mysqld_db_t "/nfs/data0/mysql(/.*)?"
restorecon -Rv /nfs/data0/mysql
我怀疑我可能在这里使用了错误的上下文,但不确定正确的上下文是什么。有什么建议吗?
更新:
按照建议查看 /var/log/audit/audit.log 后,我发现以下错误:
type=AVC msg=audit(1398346018.436:3455): avc: denied { write } for pid=10980
comm="httpd" name="mysql.sock" dev=0:13 ino=18438
scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:nfs_t:s0
tclass=sock_file
type=AVC msg=audit(1398346018.439:3456): avc: denied { search } for pid=12395
comm="mysqld" name="mysql" dev=0:13 ino=14805
scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:nfs_t:s0
tclass=dir
type=AVC msg=audit(1398346019.657:3457): avc: denied { open } for pid=12395
comm="mysqld" name="cache_admin_menu.frm" dev=0:13 ino=23322
scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:nfs_t:s0
tclass=file
不确定我需要做什么来解决这个问题。我已启用以下 sebools:
mysql_connect_any
httpd_can_network_connect_db
httpd_can_network_connect
httpd_can_network_memcache
httpd_can_sendmail
httpd_use_nfs
httpd_builtin_scripting
谢谢。
答案1
这个问题有点老了,但没有看到正确答案。
因此,我在使用 centos AMI 运行 mysql 时遇到了 AWS 和 EFS 的这个问题。
这里出现了两个问题。常规 mysql 文件的权限以及 mysql 套接字及其锁定文件的权限。
看起来,mysql 套接字是在 mysqld_var_run_t 上下文中创建的,而锁文件是在 mysqld_db_t 上下文中创建的,常规 mysql 文件也是如此。
现在,NFS 挂载通常会被赋予 nsf_t 上下文。
看来 nfs 挂载在挂载时只能具有 on se 上下文。因此,当通过 nfs 挂载时,我必须执行以下操作:
- 使用 mysqld_db_t 上下文挂载 NFS 共享。
- 将 mysql 套接字移动到具有 mysqld_db_t 上下文的不同目录。
因此在 fstab 中挂载看起来像这样:
nfs-share-url:/ /data nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noatime,context="system_u:object_r:mysqld_db_t:s0" 0 0
my.cnf 如下所示:
datadir=/data
socket=/var/lib/mysql-files/mysql.sock
因此所有文件的权限都是正确的,并且 mysql 现在将数据存储在 EFS NFS 共享上。
答案2
我会让 auditd 启动一个新的日志文件 ( kill -USR1 pidofauditd
),然后让 SELinux 处于 Permissive 模式 ( setenforce 0
),然后执行您通常执行的操作。这将生成合适的审计消息。然后
cat audit.log | audit2allow -M myLocalPolicy
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i MyLocalPolicy.pp
检查 MyLocalPolicy.te 文件以查看该策略正在执行的操作,如果您愿意,请使用提供的 semodule 命令进行安装。
答案3
“打开”错误表示可能找不到“mysql.sock”。您是否尝试过将名称调整为系统上的完整路径?
仅供参考 - 我只是建议,因为我在谷歌搜索类似的错误时发现了你的问题,即 httpd 但在 name='/tmp/mysql.sock' 上“写入”,而我已经在 MySQL 的 my.cnf 和 php.ini 中的“socket”下定义了它。