如何(安全地)将 /tmp 移动到不同的卷?

Gre*_*ill 20 partition permissions

今天,/tmp目录在工作中的机器上填满了。问题是,它在不是很大的根分区上。为了解决这个问题,一位同事在/new/tmp别处创建了一个目录,将所有内容复制到新目录,删除原始目录/tmp并创建符号链接/tmp -> /new/tmp

当他复制文件时(真的,这是别人,不是我!)他没有使用,-a所以下每个文件的所有者/new/tmp都是root. 此外,他没有设置/new/tmp目录的权限,所以它是默认的 0755。这造成了无穷无尽的麻烦,甚至调整模式和所有权位也未能将机器恢复到可接受的工作状态。我最终不得不核对所有内容/tmp并重新启动。

/tmp目录包含各种套接字和管道等等,因为一群人通过 VNC 运行 Gnome,而我使用screen它有自己的管道。

是否有安全的方法将/tmp目录移动到正在运行的系统上的不同卷?我不确定我实际上会做些什么来保持一切正常工作。我特别好奇管道和套接字会发生什么。

Gil*_*il' 22

在“客户端”机器上,安全的移动方式/tmp是重启。在这里,通过客户端,我的意思是任何运行将套接字放入的程序的东西,/tmp特别是 X 服务器和屏幕。

新的/tmp肯定需要有正确的权限(1777),否则你不能指望有一个工作系统。

对于/tmp,您几乎无法复制任何文件。那是因为大多数情况下,将内容放入的程序会/tmp打开文件。如果您复制文件,则会复制内容,但程序仍会打开旧文件。您也许可以使用调试器 ( ptrace)访问它们,但这比重新启动要复杂得多,而且对于许多程序,无论如何您要做的就是使它们崩溃。

如果您/tmp已满并且您想切换到一个新的现场直播,您需要重新启动所有在那里打开文件的程序。由于这意味着重新启动 X 和 screen 会话,因此它并不比重新启动好多少。

您应该能够切换新程序,但使用联合挂载将现有打开的文件保留在原位。(原理是合理的,但我从未尝试过,因此可能会出现一些意想不到的问题。)这是在 Linux 上执行此操作的一种方法。

  1. 保留所有现有文件,/tmp除了一些手动选择的大文件。
  2. 创建一个/tmp.new(模式 1777)。
  3. 暴露/tmp在不同的路径上:mount --bind / /.root.only。这是必要的,因为下一步会产生阴影/tmp。可能有不同的联合挂载实现不需要此步骤。
  4. 让工会安装的/.root.only/tmp/tmp.new,安装在/tmp。这样,在 中创建的新文件/tmp将写入 中/tmp.new,但 中的文件/.root.only/tmp也在 下可见/tmp。一种可能性是 unionfs-fuse : unionfs-fuse /tmp.new:/.root.only/tmp /tmp

如果你不想去union mount root(例如因为你的平台上没有它,或者因为太麻烦),至少不要删除旧目录。移动它,以便正在运行的程序将继续使用旧目录,而新程序将使用新目录。(当然,新程序将无法通过套接字或管道与旧程序通信,/tmp除非您设置TMPDIR或以其他方式告诉它们去哪里查找。)

mv /tmp /tmp.old && mkdir /tmp
Run Code Online (Sandbox Code Playgroud)