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

  • 893
    いいね
  • 6
    コメント

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を使うときには、思わぬ落とし穴にハマって泣かないよう
充分に検証しましょう。

この投稿は Speee Advent Calendar 201511日目の記事です。