Linux的tmp目录

2025-01-05 22:47:00
丁国栋
原创 30
摘要:本文记录Linux /tmp 目录的一些知识。

在使用了 systemd 的 Linux 系统中,有一个定时器(timer)是 systemd-tmpfiles-clean.timer,它是一个触发执行 systemd-tmpfiles-clean.service 的定时器,用于每日清理临时目录。

从systemd-tmpfiles-clean.timer的status信息来看,是每天都会执行。具体的执行信息是在 systemd-tmpfiles-clean.service 中,通过status可以看到是执行/bin/systemd-tmpfiles --clean 命令。

从最佳实践上讲,我们不能把有用的并且需要持久化保存的文件放到 /tmp 下。举一个简单的反面例子,假设我们在创建计划任务时将一个脚本重定向到 /tmp/crontab/exec.log,例如 /path/to/command > /tmp/crontab/exec.log ,假设 /tmp/crontab 目录不存在,那么这个计划任务就会执行失败。

systemd-tmpfiles-clean.timer 是 systemd 系统和服务管理器的一部分,它用于定时触发 systemd-tmpfiles-clean.service 服务的执行。这个服务的作用是清理临时文件和目录,依据 /usr/lib/tmpfiles.d/、/etc/tmpfiles.d/ 或者其他由管理员指定的目录下的配置文件来决定哪些文件或目录需要被清理以及如何清理。

工作原理
Timer: systemd-tmpfiles-clean.timer 定义了 systemd-tmpfiles-clean.service 的执行时间表。默认情况下,它每天都会触发一次该服务。
Service: systemd-tmpfiles-clean.service 会读取 /etc/tmpfiles.d 目录下的配置文件,并根据其中的指令对文件系统进行操作,比如创建、删除、截断文件或设置权限等。
Configuration Files: 在 /etc/tmpfiles.d 目录下,管理员可以放置多个以 .conf 结尾的配置文件,这些文件包含了关于临时文件和目录应该如何管理的规则。每个规则可以指定一个路径、模式(如 'r' 表示移除,'c' 表示创建)、年龄(超过这个时间未访问的文件将被处理)等。
具体行为
当 systemd-tmpfiles-clean.service 被触发时,它会检查所有相关的配置文件,并按照配置文件中定义的规则对文件系统进行操作。例如:

  1. 移除那些设置了 'r' 模式的、并且最后一次修改时间超过了配置文件中指定的时间限制的文件。
  2. 清空(即保留文件但将其内容清空)设置了 'C' 模式的文件。
  3. 创建设置了 'w' 模式的新文件或目录。
  4. 设置文件或目录的权限、用户、组等属性。
自定义
如果想要改变默认的行为,可以通过编辑 /etc/tmpfiles.d/ 下的配置文件来实现。例如,如果想让某个特定的临时文件夹在一周后自动清理,可以添加一行类似下面的内容到一个配置文件中:
# Type Path    Mode UID  GID  Age Argument
r!   /tmp/myapp  -    -    -    1w
这行配置表示任何位于 /tmp/myapp 下面的文件如果超过了一周(1w = 1 week)没有被访问,则会被移除。


为了使 /tmp 下的某个特定目录不被清理,可以采取以下几种方法:
1. 使用 tmpfiles.d 配置
可以通过创建或编辑 /etc/tmpfiles.d/ 目录下的一个配置文件来定义哪些文件和目录不应该被自动清理。对于想要永久保存的目录,可以添加一个条目,指定该目录不会被删除。
例如,如果希望 /tmp/my_persistent_dir 不被清理,可以在 /etc/tmpfiles.d/ 中创建一个新的 .conf 文件(比如 my_persistent.conf),并加入如下行:

# Type Path Mode UID GID Age Argument
d /tmp/my_persistent_dir 0755 root root - -


这里的 d 表示这是一个目录,0755 是权限模式,root 是拥有者和组,- 表示没有年龄限制(即永远不清理),最后的 - 表示没有额外参数。
2. 修改或创建 systemd-tmpfiles 清理规则
如果系统使用了 systemd-tmpfiles 来管理临时文件,可以直接修改相关的清理规则,或者创建新的规则以覆盖默认行为。这可以通过编辑 /usr/lib/tmpfiles.d/tmp.conf 或者创建一个更高优先级的文件在 /etc/tmpfiles.d/ 目录下来实现。
例如,在 /etc/tmpfiles.d/tmp.conf 中添加或修改相应的行来保护目录:

# Don't remove anything in /tmp, or clean up only really old files
x! /tmp 755 - - 0
# Ensure my_persistent_dir is not cleaned up
d! /tmp/my_persistent_dir 0755 root root - -
这里的 x! 指令会告诉 systemd-tmpfiles 不要清理 /tmp 下面的任何东西,而 d! 则明确地保护了 /tmp/my_persistent_dir。
3. 设置 Sticky Bit
虽然设置粘滞位(sticky bit)不能防止整个目录被清理,但它可以阻止非所有者删除或移动该目录内的文件。这对于共享的临时空间可能有用,但并不适用于防止整个目录被清理工具如 systemd-tmpfiles-clean 移除。
要为 /tmp/my_persistent_dir 设置粘滞位,可以使用 chmod 命令:sudo chmod +t /tmp/my_persistent_dir


4. 使用不同的存储位置
考虑到 /tmp 的性质是临时性的,最可靠的方法可能是将需要持久化的数据存放在其他地方,比如用户的主目录、/var 或者专门为此目的创建的其他目录。然后,如果需要,可以通过符号链接(symlink)从 /tmp 指向实际的位置。
例如,创建一个持久化目录 /var/my_persistent_data 并建立一个符号链接到 /tmp:

sudo mkdir -p /var/my_persistent_data
sudo ln -s /var/my_persistent_data /tmp/my_persistent_dir
这样,即使 /tmp 被清理,实际的数据仍然安全地保存在 /var/my_persistent_data 中。
注意事项
重启后:请注意,某些发行版会在重启时清理 /tmp。如果系统有这种行为,那么上述方法可能无法保证重启后的持久性。
安全性:考虑是否真的有必要在 /tmp 中保留持久数据,因为这可能会带来安全风险。通常 /tmp 应该用于真正临时的数据,而长期存储应该选择更合适的位置。
在实施这些更改之前,需要了解它们对系统的影响,并根据实际情况调整策略。


参考:man:tmpfiles.d(5) man:systemd-tmpfiles(8)

发表评论
博客分类