tmp临时目录清理规则

2024-08-07 13:41:26 浏览数 (1)

tmpfiles.d 描述

tmpfiles.d 配置文件定义了一套临时文件管理机制,主要用于管理易变的临时文件与目录,例如:/run、/tmp、/vartmp、/sys、/proc、/var 下面的某些目录。 根据这些配置,在系统启动过程中创建易变的临时文件与目录,并在系统运行过程中进行周期性的清理。 守护进程经常需要在 /var 目录下拥有专属的运行时目录,以存放通信套接字或管道之类的文件。

配置目录及优先级

对于不同目录下的同名配置文件,仅以优先级最高的目录中的那一个为准。具体就是:/etc/tmpfiles.d 的优先级最高,/run/tmpfiles.d 的优先级居中,/usr/lib/tmpfiles.d 的优先级最低。 软件包应该将自带的配置文件安装在 /usr/lib/tmpfiles.d 目录中,而 /etc/tmpfiles.d 目录仅供系统管理员使用。 如果系统管理员想要屏蔽 /usr/lib/ 目录中的某个配置文件,最佳做法是在 /etc/ 目录中创建一个指向 /dev/null 的同名符号链接,即可彻底屏蔽 /usr/lib/ 目录中的同名文件。

配置文件格式

配置文件的格式是每行对应一个路径,包含如下字段:类型、路径、权限、属主、属组、寿命、参数 #Type Path Mode User Group Age Argument d /run/tmp 0755 root root 10d -

类型

类型字段由一个单独的、表示类型的字母与一个可选的感叹号(!)和减号(-)组成。

代码语言:javascript复制
f:若指定的文件不存在,则创建它,否则什么也不做;
F:若指定的文件不存在,则创建它,否则清空已有文件;
w:若指定的文件存在,则将参数字段的内容写入该文件,否则什么也不做;
d:创建指定的目录,并赋于指定的 User/Group 与权限,如果指定的目录已经存在,那么仅调整 User/Group 与权限。如果指定了寿命字段,那么该目录中的内容将遵守基于时间的清理策略;
D:与 d 类似,但如果使用了 --remove 选项,那么将清空目录中的所有内容;
x:根据寿命字段清理过期文件时,忽略指定的路径及该路径下的所有内容,可以在路径字段中使用 shell 风格的通配符,这个保护措施对 r 与 R 无效;
X:根据寿命字段清理过期文件时,仅忽略指定的路径自身而不包括该路径下的其他内容,可以在路径字段中使用 shell 风格的通配符,这个保护措施对 r 与 R 无效;
r:若指定的文件或目录存在,则删除它,不可用于非空目录;
R:若指定的文件或目录存在,则递归删除它,可用于非空目录;
z:若指定的文件或目录存在,仅设置其自身的访问权限、属主、属组、重置 SELinux 安全上下文;
Z:若指定的文件或目录存在,则递归设置其访问权限、属主、属组、重置 SELinux 安全上下文;
代码语言:javascript复制
使用了感叹号标记的行,仅可在系统启动过程中执行,而不能用于运行中的系统(会破坏系统的正常运行),未使用感叹号标记的行,可以在任意时间安全的执行。
systemd-tmpfiles 仅在明确使用了 --boot 选项的时候才会执行使用了感叹号标记的行。

# 例如
r! /tmp/.X[0-9]*-lock 	# 仅在系统启动时删除所有X11的锁文件(但在系统运行时禁止删除)

如果使用了减号,那么当该行创建(仅限于创建)操作失败时,将不会导致 systemd-tmpfiles 返回错误代码。

路径

路径字段指定文件系统路径,并且支持使用替换符,替换之后的最终路径必须是绝对路径。

权限

权限字段表示设置文件或目录的权限,如果省略或设为 “-“ 则表示使用默认权限,也就是:对于目录使用 0755,对于文件使用 0644,但对于 z、Z 表示不修改现有的权限,此字段对于 x、r、R、L、t、a 没有意义。

属主、属组

“属主”和”属组”字段分别表示文件或目录的所属用户与所属用户组,可以设为数字形式的UID/GID 值,也可以设为字符串形式的用户名/组名称。如果省略或设为 “-“ 则表示使用调用 systemd-tmpfiles 命令的用户及组,但对于 z、Z 来说,省略或设为 “-“ 则表示不修改现有的属主和属组。

寿命(Age)

该字段用于判定在清理过期文件或子目录时应该删除哪些,也就是决定了文件或子目录的寿命。如果文件或子目录的最后使用时间与当前系统时间之差大于“寿命”字段的值,那么这些文件或子目录将被删除,此字段的值是一个时间长度,可以使用下面的时间单位后缀: us(微秒)、ms(毫秒)、s(秒)、m(分)、h(时)、d(天)、w(周)。 可以同时使用多个时间单位,例如:5m10s表示5分10秒,如果省略了时间单位,那么表示使用默认单位 “秒”。 如果将此字段设为数字0,那么表示在每次清理时都无条件的删除所有文件或子目录。 此字段仅对 d, D, e, v, q, Q, C, x, X 有意义。如果省略此字段或将其设为 “-“ ,那么表示不进行任何清理。 如果此字段的值以 “~“ 开头, 那么表示在每次清理时都无条件的保留指定目录直属的文件与子目录, 也就是仅清理直属子目录下的内容。 “寿命”是根据对象的最后修改时间(mtime)、 最后访问时间(atime)、 最后状态变化时间(ctime)(目录除外) 计算的。 如果三者(或两者)中最晚的时间与当前系统时间之差大于”寿命”字段的值, 那么该对象就会被删除, 否则该对象将会被保留。

参数(Argument)

