systemd-tmpfiles 是 systemd 用于管理临时文件、运行时目录及持久化状态目录的工具,支持启动时和服务启动前动态创建目录、设置权限/属主/acl/xattr/selinux 标签,并自动修复手动导致的权限偏差;其行为由 /usr/lib/tmpfiles.d/、/etc/tmpfiles.d/ 和 /run/tmpfiles.d/ 下的配置文件控制,每行以 type 开头(如 d 创建目录、d 递归清理、f 创建文件、z/z 设置 selinux、a 设置 acl);当服务使用 runtimedirectory= 等指令时,systemd 会在启动前自动调用 systemd-tmpfiles --create 执行对应配置,实现幂等修复;手动调试可用 --dry-run、--verify 等选项验证配置效果。

systemd-tmpfiles 是 systemd 提供的用于管理临时文件、运行时目录及持久化状态目录的工具,它不只在系统启动时运行,还能在服务启动前动态创建目录、设置属主、权限、ACL 和 xattr,并自动修复因手动操作导致的权限偏差。
配置文件定义行为逻辑
其行为由 /usr/lib/tmpfiles.d/*.conf(上游默认)、/etc/tmpfiles.d/*.conf(管理员覆盖)和 /run/tmpfiles.d/*.conf(运行时临时覆盖)中的配置文件控制。每行格式为:
TYPE PATH MODE UID GID AGE ARG
其中 TYPE 决定操作类型,常见有:
- d:创建目录(若不存在),并设置权限/属主;若已存在,则仅校验并修复权限与归属
- D:同 d,但会递归清理过期子项(配合 AGE 字段)
- f 或 F:创建空文件或覆写文件
- Z 和 z:递归或非递归地设置 SELinux 标签
- a:设置文件访问控制列表(ACL)
服务启动时自动触发修复
当 unit 使用 RuntimeDirectory=、StateDirectory=、CacheDirectory= 等指令时,systemd 会在该服务启动前,自动调用 systemd-tmpfiles --create 执行对应路径的配置(通常来自 /usr/lib/tmpfiles.d/ 中与服务同名的 .conf 文件,如 redis.conf)。这意味着:
- 即使管理员手动删掉 /var/lib/redis,服务重启时会自动重建并设好权限(如 0750、redis:redis)
- 若有人误执行 chmod 777 /run/myapp,下次 myapp.service 启动前,systemd-tmpfiles 会检测到权限不符,主动还原为配置中指定的值
- 修复是幂等的——重复运行不会报错,只在实际不一致时变更
手动验证与调试方法
排查目录未创建或权限未生效问题,可直接模拟运行:
- 查看某服务关联的 tmpfiles 配置:pkg-config systemd --variable=tmpfilesdir,然后检查对应 .conf
- 测试单个配置文件:systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf
- 预览但不执行(dry-run):systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
- 查看实际应用了哪些规则:systemd-tmpfiles --verify /usr/lib/tmpfiles.d/*.conf 2>&1 | grep 'mismatch\|missing'
权限修复的关键细节
修复不是简单 chmod/chown,而是严格比对配置中声明的 MODE、UID、GID、SELinux 上下文、ACL 和 xattr。只要任一字段不匹配,就会修正。例如:
配置行:d /run/myapp 0751 myuser mygroup - -
若 /run/myapp 当前权限为 0755、属主为 root:root,则 systemd-tmpfiles 会同时修正权限和归属;若仅 ACL 缺失,而其他都对,它不会动 ACL ——除非配置中显式用了 a 行。
注意:修复仅发生在 --create 模式(如服务启动前或手动调用),--clean 不修复权限,只清理旧文件。










