tmpfs - Arch Linux 中文维基

跳至內容

# tmpfs

出自 Arch Linux 中文维基

翻譯狀態：

- 本文（或部分內容）譯自 Tmpfs，最近一次同步於 2025-10-27，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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 的目錄中獲益。某些應用甚至可以通過將部分或是全部數據放至共享內存以獲得巨大的性能提升，例如可以把 Firefox 的用戶資料放在內存中來大幅提升性能。

## 例子

注意：真正的內存/交換區消耗依實際使用而定，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

或基於 RAM 重新調整大小：

    # mount -o remount,size=80% /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#配置來永久更改這個行為。

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

## 提示與技巧

### 為 /run/user/xxxx 分配更多內存

控制 `/run/user/` 中 tmpfs 大小的標準方法是通過修改 `/etc/systemd/logind.conf` 中的 `RuntimeDirectorySize` （詳見 logind.conf(5)）。默認大小為物理內存的 10%，但可以安全地增加此值。需要記住的是，tmpfs 僅占用已實際使用的空間，此處指定的數值只是允許的最大值。

## 另請參閱

- Linux 內核文檔

分類：​

- 文件系統

tmpfs
新增話題