【systemd-tmpfiles】一時ディレクトリの管理について（作成・削除・変更）

## はじめに
「tmpfs」である「/run」ディレクトリにPIDファイルを配置するためのディレクトリを作成する必要があったため、「systemd-tmpfiles」コマンドについて調べてみた。

## systemd-tmpfiles とは
「systemd-tmpfiles」は、Linux における一時ファイルやディレクトリの作成、削除、パーミッション設定を管理する systemd のコンポーネント（ツール）である。OS再起動後に必要なディレクトリやファイルの再作成、および不要な一時ファイルのクリーンアップを自動的に行う機能を提供する。

主な対象は「/run」「/tmp」「/var/cache」などの一時ディレクトリである。
※これらのディレクトリ内のデータは、基本的にOS停止時に削除される。

:::note warn
基本的にOSの(再)起動や時に「systemd-tmpfiles」で設定した内容が実行される。
:::

## 使用用途
「systemd-tmpfiles」は以下のような場面で使用される。

**【一時的なファイルやディレクトリの作成】**

　・ 再起動時に必要なディレクトリ（例: /run/zabbix）を自動的に作成する。
　・ アプリケーションが利用するPIDファイルの生成する。

　例えば、OS再起動後やサービスの起動時に必要なディレクトリやファイルを自動的に作成することで、アプリケーションの環境を整備するなど。


**【一時ファイルの自動削除】**

　・ 一時ディレクトリ配下の古いファイルを削除し、ディスクスペースを空ける。

　例えば、特定の場所（例: /tmp 配下）にある古いファイルを定期的に削除することで、不要なデータの蓄積を防ぐなど。

**【一時データのパーミッション設定】**

　・ セキュリティを目的としたファイルの所有者やグループ、権限の設定をする。

　例えば、セキュリティ目的で、一時データの所有者やグループ、権限を適切に設定し、不要なアクセスを防ぐなど。

**【特定条件でのファイルの削除】**

　・ 古いキャッシュや一時ファイルを一定期間後に削除する。

　例えば、古いキャッシュや一時ファイルを一定期間後に削除することで、不要なデータの蓄積を防ぐなど。

## コマンドの使い方
「systemd-tmpfiles」コマンドは、設定を手動で適用したり、動作をシミュレーションするために使用する。

**【コマンド基本構文】**
```bash:構文
systemd-tmpfiles [オプション]
```
:::note info
**【基本的なオプション】**
[--create]：
設定ファイル「ｄ,ｆ,ｚ」に従ってディレクトリやファイルを作成
[--remove]：
設定ファイル（ｒ,Ｒ）に従ってディレクトリやファイルを削除
[--clean]：
設定ファイル[時間]に従って古いファイルをクリーンアップ
[--dry-run]：
設定をシミュレーション実行（実際には変更を加えない）
※ver.256 から使用可
[--cat-config]：
すべての設定を統合して表示（現在の設定状況を表示）
:::

**【設定ファイル基本構文】**
```bash:構文
タイプ パス モード 所有者 グループ 時間
```
:::note info
**【各フィールド説明】**
タイプ：
操作の種類（例: d=ディレクトリ作成, f=ファイル作成）
パス：
操作対象のパスを指定
モード：
パーミッションを指定（例: 0755）
所有者：
所有者（ユーザー名またはUID）
グループ：
グループ（グループ名またはGID）
時間（オプション）：
ファイルやディレクトリの有効期限（例: 10d は10日間）
※[s(秒)、m(分)、h(時間)、d(日)、w(週)]
※[タイプ（d）で使用可]
:::

:::note info
**【基本的なタイプ一覧】**
[d]：
指定したディレクトリを作成
[f]：
空の通常ファイルを作成
[z]：
既存のファイルやディレクトリの所有者・グループ・モードを変更
[r]：
指定したパスを削除（ファイルまたは空ディレクトリ削除）
[R]：
指定したパス以下の内容を削除（ディレクトリ自体は残す）
:::

