Help us understand the problem. What is going on with this article?

お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ

More than 3 years have passed since last update.

CentOSの6から7への移行時、何度かつまづいた箇所があったので紹介します。

前提知識

6と7のミドルウェアの違いやSystemdの基本的な使い方はこのあたりを参考にしてください。

落とし穴1: 消える/tmp

CentOS7にtmpwatchは入っていません。
だからといって何も考えずに/tmp下にキャッシュ等の一時ファイルを吐き出していると、
いつの間にか消去されていて泣くハメになります。

CentOS7にはtmpwatchはありませんが、その代わり
systemdの systemd-tmpfiles-clean.timer がその役割を担っています。
このサービスはtmpwatchと同じように、/tmp下に使われていないファイルを一定期間経つと削除します。

消されたくないファイルがあるのなら/etc/tmpfiles.d/に設定ファイルを配置しましょう。

$ cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
$ vi /etc/tmpfiles.d/tmp.conf

除外設定を追記

/etc/tmpfiles.d/tmp.conf
~~
x /tmp/cache*

落とし穴2: アクセス出来ない/tmp

使っているFWによっては、セッションファイルを/tmpに吐き出すこともあるでしょう。
もちろん/tmp/hoge_app/sessionディレクトリを作ってそこに吐き出します。
_人人人人人人人人人人人人人人人人人人_
> 対象のディレクトリが存在しません <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

SystemdのServiceにはPrivateTmpというオプションがあります。
そのService専用の/tmpと/var/tmpの領域を用意する機能です。
デフォルトで有効になっています。

/tmp/hoge_app/sessionディレクトリはService専用の/tmpには存在しません。

PrivateTmpを無効にするには、Serviceの設定を変更する必要があります。
例えばphp-fpmの設定ファイルは/usr/lib/systemd/system/php-fpm.serviceです。
このファイルを/etc/systemd/system/下にコピーし、それを修正します。

$ cp /usr/lib/systemd/system/php-fpm.service /etc/systemd/system/
$ vi /etc/systemd/system/php-fpm.service

以下のように修正

/etc/systemd/system/php-fpm.service
# PrivateTmp=true
PrivateTmp=false

Service設定ファイルの修正後は以下のコマンドで設定をリロードします。

$ systemctl daemon-reload

落とし穴3: 消える /var/run

CentOS7では、/runディレクトリがtmpfsファイルシステムでマウントされています。
つまり、 OSを再起動すると/run (=/var/run)に置かれたファイルは全て削除されてしまいます。

/var/run/hoge_app/hoge_app.pidのように
/var/runにアプリごとのディレクトリを掘ってpidを配置していたりすると、
再起動時に作ったディレクトリが消えてしまっているので起動に失敗したりします。

対応として、/etc/tmpfiles.dに設定ファイルを作り、
OS起動時に作っておきたいディレクトリを指定する必要があります。

$ vi /etc/tmpfiles.d/hoge.conf

以下のように記述します。

/etc/tmpfiles.d/hoge.conf
 d /var/run/hoge_app 0755 hoge hoge

落とし穴4: 消えるシステムログ

CentOS7では、システムログはjournaldで管理されています。
参考: CentOS 7のログ管理「journald」

デフォルトのログファイル置き場は/run/log/journalです。

先ほど書いたように、CentOS7では/runはOS再起動すると消えます。
つまり、 障害発生時に一番見たいシステムログが、再起動すると消えているわけです。
(2016/1/4追記: 消えません。詳細は後述)
悲しい。

それを防ぐために、journaldの設定で
ログの配置場所を/var/log/journalに変更します。

$ vi /etc/systemd/journald.conf

以下のように変更します。

/etc/systemd/journald.conf
[Journal]
# Storage=auto
Storage=persistent

2016/1/4追記

システムログはjournald経由でrsyslogにも送られるため、
再起動によってjournaldのログが消えても、rsyslogで管理されているシステムログは消えません。

上記の現象は、仮想環境上のCentOS7で発生する
rsyslogの不具合が原因のようです。
参考: rsyslogが出力してくれなかった話(CentOS 7)

おわりに

新しいOSを使うときには、思わぬ落とし穴にハマって泣かないよう
充分に検証しましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした