无法使用 SELinux 启动 Mysql

dgi*_*bbs 4 mysql linux selinux centos

我正在尝试在 CentOS 6 上使用 SELinux 启动 MySQL,但是出现以下错误。

131212 09:08:08 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
131212 09:08:58 mysqld_safe Starting mysqld daemon with databases from /u/mysql
131212  9:08:58 [Warning] Can't create test file /u/mysql/webserver.lower-test
131212  9:08:58 [Warning] Can't create test file /u/mysql/webserver.lower-test
^G/usr/libexec/mysqld: Can't change dir to '/u/mysql/' (Errcode: 13)
131212  9:08:58 [ERROR] Aborting
Run Code Online (Sandbox Code Playgroud)

我们已经在许多其他服务器上设置了 MySQL,但是这里的区别在于 mysql 数据目录与标准 /vat/lib.mysql 位于不同的分区中。相反,它在 /u/mysql 中。

这是/etc/my.cnf

[mysqld]
datadir=/u/mysql
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

max_allowed_packet = 32M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Run Code Online (Sandbox Code Playgroud)

这是mysql目录的权限

drwxr-xr-x. mysql    mysql    system_u:object_r:mysqld_db_t:s0 mysql
Run Code Online (Sandbox Code Playgroud)

这是 /u/mysql 目录中目录之一的权限

drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 databasefolder
Run Code Online (Sandbox Code Playgroud)

有没有人对如何解决这个问题有任何想法?我可以确认关闭 SELinux 可以解决问题,因此它必须是某种 SELinux 权限问题。

谢谢

use*_*517 11

开始的地方是查看您的 /var/log/audit/audit.log 以获取与 mysqld 相关的 AVC 拒绝消息。这些可以传递给audit2why以收集更多信息以帮助您决定要做什么。

您的 mysql 文件位于非标准位置,尽管目录具有正确的上下文,但其中的文件很可能不是。实现此目的的最佳方法是为 /u/mysql 目录添加一个新的 fcontext

semanage fcontext -a -t mysqld_db_t "/u/mysql(/.*)?"
restorecon -rv /u/mysql
Run Code Online (Sandbox Code Playgroud)

semanage的命令配置策略,以便后续的restorecon命令将不会设置上下文回到系统默认值。


dgi*_*bbs -3

我的同事建议这最终解决了问题。

您可以查看人类可读的拒绝原因

audit2why -a
Run Code Online (Sandbox Code Playgroud)

要生成新的策略模块,请使用

audit2allow -a -M <policyname>
Run Code Online (Sandbox Code Playgroud)

如果出现未找到错误

yum install policycoreutils-python pschaff
Run Code Online (Sandbox Code Playgroud)

https://www.centos.org/forums/viewtopic.php?t=8935