:::note info
**【 systemd-tmpfiles の動作設定ファイル 】**
以下の設定ファイルでsystemd-tmpfilesの動作を制御する。
/usr/lib/tmpfiles.d/\*.conf：
システムやパッケージのデフォルト設定（設定優先度：低）
/etc/tmpfiles.d/\*.conf：
管理者が設定を追加・上書きするための場所（設定優先度：中）
/run/tmpfiles.d/\*.conf：
一時的な設定（再起動でクリア）（設定優先度：高）
:::

```bash:【例】systemd-tmpfiles --create（ディレクトリ作成）
## テスト設定ファイル作成
[root@localhost ~]# echo "d /run/test 0755 zabbix zabbix" > /etc/tmpfiles.d/create-test.conf

## テスト設定ファイル確認
[root@localhost ~]# ls -ld /etc/tmpfiles.d/create-test.conf
-rw-r--r-- 1 root root 31 11月 25 23:30 /etc/tmpfiles.d/create-test.conf
[root@localhost ~]# cat /etc/tmpfiles.d/create-test.conf
d /run/test 0755 zabbix zabbix

## ディレクトリが存在しないことを確認
[root@localhost ~]# ls -la /run/test
ls: '/run/test' にアクセスできません: そのようなファイルやディレクトリはありません

## テスト設定ファイル適用
[root@localhost ~]# systemd-tmpfiles --create /etc/tmpfiles.d/create-test.conf

## テスト設定ファイル適用確認
[root@localhost ~]# systemd-tmpfiles --cat-config
～省略～
# /etc/tmpfiles.d/create-test.conf
d /run/test 0755 zabbix zabbix

## ディレクトリが作成されたことを確認
[root@localhost ~]# ls -ld /run/test
drwxr-xr-x 2 zabbix zabbix 40 11月 25 23:46 /run/test
```

```bash:【例】systemd-tmpfiles --remove（ディレクトリおよびファイル削除）
## テスト設定ファイル作成
[root@localhost ~]# echo "R /run/test/*" > /etc/tmpfiles.d/remove-test.conf

## テスト設定ファイル確認
[root@localhost ~]# ls -ld /etc/tmpfiles.d/remove-test.conf
-rw-r--r-- 1 root root 14 11月 26 01:22 /etc/tmpfiles.d/remove-test.conf
[root@localhost ~]# cat /etc/tmpfiles.d/remove-test.conf
R /run/test/*

## 削除ディレクトリおよびファイル作成
[root@localhost ~]# mkdir -p /run/test/test2
[root@localhost ~]# touch /run/test/test2/test.txt

## 削除ディレクトリおよびファイル確認
[root@localhost ~]# ls -lR /run/test
/run/test:
合計 0
drwxr-xr-x 2 root root 60 11月 26 01:39 test2
/run/test/test2:
合計 0
-rw-r--r-- 1 root root 0 11月 26 01:39 test.txt

## テスト設定ファイル適用
[root@localhost ~]# systemd-tmpfiles --remove /etc/tmpfiles.d/remove-test.conf

## テスト設定適用確認
[root@localhost ~]# systemd-tmpfiles --cat-config
～省略～
# /etc/tmpfiles.d/remove-test.conf
R /run/test/*

## 削除されたことを確認
[root@localhost ~]# ls -lR /run/test
/run/test:
合計 0
```

