.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_TW.rst :Original: Documentation/filesystems/tmpfs.rst Translated by Wang Qing <wangqing@vivo.com> and Hu Haowen <src.res.211@gmail.com> ===== Tmpfs ===== Tmpfs是一個將所有文件都ä¿å˜åœ¨è™›æ“¬å…§å˜ä¸çš„文件系統。 tmpfsä¸çš„所有內容都是臨時的,也就是說沒有任何文件會在硬碟上創建。 如果å¸è¼‰tmpfs實例,所有ä¿å˜åœ¨å…¶ä¸çš„文件都會丟失。 tmpfs將所有文件ä¿å˜åœ¨å…§æ ¸ç·©å˜ä¸ï¼Œéš¨è‘—文件內容增長或縮å°å¯ä»¥å°‡ä¸éœ€è¦çš„ é é¢swap出去。它具有最大é™åˆ¶ï¼Œå¯ä»¥é€šéŽã€Œmount -o remount ...ã€èª¿æ•´ã€‚ å’Œramfs(創建tmpfs的模æ¿ï¼‰ç›¸æ¯”,tmpfs包å«äº¤æ›å’Œé™åˆ¶æª¢æŸ¥ã€‚å’Œtmpfsç›¸ä¼¼çš„å¦ ä¸€å€‹æ±è¥¿æ˜¯RAMç£ç¢Ÿï¼ˆ/dev/ram*),å¯ä»¥åœ¨ç‰©ç†RAMä¸æ¨¡æ“¬å›ºå®šå¤§å°çš„硬碟,並在 æ¤ä¹‹ä¸Šå‰µå»ºä¸€å€‹æ™®é€šçš„文件系統。Ramdisks無法swapï¼Œå› æ¤ç„¡æ³•èª¿æ•´å®ƒå€‘的大å°ã€‚ 由於tmpfs完全ä¿å˜æ–¼é é¢ç·©å˜å’Œswapä¸ï¼Œå› æ¤æ‰€æœ‰tmpfsé é¢å°‡åœ¨/proc/meminfo ä¸é¡¯ç¤ºçˆ²ã€ŒShmemã€ï¼Œè€Œåœ¨free(1)ä¸é¡¯ç¤ºçˆ²ã€ŒSharedã€ã€‚請注æ„,這些計數還包括 共享內å˜(shmem,請åƒé–±ipcs(1))。ç²å¾—計數的最å¯é 方法是使用df(1)å’Œdu(1)。 tmpfs具有以下用途: 1) å…§æ ¸ç¸½æœ‰ä¸€å€‹ç„¡æ³•çœ‹åˆ°çš„å…§éƒ¨æŽ›è¼‰ï¼Œç”¨æ–¼å…±äº«åŒ¿åæ˜ å°„å’ŒSYSV共享內å˜ã€‚ 掛載ä¸ä¾è³´æ–¼CONFIG_TMPFS。如果CONFIG_TMPFS未è¨ç½®ï¼Œtmpfså°ç”¨æˆ¶ä¸å¯è¦‹ã€‚ 但是內部機制始終å˜åœ¨ã€‚ 2) 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共享內å˜) 3) 很多人(包括我)都覺的在/tmpå’Œ/var/tmp上掛載éžå¸¸æ–¹ä¾¿ï¼Œä¸¦å…·æœ‰è¼ƒå¤§çš„ swap分å€ã€‚ç›®å‰å¾ªç’°æŽ›è¼‰tmpfså¯ä»¥æ£å¸¸å·¥ä½œï¼Œæ‰€ä»¥å¤§å¤šæ•¸ç™¼å¸ƒéƒ½æ‡‰ç•¶å¯ä»¥ 使用mkinitrd通éŽ/tmp訪å•/tmp。 4) 也許還有更多我ä¸çŸ¥é“的地方:-) tmpfs有三個用於調整大å°çš„掛載é¸é …: ========= =========================================================== size tmpfs實例分é…çš„å—節數é™åˆ¶ã€‚默èªå€¼æ˜¯ä¸swap時物ç†RAM的一åŠã€‚ 如果tmpfs實例éŽå¤§ï¼Œæ©Ÿå™¨å°‡æ»éŽ–ï¼Œå› çˆ²OOM處ç†å°‡ç„¡æ³•é‡‹æ”¾è©²å…§å˜ã€‚ nr_blocks 與size相åŒï¼Œä½†ä»¥PAGE_SIZE爲單ä½ã€‚ nr_inodes tmpfs實例的最大inode個數。默èªå€¼æ˜¯ç‰©ç†å…§å˜é 數的一åŠï¼Œæˆ–者 (有高端內å˜çš„機器)低端內å˜RAMçš„é 數,二者以較低者為準。 ========= =========================================================== 這些åƒæ•¸æŽ¥å—後綴k,m或g表示åƒï¼Œå…†å’Œåƒå…†å—節,å¯ä»¥åœ¨remount時更改。 sizeåƒæ•¸ä¹ŸæŽ¥å—後綴%用來é™åˆ¶tmpfs實例å 用物ç†RAM的百分比: 未指定size或nr_blocks時,默èªå€¼çˆ²size=50ï¼… 如果nr_blocks=0(或size=0),block個數將ä¸å—é™åˆ¶ï¼›å¦‚æžœnr_inodes=0, inode個數將ä¸å—é™åˆ¶ã€‚這樣掛載通常是ä¸æ˜Žæ™ºçš„ï¼Œå› çˆ²å®ƒå…許任何具有寫權é™çš„ 用戶通éŽè¨ªå•tmpfs耗盡機器上的所有內å˜ï¼›ä½†åŒæ™‚這樣åšä¹Ÿæœƒå¢žå¼·åœ¨å¤šå€‹CPUçš„ å ´æ™¯ä¸‹çš„è¨ªå•ã€‚ tmpfs具有爲所有文件è¨ç½®NUMAå…§å˜åˆ†é…ç–略掛載é¸é …(如果啓用了CONFIG_NUMA), å¯ä»¥é€šéŽã€Œmount -o remount ...ã€èª¿æ•´ ======================== ========================= mpol=default 採用進程分é…ç–ç•¥ (è«‹åƒé–± set_mempolicy(2)) mpol=prefer:Node 傾å‘å¾žçµ¦å®šçš„ç¯€é»žåˆ†é… mpol=bind:NodeList åªå…許從指定的éŠè¡¨åˆ†é… mpol=interleave 傾å‘æ–¼ä¾æ¬¡å¾žæ¯å€‹ç¯€é»žåˆ†é… mpol=interleave:NodeList ä¾æ¬¡å¾žæ¯å€‹ç¯€é»žåˆ†é… mpol=local 優先本地節點分é…å…§å˜ ======================== ========================= NodeListæ ¼å¼æ˜¯ä»¥é€—號分隔的å進ä½æ•¸å—表示大å°å’Œç¯„åœï¼Œæœ€å¤§å’Œæœ€å°ç¯„åœæ˜¯ç”¨- 分隔符的å進ä½æ•¸ä¾†è¡¨ç¤ºã€‚例如,mpol=bind0-3,5,7,9-15 帶有有效NodeListçš„å…§å˜ç–ç•¥å°‡æŒ‰æŒ‡å®šæ ¼å¼ä¿å˜ï¼Œåœ¨å‰µå»ºæ–‡ä»¶æ™‚使用。當任務在該 文件系統上創建文件時,會使用到掛載時的內å˜ç–ç•¥NodeListé¸é …,如果è¨ç½®çš„話, 由調用任務的cpuset[è«‹åƒè¦‹Documentation/admin-guide/cgroup-v1/cpusets.rst] 以åŠä¸‹é¢åˆ—出的å¯é¸æ¨™èªŒç´„æŸã€‚如果NodeLists爲è¨ç½®çˆ²ç©ºé›†ï¼Œå‰‡æ–‡ä»¶çš„å…§å˜ç–略將 æ¢å¾©çˆ²ã€Œé»˜èªã€ç–略。 NUMAå…§å˜åˆ†é…ç–略有å¯é¸æ¨™èªŒï¼Œå¯ä»¥ç”¨æ–¼æ¨¡å¼çµåˆã€‚在掛載tmpfs時指定這些å¯é¸ 標誌å¯ä»¥åœ¨NodeList之å‰ç”Ÿæ•ˆã€‚ Documentation/admin-guide/mm/numa_memory_policy.rst列出所有å¯ç”¨çš„å…§å˜ åˆ†é…ç–略模å¼æ¨™èªŒåŠå…¶å°å…§å˜ç–略。 :: =static 相當於 MPOL_F_STATIC_NODES =relative 相當於 MPOL_F_RELATIVE_NODES 例如,mpol=bind=staticNodeList相當於MPOL_BIND|MPOL_F_STATIC_NODES的分é…ç–ç•¥ 請注æ„ï¼Œå¦‚æžœå…§æ ¸ä¸æ”¯æŒNUMA,那麼使用mpolé¸é …掛載tmpfs將會失敗;nodelistæŒ‡å®šä¸ åœ¨ç·šçš„ç¯€é»žä¹Ÿæœƒå¤±æ•—ã€‚å¦‚æžœæ‚¨çš„ç³»çµ±ä¾è³´æ–¼æ¤ï¼Œä½†å…§æ ¸æœƒé‹è¡Œä¸å¸¶NUMA功能(也許是安全 revoceryå…§æ ¸),或者具有較少的節點在線,建è°å¾žè‡ªå‹•æ¨¡å¼ä¸çœç•¥mpolé¸é …掛載é¸é …。 å¯ä»¥åœ¨ä»¥å¾Œé€šéŽã€Œmount -o remount,mpol=Policy:NodeList MountPointã€æ·»åŠ 到掛載點。 è¦æŒ‡å®šåˆå§‹æ ¹ç›®éŒ„,å¯ä»¥ä½¿ç”¨å¦‚下掛載é¸é …: ==== ==================== æ¨¡å¼ æ¬Šé™ç”¨å…«é€²ä½æ•¸å—表示 uid 用戶ID gid 組ID ==== ==================== 這些é¸é …å°remount沒有任何影響。您å¯ä»¥é€šéŽ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編號的文件;比如32ä½æ‡‰ç”¨ç¨‹å¼ä½¿ç”¨glibc如果長期訪å•tmpfs,一旦é”到33 ä½inode編號,就有EOVERFLOW失敗的å±éšªï¼Œç„¡æ³•æ‰“開大於2GiB的文件,並返回EINVAL。 所以'mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs'將在 /mytmpfs上掛載tmpfs實例,分é…åªèƒ½ç”±root用戶訪å•çš„10GB RAM/SWAP,å¯ä»¥æœ‰10240個 inode的實例。 :作者: Christoph Rohland <cr@sap.com>, 1.12.01 :æ›´æ–°: Hugh Dickins, 4 June 2007 :æ›´æ–°: KOSAKI Motohiro, 16 Mar 2010 :æ›´æ–°: Chris Down, 13 July 2020