使用SELinux在/ dev / shm上运行MySQL tmpdir

在RHEL5上,我有一个小型的MySQL数据库,它必须写入临时文件。 为了加速这个过程,我想通过把下面一行放到my.cnf中来把临时目录移动到/ dev / shm:

tmpdir=/dev/shm/mysqltmp 

我可以创build/ dev / shm / mysqltmp就好了

 chown mysql:mysql /dev/shm/mysqltmp chcon --reference /tmp/ /dev/shm/mysqltmp 

我已经尝试通过应用与/ tmp /(和/ var / tmp /)相同的设置来使SELinux高兴,这大概是在tmpdir未定义的情况下,MySQL正在写入其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以前使用的那样?

closuresSELinux,我该如何做这个工作? 我需要编辑SELinux策略文件吗?

 SELinux is preventing mysqld (mysqld_t) "getattr" to /dev/shm (tmpfs_t). 

这意味着,SELinux拒绝访问/dev/shm目录,它是/dev/shm/mysqltmp的父/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/shmtypes标签从tmpfs_ttmp_t

2)在permissive模式下运行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

制作你自己的tmpfs,并用你需要的标签来标记它: http : //www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/ / dev / shm被glibc用于POSIX共享内存,所以我会build议不要使用它。