本記事では、Red Hat Enterprise Linux(RHEL)9における /tmp および /var/tmp の役割と、これらのディレクトリに保存されたファイルが削除されるタイミングについて解説します。
/tmpと/var/tmpの用途
tmpは"temporary"の略です。手元の英和辞典によると「つかの間の、一時の、仮の」を意味する形容詞とあります。
その名の通り一時的にファイルを保管するために用意されているディレクトリのため、恒久的にデータやプログラムを保存する用途には向いていません。これらのディレクトリに保存されたデータは一定期間経過後に削除される設定になっています。
その削除設定と設定変更は以下のとおりです。
削除設定
/tmpや/var/tmpのファイルを削除する処理はsystemd-tmpfiles-clean.service によって行われます。
その処理内容は/usr/lib/tmpfiles.d/tmp.confで設定されています。
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
q /tmp 1777 root root 10d
q /var/tmp 1777 root root 30d
ディレクトリ毎に1行の設定となっています。各項目の意味は以下の通りです。
- Type : Path が存在しない場合ディレクトリを作成します。
- Path : ディレクトリのパスを指定します。
- Mode : ディレクトリのパーミッションを指定します。
- User : ディレクトリのユーザを指定します。
- Group : ディレクトリのグループを指定します。
- Age : 指定した期間以上経過したファイルを削除します。
デフォルトでは/tmpは10日、/var/tmpは30日で削除する設定となっています。
※ その他の設定の詳細はtmpfiles.d(5)などを参照してください)
設定変更
削除するタイミングを変更したい場合は、/usr/lib/tmpfiles.d/tmp.confを編集するのではなく、/etc/tmpfiles.d/tmp.confを作成して編集します。
/usr/lib/tmpfiles.d/tmp.confを/etc/tmpfiles.d/にコピーして、修正してください。
# cp -p /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
/usr/lib/tmpfiles.d/tmp.confと/etc/tmpfiles.d/tmp.confの両方が存在する場合、設定は/etc/tmpfiles.d/tmp.confが優先されます。
/usr/lib/tmpfiles.d/tmp.confを直接編集しない理由ですが、/usr/lib/tmpfiles.d/tmp.confはsystemdのパッケージをアップデートした際に更新される可能性があるためです。
パッケージのアップデートに伴い/usr/lib/tmpfiles.d/tmp.confが更新された場合、追加した設定が消えてしまう可能性がありますので、/etc/tmpfiles.d/tmp.confをコピーして修正する必要があります。
設定確認
現在の設定を、以下のコマンドにより確認することが可能です。
# systemd-tmpfiles --cat-config
# /usr/lib/tmpfiles.d/cryptsetup.conf
d /run/cryptsetup 0700 root root -
# /usr/lib/tmpfiles.d/dnf.conf
# Unlink the dnf lock files during boot
R /var/tmp/dnf*/locks/*
r /var/cache/dnf/download_lock.pid
r /var/cache/dnf/metadata_lock.pid
r /var/lib/dnf/rpmdb_lock.pid
r /var/log/log_lock.pid
(後略)
/tmpと/var/tmpの違い
どちらも同じような用途に思えますが、FHS(Filesystem Hierarchy Strandard)によると、/tmpと/var/tmpのファイルやディレクトリの削除について以下の通り定義されています。
/tmp
Although data stored in /tmp may be deleted in a site-specific manner, it is recommended that files and directories located in /tmp be deleted whenever the system is booted.
再起動時に削除することが推奨されています。
/var/tmp
Files and directories located in /var/tmp must not be deleted when the system is booted. Although data stored in /var/tmp is typically deleted in a site-specific manner, it is recommended that deletions occur at a less frequent interval than /tmp.
システムの起動時に削除してはならないこと、/tmpより短い間隔で削除することが推奨されています。
過去の事例
過去に/tmp にインストーラを保存していたところ、作業が長期中断している間にファイルが自動削除されてしまい、再度インストーラを用意する必要になった経験があります。
一時的なファイル保存には/tmpや/var/tmpを使用しても問題ありませんが、長期間保存が必要な場合は他のディレクトリを使用すべきという事を失念していたことが原因です。
まとめ
私が昔に使っていたUnixサーバでは、/tmp以下に保存したファイルはOSを再起動すると削除されましたが、それは/tmpがメモリ上に置かれていたためです。
RHELでは/tmpがメモリ上に作成されている訳ではないため、再起動してファイルが削除されることはありませんが、半永久的にファイルを保存することはこれらのディレクトリの用途から望ましい事ではありません。
そのため、用途に応じた適切なディレクトリ選択と削除タイミングの理解が重要です。
また、Linuxのディレクトリ構造は前述のFHSによってその役割が定義されています。その定義に必ずも従わなくても正常に動作することもありますが、その後思いがけないタイミングで問題が発生することがあります。
/tmpや/var/tmpに限らず、ディレクトリ構成については理解した上で、どのディレクトリをどの用途に使用するか選択することが必要です。
参考資料
- Filesystem Hierarchy Standard
- TMPFILES.D(5)