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

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

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

当他复制文件时(实际上,这是别人,不是我!),他没有使用,-a因此下面每个文件的所有者/new/tmp都是root.此外,他没有设置/new/tmp目录的权限,因此它是默认的0755。这导致了无穷无尽的麻烦,甚至调整模式和所有权位也无法将机器恢复到可接受的工作状态。我最终不得不把所有东西都炸掉/tmp然后重新启动。

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

有没有安全的如何将/tmp目录移动到正在运行的系统上的不同卷?我不确定我实际上会做什么来让一切正常运转。我特别好奇管道和插座会发生什么。

答案1

在“客户端”计算机上,安全的移动方法/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熔断器: unionfs-fuse /tmp.new:/.root.only/tmp /tmp

如果您不想转到联合挂载根目录(例如,因为它在您的平台上不可用,或者因为它太麻烦),至少不要删除旧目录。移动,这样正在运行的程序将继续使用旧目录,而新程序将使用新目录。 (当然,新程序将无法通过套接字或管道与旧程序进行通信,/tmp除非您设置TMPDIR或以其他方式告诉它们要查找的位置。)

mv /tmp /tmp.old && mkdir /tmp

相关内容