はじめに (対象読者・この記事でわかること)
この記事は、Linuxサーバーの運用・管理に携わっている方や、システム管理の基礎を学びたい方を対象としています。特に、/tmpディレクトリの挙動や、一時ファイルがいつ、どのように削除されるのか疑問に思っている方にとって役立つ内容を目指しています。
この記事を読むことで、以下のことがわかるようになります。
/tmpディレクトリの役割と、システムにおけるその重要性。- Linuxシステムにおける一時ファイルの削除メカニズム(
cronやsystemd-tmpfilesなど)。 /tmpディレクトリの削除ロジックの詳細と、その設定方法。/tmpディレクトリの管理における潜在的な問題点と、その対策。
普段意識することは少ないかもしれませんが、/tmpディレクトリの適切な理解と管理は、安定したシステム運用に不可欠です。この記事が、皆さんのシステム管理の一助となれば幸いです。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - Linuxシステムの基本的な操作(コマンドラインの利用) - ファイルシステムとディレクトリ構造の基本的な理解
/tmpディレクトリの役割と重要性
Linuxシステムにおける/tmpディレクトリは、文字通り「一時的なファイル」を格納するための場所です。多くのアプリケーションやシステムプロセスは、データの処理中に一時的なファイルを必要とし、それらを/tmpに作成します。例えば、以下のような用途で使用されます。
- アプリケーションの作業領域: ウェブサーバーがセッションデータを一時的に保存したり、コンパイラが中間ファイルを生成したりする際に利用します。
- ダウンロードやアップロードの一時保存: ファイルのダウンロード中やアップロード中に、一時的にデータがここに置かれることがあります。
- システムユーティリティの利用: コピー&ペースト操作やアーカイブファイルの展開など、さまざまなシステムユーティリティが一時ファイルを
/tmpに作成することがあります。
/tmpディレクトリの重要な特性として、通常、どのユーザーもファイルの作成や読み書きができるようにパーミッションが設定されています(一般的にはrwxrwxrwt、つまりtビット(sticky bit)が立っています)。このtビットは、たとえ他のユーザーが書き込み権限を持っていても、そのユーザーが作成したファイルやディレクトリは、その所有者かrootユーザーしか削除できないことを意味します。これにより、悪意のあるユーザーが他のユーザーの一時ファイルを削除することを防ぎ、セキュリティを保っています。
しかし、無制限にファイルが蓄積されると、ディスク容量を圧迫し、システムパフォーマンスの低下や安定性の問題を引き起こす可能性があります。そのため、不要になった一時ファイルを定期的に削除するメカニックが必要になります。これが、この記事で深掘りする「削除ロジック」です。
/tmpフォルダの削除ロジックを深掘り
/tmpディレクトリ内のファイルを自動的に削除するロジックは、Linuxディストリビューションやそのバージョンによって異なりますが、主に以下の2つのメカニズムが用いられます。
cronとtmpwatch/カスタムスクリプト (古いディストリビューションや手動設定)systemd-tmpfiles(現代のディストリビューション)
現在主流となっているのはsystemd-tmpfilesですが、まずは古い方法にも軽く触れておきましょう。
1. cronとtmpwatch/カスタムスクリプト
かつてのLinuxディストリビューションでは、cron(定期実行スケジューラ)を利用して、tmpwatchのようなユーティリティや、独自に作成したシェルスクリプトを定期的に実行することで/tmp内のファイルを削除していました。
tmpwatchコマンド: 指定したディレクトリ内のファイルのうち、最終アクセス時刻や最終変更時刻が一定期間経過したものを削除するツールです。例えば、tmpwatch -m 10d /tmpと実行すると、/tmp内で10日間変更されていないファイルを削除します。
この方式は柔軟性が高い一方で、cronジョブの管理やスクリプトの作成・保守が必要となる点が課題でした。
2. systemd-tmpfilesによる管理 (現代の主流)
現代の多くのLinuxディストリビューション、特にsystemdを採用しているシステムでは、/tmpやその他の揮発性ディレクトリ(/var/tmp、/runなど)のクリーンアップはsystemd-tmpfilesによって一元的に管理されています。
systemd-tmpfilesは、設定ファイルに基づいて、特定のディレクトリやファイルの作成、パーミッション設定、そして古くなったファイルの削除を行います。
systemd-tmpfilesの動作原理
systemd-tmpfilesは、主に以下の2つのサービスによって制御されます。
systemd-tmpfiles-setup.service: システム起動時に実行され、一時ファイルシステム(tmpfsでマウントされた/tmpなど)の初期化や、設定ファイルに基づいた初期ディレクトリの作成を行います。systemd-tmpfiles-clean.timer&systemd-tmpfiles-clean.service:systemd-tmpfiles-clean.timerが、例えば毎日や毎時間といった定期的なタイミングでsystemd-tmpfiles-clean.serviceを起動します。このサービスが実際に設定ファイルを参照し、古くなったファイルを削除する「クリーンアップ」処理を実行します。
設定ファイルの場所と書式
systemd-tmpfilesの設定ファイルは、主に以下の場所に格納されています。
/usr/lib/tmpfiles.d/*.conf: ディストリビューションやパッケージが提供するデフォルト設定。/etc/tmpfiles.d/*.conf: システム管理者が独自の設定を追加・上書きするための場所。/run/tmpfiles.d/*.conf: 実行時に動的に生成される一時的な設定。
これらの設定ファイルは優先順位があり、/etc配下のファイルが/usr/lib配下の同名ファイルを上書きします。
設定ファイルの基本的な書式は以下のようになります。
Type Path Mode UID GID Age Argument
それぞれのフィールドの意味は以下の通りです。
- Type: 処理の種類を指定します(例:
dfor directory,ffor file,xfor exclude,rfor remove,zfor chmod/chown)。 - Path: 処理対象のファイルまたはディレクトリのパス。
- Mode: ファイル/ディレクトリのパーミッション(例:
0755)。 - UID: 所有ユーザーのUIDまたはユーザー名(例:
root)。 - GID: 所有グループのGIDまたはグループ名(例:
root)。 - Age: ファイルを削除するまでの期間。この期間を過ぎたファイルは削除対象となります。例えば、
10dは10日、1hは1時間です。0またはハイフン(-)の場合は、ageによる削除は行われません。 - Argument: オプションの引数。Typeによって意味が異なります。
/tmpディレクトリのデフォルト設定例
多くのシステムでは、/tmpディレクトリは/usr/lib/tmpfiles.d/tmp.confのようなファイルで設定されています。典型的な設定は以下のようになります。
# /usr/lib/tmpfiles.d/tmp.conf (例)
d /tmp 1777 root root 10d
この設定は、以下のことを意味します。
d: ディレクトリを扱う。/tmp: ターゲットディレクトリは/tmp。1777: パーミッションはrwxrwxrwt。root root: 所有者はrootユーザー、rootグループ。10d: 最終アクセス/変更時刻から10日経過したファイルやディレクトリを削除対象とする。
この設定により、/tmp内のファイルは定期的にクリーンアップされます。
/tmpがtmpfsとしてマウントされている場合
一部のディストリビューションや設定では、/tmpがtmpfs(インメモリファイルシステム)としてマウントされている場合があります。tmpfsはRAM上に構築されるため、非常に高速ですが、システムが再起動するとその内容は完全に消去されます。
tmpfsが使われているかどうかは、mount | grep /tmpコマンドなどで確認できます。
Bashmount | grep /tmp # 例: tmpfs on /tmp type tmpfs (rw,nosuid,nodev,seclabel,size=2G,mode=1777)
もし/tmpがtmpfsとしてマウントされている場合、systemd-tmpfiles-cleanによる定期的な削除は行われますが、システムの再起動が最も確実なクリーンアップ方法となります。再起動のたびに/tmpは空になるため、通常は容量の心配が少なくなります。
カスタム設定の追加と確認
もし、特定のアプリケーションが/tmpではない別の一時ディレクトリを使用しており、そこも定期的にクリーンアップしたい場合や、/tmpの削除期間を変更したい場合は、/etc/tmpfiles.d/配下に独自の.confファイルを作成します。
例: /var/log/myapp/tmpディレクトリを3日でクリーンアップする設定
sudo vi /etc/tmpfiles.d/myapp.confを作成。- 以下の内容を記述。
d /var/log/myapp/tmp 0755 myappuser myappgroup 3d - 設定を即座に適用したい場合は、
sudo systemd-tmpfiles --create --cleanを実行します(--createはディレクトリ作成、--cleanは削除)。
systemd-tmpfiles-clean.timerの動作確認
クリーンアップタイマーのステータスは以下のコマンドで確認できます。
Bashsystemctl status systemd-tmpfiles-clean.timer
これにより、次回実行予定や過去の実行履歴を確認できます。
ハマった点やエラー解決
1. /tmpがいっぱいでシステムが不安定に
現象: /tmpディレクトリが一時ファイルで満杯になり、ディスク容量を圧迫。アプリケーションがファイルを書き込めなくなり、システム全体が不安定になる。
原因:
- 長期間稼働しているシステムで、systemd-tmpfilesのAge設定が適切でないか、サービスが停止している。
- 特定のアプリケーションが大量の一時ファイルを生成し、それらを適切に削除せずに残している。
- /tmpがtmpfsでない場合、再起動してもファイルが残る。
解決策:
- 現状確認: df -h /tmpでディスク使用量を確認。lsof | grep /tmpやdu -sh /tmp/*で、どのファイルやプロセスが容量を消費しているか特定する。
- 即時クリーンアップ: sudo systemd-tmpfiles --cleanを手動で実行してみる。必要であれば、容量を食っているファイルを特定し、手動で削除する(ただし、使用中のファイルを削除しないよう注意)。
- 設定見直し: /etc/tmpfiles.d/や/usr/lib/tmpfiles.d/内の設定ファイルを確認し、Ageパラメータが適切か、不要なx(除外)設定がないかを確認する。
- アプリケーションの修正: もし特定のアプリケーションが原因であれば、そのアプリケーションの設定を見直すか、開発元に報告する。
2. アプリケーションが作成した一時ファイルが意図せず消える
現象: アプリケーションが/tmpや/var/tmpに作成した一時ファイルが、期待よりも早く削除されてしまい、アプリケーションがエラーを起こす。
原因:
- systemd-tmpfilesのAge設定が短すぎる。
- アプリケーションが、ファイルの使用期間を/tmpの標準クリーンアップ期間よりも長く想定している。
解決策:
- 設定調整: アプリケーションが必要とする期間を考慮し、/etc/tmpfiles.d/で/tmpや/var/tmpのAge設定を延長するか、アプリケーション専用の一時ディレクトリを作成し、そこをsystemd-tmpfilesで管理する設定を追加する。
- アプリケーションの確認: アプリケーションが推奨する一時ファイルの保存場所や管理方法を確認する。
3. systemd-tmpfilesの設定ミスで意図せぬデータ削除
現象: systemd-tmpfilesの設定ファイルを誤って記述した結果、重要なファイルやディレクトリが削除されてしまった。
原因:
- 設定ファイル (.conf) のパス指定やType、Age、Argumentの記述ミス。
- 特にr (remove) タイプを不用意に使用した場合。
解決策:
- バックアップ: systemd-tmpfilesの設定ファイルを編集する際は、必ずバックアップを取る。
- テスト: 新しい設定を適用する前に、テスト環境で動作を確認する。
- ドライラン: systemd-tmpfilesには直接ドライランモードはありませんが、影響範囲を慎重に検討し、rタイプなどは極力避けるか、限定的なパスにのみ適用する。
- ログ確認: journalctl -u systemd-tmpfiles-clean.serviceなどで、クリーンアップ処理のログを確認し、意図しない削除が行われていないかを監視する。
systemd-tmpfilesは強力なツールであるため、設定変更の際は細心の注意を払うことが重要です。
まとめ
本記事では、Linuxシステムにおける/tmpフォルダの役割とその削除ロジックについて詳細に解説しました。
/tmpディレクトリは、アプリケーションやシステムプロセスが一時的にデータを保存するための重要な場所であり、セキュリティ上の考慮からスティッキービットが設定されています。- 現代のLinuxシステムでは、主に
systemd-tmpfilesが一時ファイルの削除を管理しています。これは、/etc/tmpfiles.d/などの設定ファイルに基づいて、特定の期間(Age)が経過したファイルを定期的に削除するメカニズムです。 /tmpがtmpfsとしてマウントされている場合は、再起動時に内容が完全に消去されるという特性も理解しておく必要があります。- 容量逼迫や意図しないファイル削除などの問題が発生した場合は、
systemd-tmpfilesの設定やログを確認し、適切に対処することが安定稼働には不可欠です。
この記事を通して、皆さんが/tmpディレクトリの挙動をより深く理解し、Linuxシステムの管理能力を向上させることができたなら幸いです。今後は、/var/tmpや/runなどの他の揮発性ディレクトリの管理についても、さらに掘り下げた記事を作成する予定です。
参考資料
参考にした記事、ドキュメントなどがあれば、必ず記載しましょう。
