На RHEL5 у меня есть небольшая база данных MySQL, в которую нужно записывать временные файлы. Чтобы ускорить этот процесс, я хотел бы переместить временный каталог в / dev / shm, поместив следующую строку в my.cnf:
tmpdir=/dev/shm/mysqltmp
Я могу просто создать / dev / shm / mysqltmp и сделать
chown mysql:mysql /dev/shm/mysqltmp
chcon --reference /tmp/ /dev/shm/mysqltmp
Я попытался сделать SELinux счастливым, применив те же настройки, которые действуют для / tmp / (и / var / tmp /), где, предположительно, MySQL записывает свои файлы tmp, если tmpdir не определен.
Проблема в том, что 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?
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) Отключить защиту SELinux для MySQL setsebool -P mysqld_disable_trans=on
Создайте свой собственный tmpfs и пометьте его тем, что вам нужно: http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/ / dev / shm используется glibc для разделяемой памяти POSIX, поэтому я бы посоветовал не использовать его.