在“客户端”计算机上,安全的移动方法/tmp
是重新启动。在这里,所谓客户端,是指运行将套接字放入的程序的任何程序,/tmp
尤其是X服务器和屏幕。
新的/tmp
肯定需要具有正确的权限(1777),否则您就无法希望拥有一个正常运行的系统。
对于/tmp
,您几乎无法复制任何文件。这是因为在大多数情况下,将内容放入/tmp
文件中的程序会打开。如果复制文件,则复制内容,但是程序仍会打开旧文件。您也许可以使用调试器(ptrace
)来访问它们,但是这比重新启动要复杂得多,并且对于许多程序而言,无论如何,它们都会使它们崩溃。
如果您/tmp
的电脑已满,并且要切换到新的状态,则需要重新启动所有打开了文件的程序。由于这意味着要重新启动X和屏幕会话,因此它并不比重新启动更好。
您应该能够切换到新程序,但可以通过使用联合安装将现有的打开文件保留在原位。(原理是合理的,但是我从未尝试过,因此可能存在我无法预料的问题。)这是在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