如何为/ tmp目录使用RAM存储以及如何为其设置最大RAM使用量?


92

在看到Anonymous对问题的评论后如何清理/ tmp目录?,我发现在我的系统上实现这是个好主意,因为我有16GB的RAM,而我从未使用过全部。

我的临时文件永远不会写入磁盘。它们被写入RAM磁盘。我确实放tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0了/ etc / fstab。

我的问题是:

我可以设置RAM使用的最大值/tmp吗?在那种情况下,如果超过最大数量会发生什么,它将写入硬盘驱动器吗?

我已经阅读了一个解决方案,其中指出:

mkdir -p /tmp/ram
sudo mount -t tmpfs -o size=512M tmpfs /tmp/ram/

但是据我了解,这将不是永久的解决方案。如果需要永久使用,则必须将其添加到/etc/fstab配置文件中。

如果这是正确的解决方案,如何将安装命令转换为in中的一行/etc/fstab


如果您拥有SSD,这也是一个好主意,因为您不会以没有用处的文字来“消费”它
Postadelmaga 2014年

哈哈,同样的问题也把我带到这里:D
Teddy Markov

Answers:


80

你是绝对正确的。相应的fstab条目如下所示:

tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=512M 0 0

请注意:

由于tmpfs被填满时,它会表现为通过提供一个“没有足够的空间”错误的任何物理硬盘驱动器。重启(从而清空缓存)可以解决此问题,但是当一个操作开始时占用的空间多于上的空间时,您可能会遇到麻烦tmpfs。在这种情况下,您的计算机将开始从ram交换到磁盘,这将使您的系统停止运行,当然,前提是您首先要有一个交换分区。

考虑到这一点,由于现代计算机中存在更多的内存并且价格变得便宜得多,因此,如今的512MB大小可能远远不够。由于您已经拥有16GB的内存,因此使用tmpfs几乎一半内存的默认值应足以满足几乎所有情况。要使用默认值,只需size=512M/etc/fstab文件中省略该条目即可。

另一个注意事项:

您也可以轻松地将其他系统文件夹挂载到ramdisk中,例如

/var/cache

/var/games

/var/log/apt(仅在defaults,noatime不使用mode=或的情况下使用nosuid

但请注意:上述规则同样适用,空间不足可能会造成严重麻烦。例如,假设/ var / log / apt空间不足,将使您无法安装任何程序!此外,将/var/log文件夹加载到ramdisk中将在重新引导后删除所有日志文件,因此,如果发生任何意外情况,您将无法调试系统。因此,使用这些设置需要您自担风险!

编者注:由于默认情况下已经安装了此文件夹及其子文件夹,因此 我删除了/runin tmpfsmount选项tmpfs


11
如果我没有记错的话,/ var / tmp /用于重新启动后保留文件。那就是this和/ tmp /之间的主要区别,所以您不应该将/ var / tmp移到ram上。

3
如果Ubuntu用尽了4GB tmpfs,它将使用我的20GB SWAP分区吗?
loostro

3
是的,我也需要添加它。一旦tmpfs超出其限制,它将扩展到交换分区(给定一个分区)。
FuzzyQ

5
将一半的RAM分配给RAMDISK是不是意味着将一半的RAM保留给RAMDISK,还是RAMDISK可能消耗的上限,而没有使用的是将空闲RAM分配给需要程序的任何RAM?
马特2015年

6
@matt这只是一个上限。
FuzzyQ

35

在使用的系统上systemd,可以选择使用systemd单位文件而不是fstab来实现使用tmpfsmount 的目标tmp。在我的Ubuntu 16.04系统上,我运行了:

sudo cp /usr/share/systemd/tmp.mount /etc/systemd/system/tmp.mount
sudo systemctl enable tmp.mount
sudo systemctl start tmp.mount

该文件/usr/share/systemd/tmp.mount如下所示:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
[Unit]
Description=Temporary Directory
Documentation=man:hier(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target

[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime

[Install]
WantedBy=local-fs.target

使用FuzzyQ的fstab方法,systemd将fstab条目动态转换为装载单元。我认为这两种方法都不是更好。

为了按要求设置RAM的最大限制,需要size=512M在该Options行上添加一个逗号分隔的行。


2
您将需要systemctl enable tmp.mount在cp之后,否则systemctl将失败,并显示消息Failed to start tmp.mount: Unit tmp.mount not found.
vimdude

4
@Rick,最好是使用systemctl edit tmp.mount发行中立的。这会将您所做的更改放入override.conf,这样您就不会更改默认的tmp.mount,并且可以轻松删除override.conf以返回默认配置。
Bulat M.

同上Bulat所说的关于使用systemctl edit的内容,并且在第一步中也使用ln -s而不是cp
迈克尔·格拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.