読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

MariaDB-10.1.21が起動しない→SELinuxの問題

つい先程、MariaDB-10.1.21にアップデートしたらmysqlが起動しなくなりました。以下のようなエラーになります。

# service mysql start
Starting MySQL.170120 15:39:55
170120 15:39:55 mysqld_safe Logging to '/var/log/mysqld.log'.
170120 15:39:55 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
/usr/bin/mysqld_safe_helper: Can't create/write to file '/var/log/mysqld.log' (Errcode: 13 "Permission denied").       [FAILED]

これはマズい。非常にマズい。

というわけでググってみたら、こういうページがヒットしました。 http://www.rootusers.com/how-to-fix-mariadb-10-0-29-selinux-update-failure/

内容を抜粋すると、

Great, so it’s an SELinux issue.

というわけで、SELinuxの問題のようです。

上記ページではCentOS7で発生したと書いてありますが、僕の手元では一部のCentOS6のみで発生し、CentOS7は問題なく起動しています。

  • 僕の手元のCenOS7ではmysqld_safe_helperを用いた起動ではなかったために、問題が起きないのだと思われます。
  • 同じCentOS6でも、問題が起こる場合と起こらない場合があるようです。どちらもmysqld_safe_helper経由での起動ですが、何が違うのかは不明。

解決方法 → mysqld_safeのSELinuxコンステキストを変更

上記ページによると、解決するには

# ausearch -c 'mysqld_safe_hel' --raw | audit2allow -M my-mysqldsafehel
# semodule -i my-mysqldsafehel.pp

を実行せよとあります。とりあえず実行してみるとこうなりました。

bash: audit2allow: command not found

ナンテコッタイ。というわけで

yum install policycoreutils-python

を実行したのですが、

================================================================
 Package                                   Arch       Version                    
================================================================
Installing:
 policycoreutils-python          x86_64    2.0.83-30.1.el6_8
Installing for dependencies:
 audit-libs-python                  x86_64     2.4.5-3.el6 
 libselinux-python                  x86_64     2.0.94-7.el6
 libsemanage-python            x86_64     2.0.43-5.1.el6
 setools-libs                           x86_64     3.3.7-4.el6           
 setools-libs-python              x86_64     3.3.7-4.el6

Transaction Summary
===============================================================
Install       6 Package(s)

という風にいろいろインストールされてしまうので、なんか嫌な感じ。

余計なものをインストールせずに何とかならんのか。 というわけで、まずは当該ファイルを見てみます。

# cd /usr/bin
# ls -Z mysql*

するとこうなりました。

# ls -Z mysql*
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlaccess
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqladmin
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlbinlog
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlbug
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlcheck
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_config
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_convert_table_format
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqld_multi
-rwxr-xr-x. root root system_u:object_r:mysqld_safe_exec_t:s0 mysqld_safe
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqld_safe_helper
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqldump
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqldumpslow
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_embedded
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_find_rows
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_fix_extensions
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlhotcopy
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlimport
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_install_db
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_plugin
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_secure_installation
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_setpermission
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlshow
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysqlslap
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_tzinfo_to_sql
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_upgrade
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_waitpid
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       mysql_zap

はい、mysqld_safeだけSELinuxのコンテキストが違いますね。 そこで、おもむろに

# chcon system_u:object_r:bin_t:s0 mysqld_safe

とやってみると…

# service mysql start
Starting MySQL.170120 15:54:04 mysqld_safe
170120 15:54:04 mysqld_safe Logging to '/var/log/mysqld.log'.
170120 15:54:04 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql            [  OK  ]

この通り無事に起動したのでした。こやつめ、ハハハ。

まあ15分ほどで解決できたので良しとします。