“参数”字段对不同的”类型”有不同的作用:对于 L 来说,用于指定软连接的目标路径。 对于 c, b 来说,用于以”主设备号:次设备号”的格式设定设备节点的主/次设备号(十进制整数),例如 “1:3“ 。 对于 f, F, w 来说,用于设置一个写入文件的短字符串(实际写入时会在末尾附加一个换行符)。 对于 C 来说,用于指定源文件或者源目录。 对于 t, T 来说,用于指定将要设置的扩展属性。 对于 a, A 来说,用于指定将要设置的ACL属性。 对于 h, H 来说,用于指定将要设置的文件属性。 对于其他类型无意义,将被忽略。 可以在”路径”(Path)与”参数”(Argument)字段中使用替换符。 不可识别的替换符将会被视为配置错误。 可识别的替换符如下: 替换符含义“%b“系统的”Boot ID”字符串“%C“缓存目录。对于 --user 模式来说是 $XDG_CACHE_HOME ,否则是 /var/cache%h“用户的家目录。运行命令的用户的家目录,对于系统实例则是 /root%H“系统的主机名(hostname)“%L“日志目录。对于 --user 模式来说是 $XDG_CONFIG_HOME/log,否则是 /var/log%t“运行时目录。对于 --user 模式来说是 $XDG_RUNTIME_DIR ,否则是 /run%S“状态目录。对于 --user 模式来说是 $XDG_CONFIG_HOME ,否则是 /var/lib%T“临时文件目录。也就是 /tmp%g“运行命令的用户组名称。对于系统实例则是 /root%G“运行命令的用户组数字GID 。对于系统实例则是 0%u“运行命令的用户名称。对于系统实例则是 /root%U“运行命令的用户数字UID 。对于系统实例则是 0%v“内核版本(uname -r 的输出)“%V“存放大体积临时文件以及持久临时文件的目录。也就是 /var/tmp%%“百分号自身(%)。使用%%表示一个真正的%字符

例子

按照指定的 User/Group 与权限创建目录

代码语言:javascript复制
# 在系统启动时按照指定的属主、属组、权限创建两个目录
vim /usr/lib/tmpfiles.d/supervisord.conf

d /var/run/supervisord 0755 root root 10d
d /run/supervisord 0755 root root 10d12h
# /var/run/supervisord 中超过10天的内容将被清理;
# /var/supervisord 中超过12.5 天的内容将被清理;

创建一个不会被定期清理的目录

代码语言:javascript复制
# 在系统启动时按照指定的属主/属组创建一个目录
vim /usr/lib/tmpfiles.d/tmp.conf
d /var/tmp 0777 root root -

systemd-tmpfiles --create 	# 仅用于手工创建,以后开机会自动创建

启用系统启动过程中的清理,以及基于时间的清理

代码语言:javascript复制
vim/usr/lib/tmpfiles.d/dnf.conf
r! /var/cache/dnf/*/*/download_lock.pid
r! /var/cache/dnf/*/*/metadata_lock.pid
r! /var/lib/dnf/rpmdb_lock.pid
e  /var/cache/dnf/ - - - 30d

# 系统启动过程中将会清理 lock 文件。 /var/cache/dnf/ 目录中 闲置超过30天的内容将会被删除

在启动时清空缓存目录

代码语言:javascript复制
vim /usr/lib/tmpfiles.d/krb5rcache.conf
e! /var/cache/krb5rcache - - - 0

# 在启动时清空 /var/cache/krb5rcache/ 下的所有内容。即使此目录不存在也不会创建它。

systemd-tmpfiles

  • 描述

systemd-tmpfiles 根据配置文件 tmpfiles.d 的指引,创建、删除、清理、易变文件与临时文件。

选项

代码语言:javascript复制
--create:创建或写入 所有 f, F, w, d, D, v, p, L, c, b, m 标记的文件与目录。 所有 z, Z, t, T, a, A 标记的文件与目录都将被设置相应的 属主/属组、权限、安全标签;

--clean:清理 所有过期的 文件与目录

--remove:删除 D, R 标记的目录中的内容,以及 r, R 标记的目录与文件自身

--user:执行"用户"配置,也就是用户配置目录中的 tmpfiles.d 配置文件

--boot:执行带有"!"标记的行

--prefix=PATH:仅作用于 带有特定前缀的路径, 可以多次使用此选项

--exclude-prefix=PATH:忽略 带有特定前缀的路径, 可以多次使用此选项

服务

代码语言:javascript复制
# systemd-tmpfiles-clean.service服务通过systemd-tmpfiles-clean.timer服务定时启动
vim /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min 		# 相对于机器被启动的时间点(默认开机15分钟执行服务)
OnUnitActiveSec=1d
代码语言:javascript复制
vim /usr/lib/systemd/system/systemd-tmpfiles-clean.service
[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-readahead-collect.service systemd-readahead-replay.service local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot 	# 这一选项适用于只执行一项任务,随后立即退出服务
ExecStart=/usr/bin/systemd-tmpfiles --clean		# 通过定期执行该命令完成清理
IOSchedulingClass=idle
代码语言:javascript复制
# /tmp 目录的清理规则主要取决于 /usr/lib/tmpfiles.d/tmp.conf 文件的设定,默认配置内容为:
vim /usr/lib/tmpfiles.d/tmp.conf
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp

清理/tmp目录超过10天的内容,但是匹配/tmp/systemd-private-%b-*的目录及其路径下的全部内容会被保留
清理/var/tmp目录超过30天的内容,但是匹配/var/tmp/systemd-private-%b-*的目录及其路径下的全部内容被保留

参考文档:https://www.jinbuguo.com/systemd/systemd-tmpfiles.html# https://www.jinbuguo.com/systemd/tmpfiles.d.html

0 人点赞