tmpfs
tmpfs 是一个临时文件系统,驻留在内存和/或交换分区中。将目录挂载为 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 共享内存。在 /dev/shm
挂载 tmpfs 由 systemd 自动处理,无需在 fstab 中手动配置。
通常,运行频繁读/写操作的任务和程序可以从使用 tmpfs 目录中获益。某些应用程序甚至可以通过将其部分(或全部)数据卸载到共享内存来获得显着提升。例如,将 Firefox 配置文件迁移到 RAM 中 显示出性能的显着提升。
示例
默认情况下,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#配置 使此设置永久生效。