You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SELinux(Security-Enhanced Linux)是由美国国家安全局(NSA)开发的一种 Linux 内核安全模块,它提供了一种强制访问控制(MAC, Mandatory Access Control)机制。
7
+
8
+
与传统的根据文件所有者和权限(rwx)来决定访问的自主访问控制(DAC)不同,SELinux 为系统中的每一个进程(主体)和文件/目录(客体)都分配了特定的“安全上下文(标签)”。当进程尝试访问某个资源时,SELinux 会检查该进程的安全上下文是否符合系统预定义的安全策略。如果不符合,即使传统的 Linux 权限允许,访问也会被强制拒绝。这种机制能有效限制进程权限,防止被攻破的进程对系统造成大面积破坏。
9
+
10
+
## 为什么 MySQL 临时目录切换到 /home/temp-dir 会阻止启动?
11
+
12
+
将 MySQL 的临时目录(tmpdir)切换到 /home/temp-dir 导致启动失败,通常是由以下两个核心原因导致的:
13
+
14
+
1. SELinux 安全策略拦截
15
+
SELinux 对系统目录有严格的类型标签划分。/home 目录下的文件通常被标记为普通用户文件类型,而 MySQL 进程(mysqld)在 SELinux 策略中只被允许访问带有特定标签(如 mysqld_tmp_t)的目录。当 MySQL 尝试在 /home/temp-dir 下创建或写入临时文件时,SELinux 发现该目录的上下文标签与 MySQL 进程的安全策略不匹配,从而强制拒绝了访问请求,导致 MySQL 因权限不足(如报错 Errcode: 13 - Permission denied)而无法启动。
16
+
17
+
2. Systemd 的安全保护机制(ProtectHome)
18
+
除了 SELinux,现代基于 systemd 的 Linux 发行版(如 CentOS 7/8、Debian 9+)还会在 MySQL 或 MariaDB 的 systemd 服务文件中默认开启 ProtectHome=true 选项。这个安全特性会阻止 MySQL 服务进程读取或写入 /home、/root 等用户主目录下的任何文件夹。因此,即使 SELinux 没有拦截,systemd 也会抛出权限错误阻止 MySQL 启动。
19
+
20
+
如何解决该问题?
21
+
22
+
如果你确实需要将 MySQL 的临时目录设置在 /home/temp-dir,需要进行以下配置:
23
+
24
+
处理 SELinux 标签: 为新目录赋予正确的 SELinux 上下文,并使其生效:
25
+
semanage fcontext -a -t mysqld_tmp_t "/home/temp-dir(/.*)?"
26
+
restorecon -Rv /home/temp-dir
27
+
28
+
修改 Systemd 配置: 覆盖默认的 MySQL 服务文件,将 ProtectHome=true 修改为 ProtectHome=false,然后重载 systemd 并重启 MySQL 服务。
0 commit comments