我有一台安装了 CentOS 6.3 和 Mysql 的服务器。我创建了两个分区,一个用于系统,较大的一个用于安装在 /data 中的数据。安装 Mysql 后,我创建了目录 /data/mysql,然后以 root 身份更改了此文件夹的 selinux 上下文,chcon -R -t mysqld_db_t /data/mysql
并将 Mysql 配置文件 (my.cnf) 修改为:
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
symbolic-link=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
但现在我无法启动 mysqld 服务!它给我 Can't change dir to /data/mysql (errcode 13)
这是的输出ls -Z /data | grep mysql
:
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
奇怪的是,每次我尝试启动 mysqld 服务时,它都会失败,myslq 目录的上下文变为,system_u:object_r:default_t:s0
并且在其中创建两个目录(mysql 和 test)。
无论如何,如果我禁用 selinux,一切都会顺利进行......
答案1
你需要使用semanage fcontext
为 MySQL 数据库的非标准位置设置默认文件上下文。
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
完成后,使用restorecon
修复任何标记错误的文件/目录:
restorecon -r -v /data/mysql
现在您应该不会再遇到任何 SELinux 问题。
答案2
我有同样的问题,并且已经解决了:
问题在于权限,my.cnf 使用用户 mysql 执行 mysqld [mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
用户=mysql
符号链接=0
然后我将使用的 mysql 文件和引用移到 /var/lib/mysql/ 各处,然后我修改了:
/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# 默认使用旧密码格式,以兼容 mysql 3.x
# 客户端(使用 mysqlclient10 兼容包的客户端)。old_passwords
=1
# 建议禁用符号链接以防止各种安全风险;
# 为此,请取消注释此行:
# symbolic-links=0
[mysqld_safe]
log-error=/var/lib/mysql/mysqld.log
pid-file=/var/lib/mysql/mysqld.pid
/etc/init.d/mysqld
get_mysql_option mysqld datadir "/var/lib/mysql"
datadir="$result"
get_mysql_option mysqld socket "$datadir/mysql.sock"
socketfile="$result"
get_mysql_option mysqld_safe log-error "/var/lib/mysql/mysqld.log"
errlogfile="$result"
get_mysql_option mysqld_safe pid-file "/var/lib/mysql/mysqld.pid"
mypidfile="$result"
.
.
.
fi [ $ret -eq 0 ] && touch /var/lib/mysql/mysqld.lock (这个和另一个对锁文件的引用。)
return $ret
我改了名字mysql锁定文件mysqld.lock在 /etc/init.d/mysqld 中但不是必需的。
最后我改变了 /var/lib/mysql 的所有者 chown mysql:mysql /var/lib/mysql -R
并设置权限:
chmod 755 /var/lib/mysql -R
现在
/etc/init.d/mysqld启动