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ファイルを書き込んでいる場所と思われます。
問題は、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
の親である/dev/shm/mysqltmp
dirへのアクセスを拒否することを意味します。
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
独自のtmpfsを作成し、必要なラベルを付けます。 http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/ /dev/shmはglibcによってPOSIX共有メモリに使用されるため、使用しないことをお勧めします。