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

Dan*_*Dan 107 filesystem fstab tmpfs

看到后评论通过匿名的问题/ 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/
Run Code Online (Sandbox Code Playgroud)

但据我所知,这不会是一个永久的解决方案。如果我需要它是永久性的,则必须将其添加到/etc/fstab配置文件中。

如果这是正确的解决方案,我如何将该挂载命令转换为/etc/fstab.

Fuz*_*zyQ 92

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

tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=512M 0 0
Run Code Online (Sandbox Code Playgroud)

请注意:

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默认情况下该文件夹及其子文件夹已经安装。

  • 如果我没有弄错,/var/tmp/ 用于在重新启动后保留文件。这是这个和 /tmp/ 之间的主要区别,所以你不应该将 /var/tmp 移动到 ram。 (14认同)
  • @matt 这只是一个上限。 (11认同)
  • 将一半的 RAM 分配给这是否意味着一半的 RAM 是为 RAMDISK 保留的,还是只是 RAMDISK 可能消耗的上限,而没有使用的是空闲 RAM,它会分配给任何需要 RAM 的程序? (9认同)
  • 如果 Ubuntu 用完了 4GB tmpfs,它会使用我的 20GB SWAP 分区吗? (4认同)
  • 是的,我也需要添加这个。一旦 tmpfs 超出其限制,它就会扩展到交换分区(假设有一个)。 (4认同)
  • 我也会添加 `nodev` 选项。 (2认同)
  • 您可以使用“fatrace”来查看到底有多少 tmp 活动,以及这是否值得。 (2认同)
  • 添加 `noexec` 导致我的 [netbeans 8.1 安装失败](https://askubuntu.com/questions/694188/unable-to-install-netbeans-8-1)。我默认情况下 /tmp 确实允许 exec 吗? (2认同)
  • 问:为什么要添加```defaults``` 选项?如果它被省略,我会假设......无论如何都会使用 ```default``` 选项吗? (2认同)

小智 51

在使用 的系统上systemd,您可以选择使用 systemd 单元文件而不是 fstab 来实现使用tmpfs挂载的目标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
Run Code Online (Sandbox Code Playgroud)

该文件/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
Run Code Online (Sandbox Code Playgroud)

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

为了按照要求设置 RAM 的最大限制,需要添加size=512MOptions行中,用逗号分隔。

  • @Rick,最好使用与发行版无关的`systemctl edit tmp.mount`。这会将您的更改放入 override.conf 以便您不会更改默认 tmp.mount 并且您可以轻松删除 override.conf 以返回默认配置。 (6认同)
  • 在 cp 之后,您将需要 `systemctl enable tmp.mount`,否则 systemctl 将失败并显示消息“`Failed to start tmp.mount: Unit tmp.mount not found.`” (2认同)
  • 同上 Bulat 关于使用 systemctl edit 所说的内容,并在第一步中使用 `ln -s` 而不是 `cp`。 (2认同)