即使在 VM 上设置 SELinux 安全上下文后,MySQL 权限被拒绝错误

即使在 VM 上设置 SELinux 安全上下文后,MySQL 权限被拒绝错误

我在 CentOS 上安装了 MySQL(详细版本如下)。我的操作系统是虚拟机而不是物理机,目录/data/mysql是本地磁盘(虚拟)。我怀疑我可能需要在虚拟化环境中执行一些额外的步骤。这链接有一些有关 SELinux 和虚拟化的信息但不知道如何将它包含在 MySQL 中。

MySQL 在数据目录下工作得很好,/var/lib/mysql但是当我将它移动到不同磁盘上的另一个目录时,它就停止工作了。而同一磁盘上的不同目录则有效。如果我禁用 SELinux,MySQL 将使用不同的磁盘。 SELinux 限制不同的驱动器。我尝试了以下两个链接中给出的解决方案

特别是以下两个命令:

$ semanage fcontext --add --type mysqld_db_t '/data/mysql(/.*)?'
$ restorecon -r /data/mysql

当我跑步时:

$ ls -dZ /data/mysql

我得到以下信息:

drwxr-xr-x. mysql mysql unconfined_u:object_r:mysqld_db_t:SystemLow 

我仍然不断得到:

/usr/sbin/mysqld:无法将目录更改为“/data/mysql/”(错误代码:13 - 权限被拒绝)

我还有什么需要做的吗?

  • MySQL:mysql Ver 14.14 Distrib 5.6.14,适用于 Linux (x86_64),使用 EditLine 包装器
  • 操作系统:CentOS 版本 6.4(最终版)

答案1

当 Debian 9 和其他基于 systemd 的发行版上没有 SELinux 和 AppArmor 时,当 MySQL 数据目录移动到 /home 下的任何位置时,可能会出现此问题。

原因是 systemd 服务文件 (/lib/systemd/system/mariadb.service) 包含以下设置: 保护首页=true。此设置将阻止 MySQL 写入 /home 下的任何文件夹,因此它将在启动时抛出 ErrNo 13: Permission Denied 错误。

修复方法是将数据目录移出 /home,或者关闭 systemd 服务文件中的此安全功能:

1:sudo cp /lib/systemd/system/mariadb.service /etc/systemd/system/ # 本地覆盖服务文件

2:编辑/etc/systemd/system/mariadb.service并改变保护家园为假(保护首页=假)。保存文件

3:sudo systemd 守护进程重新加载# 刷新 systemd 服务,以便它看到您的覆盖文件

4:sudo systemctl 启动 mysql# 它终于应该开始了

答案2

我不认为您正在运行的命令或添加/data/mysqlSELinux 的方式有任何直接错误。

为了确保一切正常工作,我会检查是否存在和/或手动将此行添加到/etc/selinux/targeted/contexts/files/file_contexts.local.

/data/mysql(/.*)?   system_u:object_r:mysqld_db_t:s0

当我重复上面的步骤时,我已file_contexts.local按预期将该行添加到我的文件中。

我会根据此 Redhat 特定文档中讨论的步骤仔细检查您所遵循的步骤,标题为:10.4.1。 MySQL 更改数据库位置

答案3

此错误是由于操作系统权限问题造成的。请运行以下命令。

semanage fcontext -a -e /var/lib/mysql /opt/mysql
restorecon -R -v /opt/mysql

相关内容