😎

【Linux】/var/tmpがなぜ自動的に消えるのか調べる

に公開

はじめに

Linuxを再起動すると/var/tmp内のファイルは自動的に消えてしまうというとよく耳にします。どういう仕組みで自動的に削除されるのか気になったので、調べてみました。

1.systemd-tmpfilesについて

/var/tmpが削除される根拠を調べていると、「systemd-tmpfiles」によって削除サイクルが管理されているという情報にたどり着きました。

systemd-tmpfilesとは

Linuxにおける一時ファイルやディレクトリの作成、削除、パーティション設定を管理するsystemdのコンポーネント(ツール)であり、OS再起動後に必要なディレクトリやファイルの再作成、および不要な一時ファイルのクリーンアップを自動的に行う機能を提供します。
つまり、「設定に従ってファイルの作成や削除を行うプログラム」というものになります。

2.systemd-tmpfilesの見方

以下のコマンドで設定内容を確認できます。

systemd-tmpfiles --cat-config

出力内容の基本的な形式は以下の通りです。
type path partmition user group age

【typeについての補足】

タイプ 説明
d ディレクトリを作成
f 空のファイルを作成
L シンボリックリンクを作成
r ファイル/ディレクトリ/リンクを削除
R パターンに一致する対象を削除
x パス以下の内容を削除
X パス以下の内容を再起的に削除
z 所有者とモードを再設定
C キャラクタデバイスの作成
b ブロックデバイスの作成
q ディスク使用量を制限
※r!やR!の「!」は強制削除の意味

実際に表示してみます。

root@fedora:~# systemd-tmpfiles --cat-config | grep ^d
d /run/sshd 0755
d     /var/tmp/abrt         0755 abrt abrt
d     /run/abrt             0755 root root
d     /var/cache/abrt-di    0775 abrt abrt
d /var/log/audit 0700 root root - -
d /etc/credstore 0700 root root
d /etc/credstore.encrypted 0700 root root
d /run/cryptsetup 0700 root root -
d /run/httpd   710 root apache
d /run/httpd/htcacheclean   700 apache apache
d /run/lock/iscsi 0700 root root -
d /run/lock 0755 root root -
d /run/lock/subsys 0755 root root -
d /run/setrans 0755 root root
d /run/lock/lvm 0700 root root -
d /run/lvm 0700 root root -
d /var/cache/man 0755 root root a:1w
d /run/mdadm 0710 root root -
d /run/multipath 0700 root root -
d /run/mysqld 0755 mysql mysql -
d /run/console 0755 root root -
d /run/faillock 0755 root root -
d /run/sepermit 0755 root root -
d /etc/polkit-1/rules.d 0750 root polkitd - -
d- /root :0700 root :root -
d- /root/.ssh :0700 root :root -
d /run/samba  755 root root
d /run/setroubleshoot 711 setroubleshoot setroubleshoot -
d /var/lib/setroubleshoot 700 setroubleshoot setroubleshoot -
d /run/motd.d 0755 root root -
d /run/sssd 775 sssd sssd -
d /dev/net 0755 - - -
d /dev/vfio 0755 - - -
d /dev/snd 0755 - - -
d /dev/snd 0755 - - -
d /run/sudo 0711 root root
d /var/lib/systemd/pstore 0755 root root 14d
d /run/user 0755 root root -
d /run/systemd/ask-password 0755 root root -
d$ /run/systemd/seats 0755 root root -
d$ /run/systemd/sessions 0755 root root -
d$ /run/systemd/users 0755 root root -
d /run/systemd/machines 0755 root root -
d$ /run/systemd/shutdown 0755 root root -
d /run/log 0755 root root -
d /var/lib/systemd 0755 root root -
d /var/lib/systemd/coredump 0755 root root 2w
d /var/lib/systemd/ephemeral-trees 0755 root root 0
d /var/lib/private 0700 root root -
d /var/log/private 0700 root root -
d /var/cache/private 0700 root root -
d       /var/lib/tpm2-tss/system/keystore   2775 tss  tss   -           -
d       /run/tpm2-tss/eventlog                2775 tss  tss   -           -
d /run/media 0755 root root
d     /var/lib/lockdown 2775 usbmuxd usbmuxd -    -
d /var/log 0755 - - -
d /var/cache 0755 - - -
d /var/lib 0755 - - -
d /var/spool 0755 - - -

