我已经这样tmp
配置:/etc/fstab
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 2
问题是,现在/tmp
仅限于机器内存的一半,当达到该限制时,我会收到“设备上没有剩余空间”错误。
我想让它“无限”,即增长到磁盘的大小。
答案1
我的印象是您对 . 存在一些误解tmpfs
。您可能会发现阅读以下内容很有用内核文档关于主题;我将尝试在这里为您澄清一些事情。
您的问题的标题“tmpfs
不会溢出交换”似乎并没有反映您问题的实际内容,但无论如何tmpfs
都使用交换,尽管可以说它不会溢出交换。tmpfs
本质上是一个基于(虚拟)内存的文件系统;它的内容仅存在于内存中,但由于它们是可交换的,因此内核可以在必要时将它们存储在交换中而不是物理内存中。尽管如此,tmpfs
文件系统不能大于可用虚拟内存的总量,IE物理 RAM 和交换区,如图所示例如经过free -h
。
默认情况下,tmpfs
文件系统的最大大小等于可用物理内存量的一半。您可以使用参数增加此size
值,但同样,它永远不能超过可用的物理内存和交换(尽管在安装时不会强制执行该限制)。一旦文件系统达到其最大大小(或者更确切地说,包含占用那么多空间的文件),它就会报告空间不足,正如您所发现的那样。tmpfs
当空间不足时,它本身不支持在任何地方溢出。
如果您需要临时存储大文件的空间,则应该使用/var/tmp
而不是/tmp
.您确实不想要一个非常大的tmpfs
文件系统,当它填满时,这会导致灾难(内核恢复内存的常用方法在 a 中不起作用tmpfs
)。
(当然,如果您有大量 RAM,则大容量tmpfs
也可以。我运行了一些系统,其构建tmpfs
文件系统的大小为 RAM 的 75%,大小为 32GiB、64GiB 甚至更多。)
答案2
你可以使用类似的东西奥夫斯。它允许您将两个不同的安装“合并”到一个目录中。因此,在这种情况下,您可以在某处安装 tmpfs 卷,并在磁盘上安装常规目录,然后使用 aufs as 统一它们/tmp
。您甚至可以分配优先级,因此将首先使用 tmpfs,只有当 tmpfs 空间不足时才会使用磁盘。
但这并不是一个完美的解决方案,因为 aufs 是按文件工作的。因此,如果某个进程创建的文件开始缓慢增长超过 tmpfs 大小,则当 tmpfs 已满时,它不会“切换”卷。它只会出现空间不足的情况(或者一些通用的 I/O 错误,因为从技术上讲, 中仍然留有空间/tmp
)。但在很多情况下,它可能会发挥/tmp
在内存中的作用,当它增长太多时,就会回退到磁盘。