tmpfs

出自 ArchWiki
(重定向自 Ramdisk

tmpfs 是一个临时文件系统,驻留在内存和/或交换分区中。将目录挂载为 tmpfs 可以有效地加速对其文件的访问,或确保其内容在重启时自动清除。

提示: tmpfs 目录中的临时文件可以在启动时使用 systemd-tmpfiles 重新创建。

用法

通常使用 tmpfs(5) 的一些目录是 /tmp/var/lock/var/run不要/var/tmp 上使用它,因为该目录旨在用于跨重启保留的临时文件。

Arch 使用 tmpfs /run 目录,其中 /var/run/var/lock 仅作为符号链接存在以实现兼容性。默认的 systemd 设置也将其用于 /tmp,除非需要特定的配置,否则不需要在 fstab 中添加条目。

glibc 2.2 及更高版本期望 tmpfs 挂载在 /dev/shm 以用于 POSIX 共享内存。在 /dev/shm 挂载 tmpfs 由 systemd 自动处理,无需在 fstab 中手动配置。

通常,运行频繁读/写操作的任务和程序可以从使用 tmpfs 目录中获益。某些应用程序甚至可以通过将其部分(或全部)数据卸载到共享内存来获得显着提升。例如,将 Firefox 配置文件迁移到 RAM 中 显示出性能的显着提升。

示例

注意: 实际的内存/交换空间消耗取决于实际使用量,因为 tmpfs 分区在实际需要之前不会消耗任何内存。

默认情况下,tmpfs 分区的最大大小设置为可用 RAM 的一半,但是可以覆盖此值。要显式设置最大大小,在本例中覆盖默认的 /tmp 挂载,请使用 size 挂载选项

/etc/fstab
tmpfs   /tmp         tmpfs   rw,nodev,nosuid,size=2G          0  0

要指定更安全的挂载,请指定以下挂载选项

/etc/fstab
tmpfs   /www/cache    tmpfs  rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=user,gid=group,mode=1700 0 0

有关更多信息,请参阅 tmpfs(5) 手册页和 Security#文件系统

重启以使更改生效。请注意,虽然简单地运行 mount -a 以使更改立即生效可能很诱人,但这将使当前位于这些目录中的任何文件都无法访问(例如,对于带有锁文件的正在运行的程序来说,这尤其成问题)。但是,如果它们都是空的,则运行 mount -a 而不是重启(或单独挂载它们)应该是安全的。

应用更改后,通过查看 /proc/mounts 和使用 findmnt 验证它们是否生效

$ findmnt /tmp
TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw,nosuid,nodev,relatime

tmpfs 也可以临时调整大小,而无需重启,例如当需要尽快运行大型编译作业时。在这种情况下,运行

# mount -o remount,size=4G /tmp

或基于 RAM 调整大小

# mount -o remount,size=80% /tmp

禁用自动挂载

systemd 下,如果 /tmp 尚未是 /etc/fstab 中的专用挂载点(tmpfs 或磁盘上),则会自动挂载为 tmpfs。要禁用自动挂载,屏蔽 tmp.mount systemd 单元。

文件将不再存储在 tmpfs 中,而是存储在块设备上。/tmp 内容现在将在重启之间保留(但仍会在 10 天后清除),这可能不是期望的行为。要恢复以前的行为并在重启时自动清理 /tmp 目录,请考虑使用 tmpfiles.d(5)

/etc/tmpfiles.d/tmp.conf
# see tmpfiles.d(5)
# always enable /tmp directory cleaning
D! /tmp 1777 root root 0

# remove files in /var/tmp older than 10 days
D /var/tmp 1777 root root 10d

# namespace mountpoints (PrivateTmp=yes) are excluded from removal
x /tmp/systemd-private-*
x /var/tmp/systemd-private-*
X /tmp/systemd-private-*/tmp
X /var/tmp/systemd-private-*/tmp

故障排除

以 root 身份打开 tmpfs 中的符号链接失败

考虑到 /tmp 正在使用 tmpfs,将当前目录更改为 /tmp,然后在同一个 /tmp 目录中创建一个文件并创建一个指向该文件的符号链接。当尝试读取符号链接时,由于 /tmp 设置了粘滞位,因此预期会出现权限被拒绝错误。

此行为可以通过 /proc/sys/fs/protected_symlinks 或直接通过 sysctl 控制:sysctl -w fs.protected_symlinks=0。请参阅 Sysctl#配置 使此设置永久生效。

警告: 更改此行为可能会导致安全问题!

参见