/tmp と /var/tmp が消える理由
Linuxの一時ディレクトリには主に /tmp と /var/tmp の2種類があります。どちらも意図せず内容が消えることがあり、その原因は少し異なります。
/tmp は多くのディストリビューションで tmpfs(メモリ上のファイルシステム)としてマウントされています。tmpfsはシステムの再起動と同時に内容が失われます。ディスク上に存在する場合でも、systemd-tmpfiles による定期クリーニングの対象です。
/var/tmp は再起動をまたいでデータが残りますが、30日以上アクセスのないファイルは自動削除されます。この挙動を担うのが systemd の tmpfiles.d という設定機構です。
/tmp が tmpfs かどうかは次のコマンドで確認できます。
findmnt /tmp
出力の FSTYPE 列が tmpfs であれば、再起動のたびに内容が消えます。
クリーニングがいつ実行されるかを確認する
systemd は systemd-tmpfiles-clean.timer というタイマーを使って定期的にクリーニングを実行します。次のコマンドで次回実行時刻を確認できます。
systemctl list-timers systemd-tmpfiles-clean.timer
デフォルトでは起動から15分後と、その後は1日1回の頻度で実行されます。クリーニングのルールは /usr/lib/tmpfiles.d/tmp.conf に記述されています。
cat /usr/lib/tmpfiles.d/tmp.conf
d 行の末尾に書かれた値(10d や 30d など)がクリーニングまでの保持期間です。- は「期間による削除なし」を意味します。
ファイルを残したいときの置き場所の選び方
一時ディレクトリ以外にファイルを置く場所として、用途に応じて次の選択肢があります。
- ホームディレクトリ(
~/):ユーザーが作業中に使うファイルの保管場所として最もシンプルです。自動削除されません。 /var/tmp:再起動をまたいで数日〜数週間残したい場合に適しています。ただし30日が保持の目安です。/optや/srv:アプリケーションデータや配信コンテンツなど、明示的に管理したいファイルに向いています。自動クリーニングの対象外です。
「とりあえず一時置き場」として /tmp を使う運用は、再起動や定期クリーニングでデータが消えるリスクがあります。数時間以上手元に置きたいファイルは、最初から別のディレクトリを使うことを検討してください。
特定のパスをクリーニング対象から除外する設定
どうしても /var/tmp の中の特定のパスを消されたくない場合は、tmpfiles.d の設定で除外できます。
除外設定は /etc/tmpfiles.d/ 以下に新しいファイルを作って記述します。/usr/lib/tmpfiles.d/ を直接編集するとパッケージのアップデートで上書きされるため、カスタマイズは必ず /etc/tmpfiles.d/ 以下で行います。
sudo nano /etc/tmpfiles.d/keep-myfiles.conf
x タイプを使うと、そのパス以下を再帰的にクリーニング対象から除外できます。
# /var/tmp/myproject 以下をクリーニング対象から除外する
x /var/tmp/myproject
設定が正しく読み込まれているかは次のコマンドで確認できます。systemd-analyze cat-config は有効な設定ファイルの内容を優先順位込みで表示します。
systemd-analyze cat-config tmpfiles.d/keep-myfiles.conf
出力に記述した x 行が含まれていれば、次回タイマー実行から除外設定が適用されます。
/var/tmp の保持期間を変更する
30日という保持期間そのものを変更したい場合は、元の設定ファイルと同名のファイルを /etc/tmpfiles.d/ に作ることで上書きできます。まず元ファイルの名前を確認します。
grep -r '/var/tmp' /usr/lib/tmpfiles.d/
多くの環境では tmp.conf が該当します。同名ファイルを /etc/tmpfiles.d/ に作成し、保持期間を書き換えます。たとえば90日に延ばす場合は次のように記述します。
# /etc/tmpfiles.d/tmp.conf
d /tmp 1777 root root -
d /var/tmp 1777 root root 90d
末尾の値を - にすると期間による自動削除を無効にできますが、その場合は /var/tmp が際限なく肥大化する可能性があります。定期的な手動整理とセットで運用してください。
よくあるつまずき
「除外設定を書いたのに再起動後に消えた」という場合、/tmp が tmpfs であることが原因のケースがほとんどです。tmpfiles.d の x 設定はクリーニング処理からの除外であり、tmpfs のアンマウント(再起動)による消去には効きません。tmpfs が原因であれば、/var/tmp への移動が根本的な解決策です。
「保持期間の計算に使われるタイムスタンプ」については一般的に注意が必要です。systemd-tmpfiles はファイルの atime(最終アクセス時刻) を参照します。ファイルシステムのマウントオプションに noatime を指定している環境では atime が更新されないため、期待通りの保持期間にならないことがあります。/etc/fstab のマウントオプションも合わせて確認してください。
「/etc/tmpfiles.d/ に追加したファイルが効かない」という場合は、設定ファイルの記述形式のミスが考えられます。systemd-tmpfiles --create /etc/tmpfiles.d/keep-myfiles.conf を実行するとその場でパースエラーが表示されるため、構文確認に使えます。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
