文章目录
1. 简介
systemd-tmpfiles 是Linux系统中用于管理临时文件和目录的一个工具,是systemd套件的一部分。它提供了一种结构化的、可配置的方法来创建、删除和清理临时文件和目录,以确保系统的整洁和安全性。
systemd-tmpfiles的配置文件通常位于以下几个目录中,它们的优先级从上到下依次为:
/etc/tmpfiles.d/*.conf
:系统管理员可以修改的配置文件。/run/tmpfiles.d/*.conf
:由守护进程(daemon)自己管理的配置文件,不建议普通用户更改。/usr/lib/tmpfiles.d/*.conf
:在软件安装时自动更新的配置文件,不建议普通用户更改。
配置文件时用于配置临时目录的路径和属性。格式通常包括文件或目录类型(type)、路径(path)、权限(mode)、用户(UID)、用户组(GID)、生存时间(AGE)等字段。
关于systemd-tmpfiles选项和tmpfiles.d配置文件格式的详解,见第三章节——详细资料。
2. 直接实操——配置一个临时目录
2.1 实现目标
假设我们的服务器上有一个服务,会产生一些临时文件。我们设置将这些临时文件保存在目录/opt/jr/tmp
和/opt/dd/tmp
中。那么我们现在希望以上两个目录临时文件能定期自动地被清理,且/opt/dd/tmp
中的文件至少保存1分钟以上,/opt/dd/tmp
可以尽快删除。
实现方法:借助systemd-tmpfiles实现。
2.2 第一步:配置临时目录
我们作为管理者,就选择在/etc/tmpfiles.d/
下创建我们的配置文件jr-tmp.conf
。
在文件/etc/tmpfiles.d/jr-tmp.conf
中编辑以下内容。
# 该目录中寿命超过1min的文件在命令systemd-tmpfile --clean被执行时将被删除
d /opt/dd/tmp 1750 root root 1min
# 该目录中的文件在命令systemd-tmpfile --remove被执行时将被删除
D /opt/jr/tmp 1750 root root
2.3 第二步:尝试手动执行systemd-tmpfiles命令创建、清理临时目录
执行以下命令,我们在tmpfiles.d
目录下的配置文件便会被读取,创建目录/opt/jr/tmp
和/opt/dd/tmp
。
systemd-tmpfiles --create
分别在两个临时目录中创建一些文件。
jr-02:/etc/tmpfiles.d # ll /opt/dd/tmp/
total 0
-rw-r----- 1 root root 0 Jul 11 19:37 t1
-rw-r----- 1 root root 0 Jul 11 19:37 t2
jr-02:/etc/tmpfiles.d # ll /opt/jr/tmp/
total 0
-rw-r----- 1 root root 0 Jul 11 19:36 t1
-rw-r----- 1 root root 0 Jul 11 19:36 t2
立即执行命令systemd-tmpfiles --remove --clean
。可以观察到,目录/opt/jr/tmp
中的文件被删除。而/opt/dd/tmp
中的文件还在,因为其中的文件创建时间还不到1分钟。
jr-02:/etc/tmpfiles.d # ll /opt/jr/tmp/
total 0
jr-02:/etc/tmpfiles.d # ll /opt/dd/tmp/
total 0
-rw-r----- 1 root root 0 Jul 11 19:37 t1
-rw-r----- 1 root root 0 Jul 11 19:37 t2
1分钟后,再次执行命令systemd-tmpfiles --remove --clean
。可以观察到目录/opt/dd/tmp
中的文件已被删除。
上述测试结果和配置文件/etc/tmpfiles.d/jr-tmp.conf
中对两个临时目录的配置效果是一致的。
2.4 第三步:定时器会按照我们配置的规则清理临时目录
有了第一步的配置,我们大可不必再手动执行命令取清理临时目录。在linux系统中(至少ubuntu和Euler是有的),有一个专门定时清理临时目录的定时器/usr/lib/systemd/system/systemd-tmpfiles-clean.timer
配置了清理临时目录的周期。其中配置的执行周期是1天,太长了,我们想改为3min。复制该.timer到/etc/systemd/system/
中,在/etc/systemd/system/systemd-tmpfiles-clean.timer
中修改定时执行周期为3min。因为/etc/systemd/system/
目录中服务单元的优先级最高,所以该目录下的systemd-tmpfiles-clean.timer
生效,而/usr/lib/systemd/system/systemd-tmpfiles-clean.timer
不再生效。
[Unit]
Description=Daily Cleanup of User's Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
[Timer]
OnStartupSec=5min
# 每分钟清理一次临时目录。一般1天(1d),我设置3分钟是为了快速观察到测试效果
OnUnitActiveSec=3min
[Install]
WantedBy=timers.target
执行以下命令,使修改的定时器生效。
systemctl daemon-reload # 重新加载systemd
在目录/opt/dd/tmp
中创建一些文件,4分钟以后再观察目录/opt/dd/tmp
下没有文件。说明我们成功了。
这个定时器是调用什么服务清理临时目录呢?从以上内容可见,该定时器并没有使用"Unit"选项指定它要启动的服务单元。那么它就是默认匹配与该.timer单元名称相同的 .service 单元(不算后缀)。
在/usr/lib/systemd/system/
目录中确实有一个与该timer同名的服务单元systemd-tmpfiles-clean.service
。打开这个service文件,可以看到其指定的要执行命令为systemd-tmpfiles --clean
。也就是说,这个服务单元会被周期性地启动,即周期性地执行systemd-tmpfiles --clean
命令,以实现定期清理临时目录的目的。不过该命令中不带--remove
选项,不能实现对/opt/jr/tmp
的清理。
[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-set.target
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=systemd-tmpfiles --clean
SuccessExitStatus=DATAERR
IOSchedulingClass=idle
为了实现对/opt/jr/tmp
的定时清理,复制/usr/lib/systemd/system/systemd-tmpfiles-clean.service
到/etc/systemd/system/
,将选项ExecStart
修改如下。
ExecStart=systemd-tmpfiles --clean --revove
再执行systemctl daemon-reload
以加载我们刚修改的service单元/etc/systemd/system/systemd-tmpfiles-clean.service
。
至此,/opt/jr/tmp
目录也会被定时清理了。
3. 详细资料
要详细了解systemd-tmpfiles各个选项参数和和tmpfiles.d配置文件的参数,直接看man page或者谷歌搜索就能搜索到英文手册,也可以查阅这本中文翻译手册《systemd.index 中文手册》(这大哥真挺厉害,有耐心翻译一本手册)。
为获取相关man page,可在系统上执行以下命令。
man systemd-tmpfiles
man tmpfiles.d