```bash:【例】systemd-tmpfiles --clean（５分前ファイル削除）
## テスト設定ファイル作成（5分）
[root@localhost ~]# echo "d /run/test 0755 zabbix zabbix 5m" > /etc/tmpfiles.d/clean-test.conf

## テスト設定ファイル確認
[root@localhost ~]# ls -ld /etc/tmpfiles.d/clean-test.conf
-rw-r--r-- 1 root root 34 11月 26 02:16 /etc/tmpfiles.d/clean-test.conf
[root@localhost ~]# cat /etc/tmpfiles.d/clean-test.conf
d /run/test 0755 zabbix zabbix 5m

## クリーンファイル作成（5分前と直近）
[root@localhost ~]# date
2024年 11月 26日 火曜日 02:17:29 JST
[root@localhost ~]# touch /run/test/test1.txt　←★５分前
[root@localhost ~]# date
2024年 11月 26日 火曜日 02:23:25 JST
[root@localhost ~]# touch /run/test/test2.txt　←★直近

## 5分前と直近のクリーンファイル確認
[root@localhost ~]# ls -l /run/test/*
合計 0
-rw-r--r-- 1 root root 0 11月 26 02:17 /run/test/test1.txt
-rw-r--r-- 1 root root 0 11月 26 02:23 /run/test/test2.txt

## テスト設定ファイル適用
[root@localhost ~]# systemd-tmpfiles --clean /etc/tmpfiles.d/clean-test.conf

## テスト設定適用確認
[root@localhost ~]# systemd-tmpfiles --cat-config
～省略～
# /etc/tmpfiles.d/clean-test.conf
d /run/test 0755 zabbix zabbix 5m

## 5分前のファイルが削除されたことを確認
[root@localhost ~]# date
2024年 11月 26日 火曜日 02:24:21 JST
[root@localhost ~]# ls -l /run/test/*
-rw-r--r-- 1 root root 0 11月 26 02:23 /run/test/test2.txt
```

```bash:【例】systemd-tmpfiles --create（権限・所有者変更）
## テスト設定ファイル作成
[root@localhost ~]# echo "z /run/test 0711 root root" > /etc/tmpfiles.d/change-test.conf

## テスト設定ファイル確認
[root@localhost ~]# ls -ld /etc/tmpfiles.d/change-test.conf
-rw-r--r-- 1 root root 27 11月 26 02:34 /etc/tmpfiles.d/change-test.conf
[root@localhost ~]# cat /etc/tmpfiles.d/change-test.conf
z /run/test 0711 root root

## 現在の権限および所有者を確認
[root@localhost ~]#  ls -ld /run/test
drwxr-xr-x 2 zabbix zabbix 40 11月 26 02:35 /run/test

## テスト設定ファイル適用
[root@localhost ~]# systemd-tmpfiles --create /etc/tmpfiles.d/change-test.conf

## テスト設定ファイル適用確認
[root@localhost ~]# systemd-tmpfiles --cat-config
～省略～
# /etc/tmpfiles.d/change-test.conf
z /run/test 0711 root root

## 権限および所有者が変更したことを確認
[root@localhost ~]# ls -ld /run/test
drwx--x--x 2 root root 40 11月 26 02:35 /run/test
```

## 使用する上での注意点

**【削除操作の慎重な扱い】**

　・削除設定ミスによるデータ損失を防ぐ

　「R（ディレクトリ内容の削除）」や「r（ファイル削除）」の設定ミスにより、必要なデータが失われる可能性があるため、設定を適用する前に必ず「--dry-run」を使用して挙動を確認すること。

**【永続データへの適用を避ける】**

　・誤って重要データを削除しない

　「/var/lib」や「/srv」のような永続的データの保存場所に「systemd-tmpfiles」を適用しないよう注意すること。キャッシュや一時データのみに削除設定を適用すること。

**【時間フィールドの適切な設定】**

　・削除期限を慎重に設定

　時間フィールド（例: 10d）の設定が短すぎると、必要なデータが予期せず削除されることがある。明確な運用方針が定まっていない場合は、安全性を考慮して、時間設定を長めにすること。

**【設定の反映と動作確認】**

　・設定ミスを防ぐために確認を徹底

　設定ファイルを作成した後は、「--dry-run」を使用して挙動を確認し、設定を適用した後に対象のディレクトリやファイルが正しく作成されているかを確認すること。

**【権限設定とセキュリティの確認】**

　・不適切な権限設定を防ぐ

　「d（ディレクトリ作成）」や「z（既存ファイルやディレクトリの権限変更）」の設定で、権限や所有者が適切でない場合、不正アクセスや動作エラーの原因となる可能性がある。そのため、設定後には必ず権限や所有者を確認すること。

 ## 参考ドキュメント
 ・[**【systemd-tmpfiles(8) — Linux manual page】**](https://www.man7.org/linux/man-pages/man8/systemd-tmpfiles.8.html?utm_source=chatgpt.com)
 ・[**【tmpfiles.d(5) — Linux manual page】**](https://www.man7.org/linux/man-pages/man5/tmpfiles.d.5.html)