跳转至内容

tmpfs

来自 ArchWiki

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

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

用法

一些常用于 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 共享内存。tmpfs 挂载在 /dev/shmsystemd 自动处理,不需要在 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) man 手册页和 Security#File systems

重启以使更改生效。请注意,虽然尝试运行 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。要禁用自动挂载,请 mask 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

故障排除

考虑到 /tmp 使用 tmpfs,请将当前目录更改为 /tmp,然后创建一个文件,并在同一 /tmp 目录中创建该文件的符号链接。由于 /tmp 设置了 sticky bit,尝试读取符号链接时会遇到“权限被拒绝”错误。

此行为可以通过 /proc/sys/fs/protected_symlinks 控制,或通过 sysctl:sysctl -w fs.protected_symlinks=0。要使其永久生效,请参阅 Sysctl#Configuration

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

技巧与提示

分配更多内存以适应 /run/user/xxxx 中的配置文件

控制 /run/user/ 中 tmpfs 大小的标准方法是使用 /etc/systemd/logind.conf 中的 RuntimeDirectorySize 指令(更多信息请参阅 logind.conf(5))。默认情况下,使用物理内存的 10%,但可以安全地增加它。请记住,tmpfs 只消耗实际使用的部分;此处指定的数字仅为允许的最大值。

参见