Tmpfs¶
Tmpfs是一個檔案系統,它將其所有檔案儲存在虛擬記憶體中。
tmpfs中的所有內容都是臨時的,因為不會在硬碟驅動器上建立任何檔案。如果解除安裝 tmpfs 例項,則其中儲存的所有內容都將丟失。
tmpfs將所有內容放入核心內部快取中,並會擴充套件和縮小以適應它包含的檔案,並且如果為 tmpfs 掛載啟用了交換,則能夠將不需要的頁面交換到交換空間。 tmpfs 也支援 THP。
tmpfs 擴充套件了 ramfs,並提供了一些使用者空間可配置的選項,這些選項在下面列出和進一步解釋,其中一些選項可以使用檔案系統的重新掛載(‘mount -o remount ...’)動態地重新配置。 tmpfs 檔案系統可以調整大小,但不能調整到低於其當前使用量的大小。 tmpfs 還支援 POSIX ACL 以及 trusted.*、security.* 和 user.* 名稱空間的擴充套件屬性。 ramfs 不使用交換,並且無法修改 ramfs 檔案系統的任何引數。 ramfs 檔案系統的大小限制取決於可用的記憶體量,因此如果使用 ramfs,必須小心不要耗盡記憶體。
tmpfs 和 ramfs 的替代方案是使用 brd 建立 RAM 磁碟 (/dev/ram*),這允許在物理 RAM 中模擬塊裝置磁碟。 要寫入資料,只需在此 ramdisk 之上建立一個常規檔案系統即可。 與 ramfs 一樣,brd ramdisks 無法交換。 brd ramdisks 也在初始化時配置大小,並且無法動態調整其大小。 與 brd ramdisks 相反,tmpfs 有其自己的檔案系統,它根本不依賴於塊層。
由於 tmpfs 完全位於頁面快取中,並且可以選擇位於交換空間上,因此所有 tmpfs 頁面都將顯示為 /proc/meminfo 中的“Shmem”和 free(1) 中的“Shared”。 請注意,這些計數器還包括共享記憶體(shmem,參見 ipcs(1))。 獲取計數的更可靠方法是使用 df(1) 和 du(1)。
tmpfs 具有以下用途
始終存在一個核心內部掛載點,您根本看不到它。 這用於共享匿名對映和 SYSV 共享記憶體。
此掛載點不依賴於 CONFIG_TMPFS。 如果未設定 CONFIG_TMPFS,則不會構建 tmpfs 的使用者可見部分。 但是內部機制始終存在。
glibc 2.2 及更高版本期望 tmpfs 掛載在 /dev/shm 上,以用於 POSIX 共享記憶體(shm_open、shm_unlink)。 將以下行新增到 /etc/fstab 應該可以解決此問題
tmpfs /dev/shm tmpfs defaults 0 0
請記住建立您打算在 tmpfs 上掛載的目錄(如果需要)。
SYSV 共享記憶體_不需要_此掛載。 內部掛載用於此目的。 (在 2.3 核心版本中,必須掛載 tmpfs 的前身 (shm fs) 才能使用 SYSV 共享記憶體。)
有些人(包括我)發現將其掛載在 /tmp 和 /var/tmp 上非常方便,並且擁有一個大的交換分割槽。 現在 tmpfs 檔案的迴圈掛載可以工作,因此大多數發行版附帶的 mkinitrd 應該可以成功使用 tmpfs /tmp。
可能還有更多我不知道的 :-)
tmpfs 具有三個用於調整大小的掛載選項
size |
此 tmpfs 例項的已分配位元組數的限制。 預設值為物理 RAM 的一半(不包括交換)。 如果 tmpfs 例項過大,則機器將死鎖,因為 OOM 處理程式將無法釋放該記憶體。 |
nr_blocks |
與 size 相同,但以 PAGE_SIZE 的塊為單位。 |
nr_inodes |
此例項的最大 inode 數。 預設值為物理 RAM 頁數的一半,或者(在具有高記憶體的計算機上)低記憶體 RAM 頁數,以較低者為準。 |
這些引數接受字尾 k、m 或 g 分別表示千兆、兆兆和吉兆,並且可以在重新掛載時更改。 size 引數也接受字尾 %,以將此 tmpfs 例項限制為物理 RAM 的該百分比:當未指定 size 或 nr_blocks 時,預設值為 size=50%
如果 nr_blocks=0(或 size=0),則該例項中的塊將不受限制; 如果 nr_inodes=0,則 inode 將不受限制。 通常,使用此類選項進行掛載是不明智的,因為它允許任何具有寫入訪問許可權的使用者耗盡計算機上的所有記憶體; 但可以增強在大量 CPU 的系統中的該例項的可伸縮性,從而密集地使用它。
如果 nr_inodes 不為 0,則用於 inode 的有限空間也會被擴充套件屬性佔用:“df -i“‘s IUsed 和 IUse% 增加,IFree 減少。
當記憶體短缺時,tmpfs 塊可能會被交換出去。 tmpfs 具有停用其使用交換的掛載選項
noswap |
停用交換。 重新掛載必須尊重原始設定。 預設情況下,啟用交換。 |
tmpfs 還支援透明巨頁,這需要使用 CONFIG_TRANSPARENT_HUGEPAGE 配置的核心,並且您的系統支援巨頁 (has_transparent_hugepage(),這是特定於體系結構的)。為此的掛載選項是
huge=never |
不要分配巨頁。 這是預設值。 |
huge=always |
每次需要新頁面時,嘗試分配巨頁。 |
huge=within_size |
僅當巨頁完全位於 i_size 內時才分配巨頁。 還要尊重 madvise(2) 提示。 |
huge=advise |
僅當使用 madvise(2) 請求時才分配巨頁。 |
另請參見 透明巨頁支援,其中描述了 sysfs 檔案 /sys/kernel/mm/transparent_hugepage/shmem_enabled:它可用於在緊急情況下拒絕所有 tmpfs 掛載上的巨頁,或強制在所有 tmpfs 掛載上使用巨頁進行測試。
tmpfs 還支援帶有以下掛載選項的配額
quota |
使用者和組配額記帳和強制在此掛載上啟用。 Tmpfs 正在使用在掛載時初始化的隱藏系統配額檔案。 |
usrquota |
使用者配額記帳和強制在此掛載上啟用。 |
grpquota |
組配額記帳和強制在此掛載上啟用。 |
usrquota_block_hardlimit |
設定全域性使用者配額塊硬限制。 |
usrquota_inode_hardlimit |
設定全域性使用者配額 inode 硬限制。 |
grpquota_block_hardlimit |
設定全域性組配額塊硬限制。 |
grpquota_inode_hardlimit |
設定全域性組配額 inode 硬限制。 |
所有與配額相關的掛載選項都不能在重新掛載時設定或更改。
配額限制引數接受字尾 k、m 或 g 分別表示千兆、兆兆和吉兆,並且無法在重新掛載時更改。 預設全域性配額限制對任何和所有使用者/組/專案(root 除外)生效,前提是首次訪問使用者/組/專案 ID 的配額條目 - 通常是在掛載後首次建立具有特定 ID 所有權的 inode。 換句話說,限制不會初始化為零,而是使用這些掛載選項提供的特定值初始化。 可以隨時為任何使用者/組 ID 更改限制,就像通常可以一樣。
請注意,tmpfs 配額不支援使用者名稱空間,因此如果在使用者名稱空間內啟用了配額,則不會進行 uid/gid 轉換。
tmpfs 具有一個掛載選項,用於為此例項中的所有檔案設定 NUMA 記憶體分配策略(如果啟用了 CONFIG_NUMA) - 可以透過 ‘mount -o remount ...’ 動態調整
mpol=default |
使用程序分配策略(參見 set_mempolicy(2)) |
mpol=prefer:Node |
首選從給定的節點分配記憶體 |
mpol=bind:NodeList |
僅從 NodeList 中的節點分配記憶體 |
mpol=interleave |
首選依次從每個節點分配 |
mpol=interleave:NodeList |
依次從 NodeList 的每個節點分配 |
mpol=local |
首選從本地節點分配記憶體 |
NodeList 格式是以逗號分隔的十進位制數字和範圍的列表,範圍是兩個以連字元分隔的十進位制數字,範圍中最小和最大的節點編號。 例如,mpol=bind:0-3,5,7,9-15
具有有效 NodeList 的記憶體策略將被儲存,如指定的那樣,以供檔案建立時使用。 當任務在檔案系統中分配檔案時,掛載選項記憶體策略將應用於具有 NodeList 的檔案,如果有的話,則由呼叫任務的 cpuset 約束脩改[參見CPUSETS] 和任何可選標誌(如下所列)。 如果生成的 NodeLists 為空集,則檔案的有效記憶體策略將恢復為“default”策略。
NUMA 記憶體分配策略具有可選標誌,這些標誌可以與其模式結合使用。 這些可選標誌可以在掛載 tmpfs 時指定,方法是在 NodeList 之前將其附加到模式。 有關所有可用記憶體分配策略模式標誌及其對記憶體策略的影響的列表,請參見 NUMA 記憶體策略。
=static is equivalent to MPOL_F_STATIC_NODES
=relative is equivalent to MPOL_F_RELATIVE_NODES
例如,mpol=bind=static:NodeList 等效於 MPOL_BIND | MPOL_F_STATIC_NODES 的分配策略。
請注意,如果執行的核心不支援 NUMA,嘗試使用 mpol 選項掛載 tmpfs 將會失敗; 並且如果其節點列表指定了不線上的節點,則也會失敗。 如果您的系統依賴於該 tmpfs 的掛載,但有時執行未構建 NUMA 功能的核心(可能是一個安全的恢復核心),或者線上節點更少,則建議從自動掛載選項中省略 mpol 選項。 可以稍後透過 ‘mount -o remount,mpol=Policy:NodeList MountPoint’ 在 tmpfs 已經掛載到 MountPoint 上時新增它。
要指定初始根目錄,您可以使用以下掛載選項
mode |
作為八進位制數的許可權 |
uid |
使用者 ID |
gid |
組 ID |
這些選項對重新掛載沒有任何影響。 您可以使用 chmod(1)、chown(1) 和 chgrp(1) 在已掛載的檔案系統上更改這些引數。
tmpfs 具有一個掛載選項,用於選擇它將在 32 位還是 64 位 inode 號上換行
inode64 |
使用 64 位 inode 號 |
inode32 |
使用 32 位 inode 號 |
在 32 位核心上,inode32 是隱式的,並且在掛載時拒絕 inode64。 在 64 位核心上,CONFIG_TMPFS_INODE64 設定預設值。 inode64 避免了單個裝置上具有相同 inode 號的多個檔案的可能性; 但存在 glibc 在達到 33 位 inode 號後失敗並出現 EOVERFLOW 的風險 - 如果一個長期存在的 tmpfs 被 32 位應用程式訪問,這些應用程式非常古老,以至於開啟大於 2GiB 的檔案會失敗並出現 EINVAL。
因此,‘mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs’ 將在 /mytmpfs 上為您提供 tmpfs 例項,該例項可以在 10240 個 inode 中分配 10GB RAM/SWAP,並且只有 root 可以訪問它。
tmpfs 具有以下用於不區分大小寫查詢支援的掛載選項
casefold |
使用給定的引數作為編碼標準在此掛載點啟用 casefold 支援。 目前僅支援 UTF-8 編碼。 如果沒有使用引數,它將載入最新的可用 UTF-8 編碼。 |
strict_encoding |
在此掛載點啟用嚴格編碼(預設情況下停用)。 在此模式下,檔案系統拒絕建立包含無效 UTF-8 字元名稱的檔案和目錄。 |
此選項不會使整個檔案系統不區分大小寫。 仍然需要透過翻轉空目錄中的 +F 屬性來為每個目錄設定 casefold 標誌。 儘管如此,新目錄將繼承該屬性。 掛載點本身不能設定為不區分大小寫。
示例
$ mount -t tmpfs -o casefold=utf8-12.1.0,strict_encoding fs_name /mytmpfs
$ mount -t tmpfs -o casefold fs_name /mytmpfs
- 作者:
Christoph Rohland <cr@sap.com>, 1.12.01
- 更新:
Hugh Dickins, 4 June 2007
- 更新:
KOSAKI Motohiro, 16 Mar 2010
- 更新:
Chris Down, 13 July 2020
- 更新:
André Almeida, 23 Aug 2024