出力結果の中から以下の行を紐解いてみます。

d /var/lib/systemd/pstore 0755 root root 14d
  • /var/lib/systemd/pstoreがない場合は作成する
  • /var/lib/systemd/pstoreのパーミッションは0755
  • /var/lib/systemd/pstoreの所有者はroot
  • /var/lib/systemd/pstoreの所有グループはroot
  • /var/lib/systemd/pstore以下のファイルは14日間アクセスがなければ削除
    という意味のようです。

3./var/tmpについて

systemd-tmpfilesの中から/var/tmpを調べてみます。

root@fedora:~# systemd-tmpfiles --cat-config | grep /var/tmp
d     /var/tmp/abrt         0755 abrt abrt
x     /var/tmp/abrt/*
R /var/tmp/dnf*/locks/*
x /var/tmp/sos*
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
R! /var/tmp/systemd-private-*
q /var/tmp 1777 root root 30d

この中から

q /var/tmp 1777 root root 30d

を調べてみます。

  • /var/tmpのディスクの使用量を制限
  • /var/tmpのパーミッションは1777
  • /var/tmpの所有者はroot
  • /var/tmpの所有グループはroot
  • 30日間アクセスがあるかないか判別するだけ(qタイプでは無視される)

まとめると、これはqタイプ、すなわちプロジェクトクォータが適用されていてdタイプではない為、ディレクトリの作成やファイルの自動削除(クリーンアップ)は行われません。また、30dと書かれていますが、qタイプにおけるageフィールド無視される為、30日間アクセスしなかったファイルを削除する機能は働きません。

さいごに

Linuxでは/var/tmp以下のファイルが「自動的に消える」というイメージを持たれがちですが、厳密にはsystemd-tmpfilesによって、ファイルやディレクトリの削除サイクルが設定されており、それに基づいて削除が行われている、というのが正しい理解のようです。

また、systemd-tmpfilesは、あくまで一時ファイルの設定と管理ルールを定義する為のプログラムです。その設定に基づいて実際に古いファイルを自動的に削除する処理は、systemdのタイマーであるsystemd-tmpfiles-clean.timerによって定期的に実行されます。

(補足事項)

manコマンドの抜粋

root@fedora:~# man tmpfiles.d
   Type
       The type consists of a single letter and optionally one or more modifier characters: a plus sign ("+"), exclamation mark ("!"), minus sign ("-"), equals sign ("="), tilde character ("~") and/or caret ("^").

       The following line types are understood:

       d
           Create a directory. The mode and ownership will be adjusted if specified. Contents of this directory are subject to time-based cleanup if the age argument is specified.

       q
           Create a subvolume or directory the same as v, but assign the subvolume to the same higher-level quota groups as the parent. This ensures that higher-level limits and accounting applied to the parent subvolume
           also include the specified subvolume. On non-btrfs file systems, this line type is identical to d.

           If the subvolume already exists, no change to the quota hierarchy is made, regardless of whether the subvolume is already attached to a quota group or not. Also see Q below. See btrfs-qgroup(8) for details
           about the btrfs quota group concept.

           Added in version 228.

上記マニュアルの記述に基づき、当記事では「qタイプでは自動削除は行われない」という結論としました。
一方で、qタイプでも自動削除が行われるという情報もネット上では散見される為、もしこの点について公式な根拠や詳しい情報をご存知の方がいれば、ぜひコメントでご教示いただけると幸いです。

Discussion