tmpfs
tmpfs 是一个停留在内存与/或交换分区的临时文件系统。把目录挂载为 tmpfs 是一个加速文件访问或是确保内容重启自动清除的有效手段。
用法[编辑 | 编辑源代码]
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 分区的默认最大容量是可用内存的一半,不过这是可以修改的。若需要显式地设定最大容量,使用 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 还是储存设备)。如果想禁用自动挂载,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
故障排除[编辑 | 编辑源代码]
作为 root 在 tmpfs 中打开符号链接失败[编辑 | 编辑源代码]
假设 /tmp
正在使用 tmpfs,首先更改当前工作目录到 /tmp
,然后在这个 /tmp
目录下创建一个文件以及指向这个文件的符号连接。root 在读取这个符号链接时会遇到“权限不够”的错误,这是因为 /tmp
设置了黏滞位。
这个行为可以通过 /proc/sys/fs/protected_symlinks
控制,或是直接使用 sysctl:sysctl -w fs.protected_symlinks=0
。参阅 Sysctl#配置来永久更改这个行为。