今天,/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 上执行此操作的一种方法。
/tmp
除了一些手动选择的大文件之外,保留所有现有文件。- 创建一个
/tmp.new
(模式1777)。 - 暴露
/tmp
在不同的路径上:mount --bind / /.root.only
.这是必要的,因为下一步将产生阴影/tmp
。可能有不同的联合安装实现不需要此步骤。 /.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