systemd-tmpfiles 通过声明式配置管理临时文件,需编写 /etc/tmpfiles.d/myapp.conf 定义目录、权限及清理策略,并依赖 systemd-tmpfiles-setup.service 启动时创建、systemd-tmpfiles-clean.timer 周期清理,再通过 service 单元的 wants/after 保证业务启动前就绪。

在 systemd 系统中,systemd-tmpfiles 是专用于管理临时文件、目录、符号链接及权限的机制,它不依赖于传统 init 脚本,而是通过声明式配置统一控制 /tmp、/var/tmp、/run 及自定义路径的创建、清理与权限设置。要让特定业务的临时目录(如 /run/myapp 或 /var/tmp/myapp-cache)在系统启动时自动创建并设好属主/权限,并在运行期按需保持状态,核心是编写 tmpfiles 配置并启用对应服务。
1. 编写 tmpfiles 配置文件
配置文件应放在 /usr/lib/tmpfiles.d/(上游默认)、/etc/tmpfiles.d/(本地覆盖优先)或 /run/tmpfiles.d/(运行时临时生效)。推荐使用 /etc/tmpfiles.d/myapp.conf 以确保可维护性。
每行格式为:TYPE PATH MODE UID GID AGE ARG。常用 TYPE 包括:
- d:创建目录(若不存在),并设置权限、属主、属组
-
D:同
d,但会递归清理过期子项(配合AGE字段) - f:创建空文件
- L:创建符号链接
示例(/etc/tmpfiles.d/myapp.conf):
d /var/tmp/myapp-cache 0755 myapp myapp 1w -
L /tmp/myapp-run → /run/myapp
说明:
- 第一行:确保
/run/myapp目录存在,权限0750,属主myapp用户和组,不自动清理(-表示无过期策略) - 第二行:创建
/var/tmp/myapp-cache,权限0755,且每周(1w)清理其中未访问过的文件/子目录 - 第三行:建立符号链接,方便程序统一用
/tmp/myapp-run访问实际位于/run/myapp的运行时目录
2. 触发配置生效(启动期 + 运行期)
systemd-tmpfiles 本身不是长期运行的服务,而是由以下两个单元驱动执行:
-
systemd-tmpfiles-setup.service:在 early boot 阶段(sysinit.target之后)一次性运行,处理所有/usr/lib/tmpfiles.d/和/etc/tmpfiles.d/中的配置,确保启动时目录就绪 -
systemd-tmpfiles-clean.timer:默认每 12 小时触发一次systemd-tmpfiles-clean.service,专门执行带AGE的清理操作(如上例中的1w)
无需手动启用 timer —— 它已随 systemd 默认启用。确认方式:
systemctl is-enabled systemd-tmpfiles-clean.timer # 应返回 enabled若修改了配置,可立即应用:
该命令仅执行创建/设权,不触发清理;加 --remove 可先清旧再建新(慎用)。
3. 与业务服务协同(关键实践)
tmpfiles 配置本身不保证目录“始终可用”,需与业务 service 单元正确关联:
- 在业务 service 文件(如
/etc/systemd/system/myapp.service)中添加依赖:
Wants=systemd-tmpfiles-setup.service
After=systemd-tmpfiles-setup.service
这样能确保 myapp 启动前,/run/myapp 已创建完毕且权限正确。
- 若业务需在每次重启时清空缓存(非周期性清理),可在 service 的
[Service]段用ExecStartPre=-/bin/rm -rf /var/tmp/myapp-cache/*,但更推荐用 tmpfiles 的D类型 +AGE实现声明式管理 - 避免在
ExecStartPre中用mkdir -p+chown—— 这样绕过了 tmpfiles 统一管控,易导致权限漂移或启动顺序问题
4. 验证与调试
检查配置语法是否正确:
sudo systemd-tmpfiles --dry-run --cat-config查看某配置是否被加载:
sudo systemd-tmpfiles --verify /etc/tmpfiles.d/myapp.conf手动模拟执行并观察输出:
sudo systemd-tmpfiles --create --prefix /run/myapp /etc/tmpfiles.d/myapp.conf确认目录状态:
ls -ld /run/myapp /var/tmp/myapp-cache查看 clean timer 下次触发时间:
systemctl list-timers systemd-tmpfiles-clean.timer











