Skip to content

Commit 0bff6cb

Browse files
committed
发布博客,时间:2026/07/08 10:18:25
1 parent 3a6b6c4 commit 0bff6cb

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

docs/Linux系统/SELinux.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# SELinux
2+
> qwen生成
3+
4+
## SELinux 是什么?
5+
6+
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 服务。
29+
30+
💡 最佳实践建议:
31+
由于 /home 目录容易受到系统清理策略或用户权限变更的影响,强烈不建议将 MySQL 的临时目录放在 /home 下。更稳妥的做法是将其设置在独立的数据盘或 /data 目录下(例如 /data/mysqltmp),这样不仅能避开 SELinux 和 systemd 针对用户主目录的严格限制,还能避免与系统盘产生 I/O 竞争。
32+
33+
需要我帮你整理一份完整的排查步骤吗?包括先确认当前 SELinux 状态、检查报错信息,再按顺序执行修复操作。

0 commit comments

Comments
 (0)