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