在 RHEL5 上,我有一个小型 MySQL 数据库,它必须写入临时文件。为了加快此过程,我想通过将以下行放入 my.cnf 中将临时目录移动到 /dev/shm:
tmpdir=/dev/shm/mysqltmp
我可以很好地创建 /dev/shm/mysqltmp 并执行
chown mysql:mysql /dev/shm/mysqltmp
chcon --reference /tmp/ /dev/shm/mysqltmp
我尝试通过应用与 /tmp/ (和 /var/tmp/)相同的设置来使 SELinux 正常运行,如果 tmpdir 未定义,MySQL 大概会将其 tmp 文件写入 /tmp/ (和 /var/tmp/)。
问题是 SELinux 抱怨 MySQL 有权访问该目录。我在 /var/log/messages 中收到以下内容:
SELinux is preventing mysqld (mysqld_t) "getattr" to /dev/shm (tmpfs_t).
SELinux 是个难缠的情妇。详情:
Source Context root:system_r:mysqld_t
Target Context system_u:object_r:tmpfs_t
Target Objects /dev/shm [ dir ]
Source mysqld
Source Path /usr/libexec/mysqld
Port <Unknown>
Host db.example.com
Source RPM Packages mysql-server-5.0.77-3.el5
Target RPM Packages
Policy RPM selinux-policy-2.4.6-255.el5_4.1
Selinux Enabled True
Policy Type targeted
MLS Enabled True
Enforcing Mode Enforcing
Plugin Name catchall_file
Host Name db.example.com
Platform Linux db.example.com 2.6.18-164.2.1.el5 #1 SMP
Mon Sep 21 04:37:42 EDT 2009 x86_64 x86_64
Alert Count 46
First Seen Wed Nov 4 14:23:48 2009
Last Seen Thu Nov 5 09:46:00 2009
Local ID e746d880-18f6-43c1-b522-a8c0508a1775
ls -lZ /dev/shm 显示
drwxrwxr-x mysql mysql system_u:object_r:tmp_t mysqltmp
/dev/shm 本身的权限是
drwxrwxrwt root root system_u:object_r:tmpfs_t shm
我也尝试过
chcon -R -t mysqld_t /dev/shm/mysqltmp
并将 /dev/shm 上的组设置为 mysql,结果并没有好转。难道不应该告诉 SELinux,这是一个临时目录,就像 MySQL 以前使用的一样吗?
除了关闭 SELinux,我该如何实现此功能?我需要编辑 SELinux 策略文件吗?
答案1
SELinux is preventing mysqld (mysqld_t) "getattr" to /dev/shm (tmpfs_t).
这意味着 SELinux 拒绝访问/dev/shm
dir(它是 的父级)/dev/shm/mysqltmp
。
ls -lZd /tmp/
drwxrwxrwt 3 system_u:object_r:tmp_t:s0
ls -lZd /dev/shm
drwxrwxrwt root root system_u:object_r:tmpfs_t:s0
您有 3 个选择:
1) 将/dev/shm
类型标签从更改tmpfs_t
为tmp_t
2)以宽容模式运行 SELinux,并收集所有拒绝/var/log/audit/audit.log
tail -n 0 -f /var/log/audit/audit.log | audit2allow -m myMySQL -o myMySQL.te
checkmodule -M -m myMySQL.te -o myMySQL.mod
semodule_package -m myMySQL.mod -o myMySQL.pp
您应该检查 myMySQL.te 是否仅包含必要的允许。最后,您将模块加载到内核中semodule -i myMySQL.pp
3)禁用 MySQL 的 SELinux 保护setsebool -P mysqld_disable_trans=on
答案2
制作您自己的 tmpfs 并贴上您需要的任何标签: http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/ /dev/shm 被 glibc 用于 POSIX 共享内存,因此我建议不要使用它。