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

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

CentOS 7 での /tmp

Linux

CentOS 7 でちょっと作業していた時に、ちょっと躓いたこと。
多分、また躓くだろうから、メモしておきます。


Rails アプリで、 Database の Socket を、 /tmp/mysql.sock にしていたので、
MySQL ... というよりは、 MariaDB ですが、そっちの設定も

# @ /etc/my.conf

[mysqld]
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

[client]
socket=/tmp/mysql.sock

みたいな状態の時、クライアントを起動させようとすると...

$ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

となってしまいます。
この時、 /tmp は、実際に /tmp ではなく、
/tmp/systemd-private-XXXXXX-mariadb.service-XXX/tmp/ にバインドされているため、
他のアプリやプログラムからだと、「 /tmp/mysql.sock がない!」ということになります。

この、 /tmp/systemd-private-XXXX... はなんぞやというと、 RHEL 7 以降にある、
「 PrivateTmp 」という新機能らしいです。

どんな機能かは、だいたい上の通りだけれども、詳しくは、 FedoraWiki を。

Features/ServicesPrivateTmp - FedoraProject

じゃあ、どうすればいいの?というと、 /tmp 以外を指定するか、
PrivateTmp そのものを無効にすればOK。
ただ、後者は他のアプリにも影響が出るので、 /tmp 以外を指定してみる。
ちなみに、 /var/tmp も同様、 PrivateTmp が適用されているので注意。

# @ /etc/my.conf

[mysqld]
datadir=/var/lib/mysql
socket=/var/mysql/mysql.sock


[client]
socket=/var/mysql/mysql.sock
# @ config/database.yml

default: &default
  socket: /var/mysql/mysql.sock

で、再起動

$ sudo systemctl restart mariadb

クライアント起動してみると...

$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.44-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

できました。

ということで、 CentOS 7 で /tmp に Socket をおいている場合はできないよというエントリでした。