CentOS 6.2 修改 /etc/my.cnf 的 datadir 到掛載的共享目錄 /mnt/hgfs/mysql_data,權限 777、擁有者 root,啟動報錯 Errcode: 13 (Permission denied)。真兇是 SELinux 強制訪問控制。
120609 11:35:12 mysqld_safe Starting mysqld daemon with databases from /mnt/hgfs/mysql_data
120609 11:35:13 [Warning] Can't create test file /mnt/hgfs/mysql_data/data.lower-test
/usr/libexec/mysqld: Can't change dir to '/mnt/hgfs/mysql_data/' (Errcode: 13)
120609 11:35:13 [ERROR] Aborting
ls -ld /mnt/hgfs/mysql_data → drwxrwxrwx root root ✅ls -ld /mnt/hgfs → 有 rx ✅mysql 用戶組 ✅ls -Z /mnt/hgfs/mysql_data → 類型可能為 vmware_shared_t 或 nfs_t,**非 mysqld_db_t**,mysqld 進程無權訪問。getenforce # Enforcing
setenforce 0 # 切換 Permissive(僅記錄不阻擋)
getenforce # Permissive
service mysqld start # 成功啟動
vi /etc/selinux/config
# SELINUX=enforcing → SELINUX=disabled
# 重啟 OS 生效
# 1. 安裝策略管理工具
yum install -y policycoreutils-python
# 2. 為新 datadir 打標
semanage fcontext -a -t mysqld_db_t "/mnt/hgfs/mysql_data(/.*)?"
# 3. 恢復上下文
restorecon -Rv /mnt/hgfs/mysql_data
# 4. 驗證
ls -Z /mnt/hgfs/mysql_data
# 應顯示 system_u:object_r:mysqld_db_t:s0
# 5. 重啟 MySQL(Enforcing 模式下)
setenforce 1
service mysqld start # 成功
| 模式 | 命令 | 行為 |
|---|---|---|
| Enforcing | setenforce 1 | 強制阻擋違規訪問,記錄審計日志 |
| Permissive | setenforce 0 | 不阻擋,僅記錄警告(調試用) |
| Disabled | SELINUX=disabled + 重啟 | 完全關閉 SELinux |
datadir 路徑,預先打好 mysqld_db_t 標籤。datadir,避免共享文件系統(VMware hgfs、NFS)引入 SELinux/性能/一致性風險。semanage / restorecon 管理上下文,而非關閉 SELinux。權限 777 ≠ 可訪問。SELinux 是隱形守門人,ls -Z 看上下文,semanage 改標籤,才是正規軍規。