tmpfs

来自 Arch Linux 中文维基

tmpfs 是一个停留在内存与/或交换分区的临时文件系统。把目录挂载为 tmpfs 是一个加速文件访问或是确保内容重启自动清除的有效手段。

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

用法[编辑 | 编辑源代码]

tmpfs 经常会被使用在/tmp/var/lock 以及 /var/run。请不要把它用在 /var/tmp 上,这个目录是用于跨重启保存的临时文件的。

Arch 对 /run 目录使用 tmpfs,同时存在的 /var/run/var/lock 只是单纯为了维持兼容性的符号链接。在默认的 systemd 配置下,tmpfs 也被用于 /tmp,如果没有特殊需求不需要专门在 fstab 里添加条目。


glibc 2.2 及以上为了 POSIX 共享内存会假定有 tmpfs 被挂载于/dev/shm。这一挂载会由 systemd 自动处理,无需手动配置 fstab

一般来说,需要经常进行读写操作的程序与任务可以从使用 tmpfs 的目录中获益。某些应用甚至可以通过将部分或是全部数据放至共享内存以获得巨大的性能提升,例如可以把火狐的用户资料放在内存中来大幅提升性能。

例子[编辑 | 编辑源代码]

注意: 真正的内存/交换区消耗依实际使用而定,tmpfs 分区在真正需要内存之前不会使用任何内存。

tmpfs 分区的默认最大容量是可用内存的一半,不过这是可以修改的。若需要显式地设定最大容量,使用 size 挂载选项(以下的例子会覆盖默认的 /tmp 挂载):

/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) 手册页和 安全#文件系统 来获取更多信息。

重启以使修改起效。注意虽然直接运行 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

禁用自动挂载[编辑 | 编辑源代码]

systemd 下,/tmp 会被自动挂载为 tmpfs,除非 /tmp/etc/fstab 中一个已经存在的挂载点(不论这个挂载点是 tmpfs 还是储存设备)。如果想禁用自动挂载,masktmp.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 目录下创建一个文件以及指向这个文件的符号连接。root 在读取这个符号链接时会遇到“权限不够”的错误,这是因为 /tmp 设置了黏滞位

这个行为可以通过 /proc/sys/fs/protected_symlinks 控制,或是直接使用 sysctl:sysctl -w fs.protected_symlinks=0。参阅 Sysctl#配置 来永久更改这个行为。

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

另请参阅[编辑 | 编辑源代码]