.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/filesystems/tmpfs.rst translated by Wang Qing<wangqing@vivo.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