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#配置來永久更改這個行為。

警告: 更改這一行為可能會導致安全問題!

另請參閱[編輯 | 編輯原始碼]