tmpfs(shm)解决方案
2010-12-07 15:28:57 阿炯

介绍tmpfs
如果我必须一下子说清楚tmpfs,我会说tmpfs就象虚拟磁盘(ramdisk),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs之类的命令才能真正地使用它,tmpfs是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。总而言之,这让tmpfs成为我有机会遇到的最好的基于RAM的文件系统。

tmpfs和VM
让我们来看看tmpfs更有趣的一些特性吧。正如我前面提到的一样,tmpfs既可以使用RAM,也可以使用交换分区。刚开始这看起来可能有点武断,但请记住tmpfs也是我们知道的“虚拟内存文件系统”。而且您可能也知道,Linux内核的虚拟内存资源同时来源于您的RAM和交换分区。内核中的VM子系统将这些资源分配到系统中的其它部分,并负责在后台管理这些资源,通常是透明地将RAM页移动到交换分区或从交换分区到RAM页。
tmpfs文件系统需要VM子系统的页面来存储文件。tmpfs自己并不知道这些页面是在交换分区还是在RAM中;做这种决定是VM子系统的工作。tmpfs文件系统所知道的就是它正在使用某种形式的虚拟内存。

不是块设备
这里是tmpfs文件系统另一个有趣的特性。不同于大多数“标准的”文件系统,如ext3、ext2、XFS、JFS、ReiserFS和其它一些系统,tmpfs并不是存在于一个底层块设备上面。因为tmpfs是直接建立在VM之上的,您用一个简单的mount命令就可以创建tmpfs文件系统了。
#mount tmpfs /mnt/tmpfs -t tmpfs

执行这个命令之后,一个新的tmpfs文件系统就安装在/mnt/tmpfs,随时可以使用。注意,不需运行 mkfs.tmpfs;事实上那是不可能的,因为没有这样的命令存在。在mount命令执行之后,文件系统立即就被安装并且可以使用了,类型是tmpfs。这和Linux虚拟磁盘如何使用大相径庭;标准的Linux虚拟磁盘是块设备,所以在使用它们之前必须用您选择的文件系统将其格式化。相反,tmpfs是一个文件系统。所以您可以简单地安装它就可以使用了。

tmpfs的优势
动态文件系统的大小
您可能想知道我们前面在/mnt/tmpfs安装的tmpfs文件系统有多大。这个问题的答案有点意外,特别是在和基于磁盘的文件系统比较的时候。/mnt/tmpfs最初会只有很小的空间,但随着文件的复制和创建,tmpfs文件系统驱动程序会分配更多的VM,并按照需求动态地增加文件系统的空间。而且当/mnt/tmpfs中的文件被删除时,tmpfs文件系统驱动程序会动态地减小文件系统并释放VM资源,这样做可以将VM返回到循环当中以供系统中其它部分按需要使用。因为VM是宝贵的资源,所以您一定不希望任何东西浪费超出它实际所需的VM,tmpfs的好处之一就在于这些都是自动处理的。

速度
tmpfs的另一个主要的好处是它闪电般的速度。因为典型的tmpfs文件系统会完全驻留在RAM中,读写几乎可以是瞬间的。即使用了一些交换分区,性能仍然是卓越的,当更多空闲的VM 资源可以使用时,这部分tmpfs 文件系统会被移动到中去。让VM子系统自动地移动部分tmpfs文件系统到交换分区实际上对性能上是好的,因为这样做可以让VM子系统为需要RAM的进程释放空间。这一点连同它动态调整大小的能力,比选择使用传统的RAM磁盘可以让操作系统有好得多的整体性能和灵活性。

没有持久性
这看起来可能不象是个积极因素,tmpfs数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。我想您可能猜到了tmpfs被称为“tmpfs”的一个原因,不是吗?然而这实际上可以是一件好事。它让tmpfs成为一个保存您不需保留的数据(如临时文件,可以在/tmp中找到,还有/var文件系统树的某些部分)的卓越的文件系统。

使用tmpfs
为了使用tmpfs,您所需要的就是启用了“Virtual memory file system support(以前是 shm fs)”选项的 2.4系列内核;这个选项在内核配置选项的“File systems”部分。一旦您有了一个启用了tmpfs的内核,您就可以开始安装tmpfs文件系统了。其实在您所有的2.4内核中都打开tmpfs选项是个好主意,不管您是否计划使用tmpfs。这是因为您需要内核tmpfs支持来使用POSIX共享的内存。然而System V共享的内存不需要内核中有tmpfs就可以工作。注意,您不需要为了让POSIX共享的内存工作而安装tmpfs文件系统;您只需要在内核中支持tmpfs就可以了。POSIX共享的内存现在使用得不太多,但这种情况可能会随着时间而改变。

避免低VM情况
tmpfs根据需要动态增大或减小的事实让人疑惑:如果您的tmpfs文件系统增大到它耗尽了所有虚拟内存的程度,而您没有剩余的RAM或交换分区,这时会发生什么?一般来说,这种情况是有点讨厌。如果是2.4.4内核,内核会立即锁定。如果是2.4.6内核,VM子系统已经以很多种方式得到了修正,虽然耗尽VM并不是一个美好的经历,事情也不会完全地失败。如果2.4.6内核到了无法分配更多VM的程度,您显然不愿意不能向 tmpfs文件系统写任何新数据。另外,可能会发生其他一些事情。首先,系统的其他一些进程会无法分配更多的内存;通常这意味着系统多半会变得极度缓慢而且几乎没有响应。这样超级用户要采取必要的步骤来缓解这种低VM的情况就会很困难,或异常地耗时。

另外,内核有一个内建的最终防线系统,用来在没有可用内存的时候释放内存,它会找到占用VM资源的进程并终止该进程。不幸的是这种“终止进程”的解决方案在tmpfs的使用增加引起VM耗尽的情况下通常会导致不良后果。以下是原因。tmpfs本身不能(也不应该)被终止,因为它是内核的一部分而非一个用户进程,而且也没有容易的方法可以让内核找出是那个进程占满了tmpfs文件系统。所以内核会错误地攻击它能找到的最大的占用VM的进程,通常会是X服务器(X server),如果您碰巧在使用它。所以您的X服务器会被终止,而引起低VM情况的根本原因(tmpfs)却没有被解决。

低VM:解决方案
幸运的是,tmpfs允许您在安装或重新安装文件系统的时候指定文件系统容量的最大值上限。实际上从2.4.6 内核到2.11g内核,这些参数只能在安装时设置,而不是重新安装时,但我们可以期望在不久的将来可以在重新安装时设置这些参数。tmpfs容量最大值的最佳设置依赖于资源和您特定的Linux主机的使用模式;这个想法是要防止一个完全使用资源的tmpfs文件系统耗尽所有虚拟内存结果导致我们前面谈到的糟糕的低VM情况。寻找好的tmpfs上限值的一个好方法是使用top来监控您系统的交换分区在高峰使用阶段的使用情况。然后,确保指定的tmpfs上限稍小于所有这些高峰使用时间内空闲交换分区和空闲RAM的总和。

创建有最大容量的tmpfs文件系统很容易。要创建一个新的最大64MB的tmpfs文件系统,请键入:
#mount tmpfs /dev/shm -t tmpfs -o size=64m

这次,我们没有把tmpfs文件系统安装在/mnt/tmpfs,而是创建在/dev/shm,这正好是tmpfs文件系统的“正式”安装点。如果您正好在使用devfs,您会发现这个目录已经为您创建好了。还有如果我们想将文件系统的容量限制在512KB或1GB以内,我们可以分别指定size=512k和size=1g。除了限制容量,我们还可以通过指定nr_inodes=x参数限制索引节点(文件系统对象)。在使用nr_inodes时,x可以是一个简单的整数,后面还可以跟一个k 、m或g指定千、百万或十亿(!)个索引节点。

而且,如果您想把上面的mount tmpfs命令的等价功能添加到/etc/fstab,应该是这样:
tmpfs    /dev/shm    tmpfs    size=32m    0    0

在现存的安装点上安装
在以前使用2.2的时候,试图在已经安装了东西的安装点再次安装任何东西都会引发错误。然而重写后的内核安装代码使多次使用安装点不再成为问题。这里是一个示例的情况:假设我们有一个现存的文件系统安装在/tmp。然而我们决定要开始使用tmpfs进行/tmp的存储。过去您唯一的选择就是卸载/tmp并在其位置重新安装您新的tmpfs/tmp文件系统,如下所示:
#umount /tmp
#mount tmpfs /tmp -t tmpfs -o size=64m

可是这种解决方案也许对您不管用。可能有很多正在运行的进程在/tmp中有打开的文件;如果是这样,在试图卸载/tmp时,您就会遇到如下的错误:
umount: /tmp: device is busy

然而,使用最近的2.4内核,您可以安装您新的/tmp文件系统,而不会遇到“device is busy”错误:
#mount tmpfs /tmp -t tmpfs -o size=64m

用一条命令,您新的tmpfs /tmp文件系统就被安装在/tmp,并安装在已经安装的不能再被直接访问的分区之上。然而虽然您不能访问原来的/tmp,任何在原文件系统上还有打开文件的进程都可以继续访问它们。而且,如果您unmount基于tmpfs的/tmp,原来安装的/tmp 文件系统会重新出现。实际上您在相同的安装点上可以安装任意数目的文件系统,安装点就象一个堆栈;卸载当前的文件系统,上一个最近安装的文件系统就会重新出现。

绑定安装
使用绑定安装,我们可以将所有甚至 部分已经安装的文件系统安装到另一个位置,而在两个安装点可以同时访问该文件系统。例如您可以使用绑定安装来安装您现存的根文件系统到/home/hto/nifty,如下所示:
#mount --bind / /home/hto/nifty

现在如果您观察/home/hto/nifty的内部,您就会看到您的根文件系统(/home/hto/nifty/etc、/home/hto/nifty/opt等)。而且如果您在根文件系统修改文件,您在/home/hto/nifty中也可以看到所作的改动。这是因为它们是同一个文件系统;内核只是简单地为我们将该文件系统映射到两个不同的安装点。注意,当您在另一处安装文件系统时,任何安装在绑定安装文件系统内部的安装点的文件系统都不会随之移动。换句话说,如果您在单独的文件系统上有/usr,我们前面执行的绑定安装就会让 /home/hto/nifty/usr为空。您会需要附加的绑定安装命令来使您能够浏览位于/home/hto/nifty/usr的/usr的内容:
#mount --bind /usr /home/hto/nifty/usr

绑定安装部分文件系统
绑定安装让更妙的事情成为可能。假设您有一个tmpfs文件系统安装在它的传统位置/dev/shm,您决定要开始在当前位于根文件系统的/tmp使用tmpfs。虽然可以在/tmp(这是可能的)安装一个新的tmpfs文件系统,您也可以决定让新的/tmp共享当前安装的/dev/shm文件系统。然而虽然您可以在/tmp绑定安装/dev/shm就完成了,但您的/dev/shm还包含一些您不想在/tmp出现的目录。所以您怎么做呢?这样如何:
#mkdir /dev/shm/tmp
#chmod 1777 /dev/shm/tmp
#mount --bind /dev/shm/tmp /tmp

在这个示例中,我们首先创建了一个/dev/shm/tmp目录,然后给它1777权限,对/tmp适当的许可。既然我们的目录已经准备好了,我们可以安装,也只能安装/dev/shm/tmp到/tmp。所以,虽然/tmp/foo会映射到 /dev/shm/tmp/foo,但您没有办法从/tmp访问/dev/shm/bar文件。正如您所见,绑定安装非常强大,让您可以轻易地修改文件系统设计。

tmpfs在类Unix操作系统上是一个常见的名称会用来做为暂时的档案储存方式,在更多的情况下,它会用虚拟的内存而不是一个永久保存的媒体来做为在档案系统上的使用。

定义
所有在tmpfs上储存的资料在理论上都是暂时借放的,那也表示说,档案不会建立在硬盘上面。一旦重新开机,所有在tmpfs里面的资料都对消失不见。理论上,内存使用量会随着tmpfs的使用而时有增长或消减。目前有许多Unix的发行版都有启用tmpfs,默认是把它以共享内存的方式用在系统的/tmp目录底下。这个特征在Unix上面会表现像是:
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 256M  688K  256M   1%  /tmp

应用实例

SunOS/Solaris
SunOS是Solaris下一世代的操作系统,里头实作了tmpfs的部份功能最初在SunOS4.1上实作,在1990三月释出。1994年十一月,Solaris 2.1里头/tmp采用tmpfs的应用,并被纳入默认的档案系统之一。

Linux
tmpfs在Linux kernel从2.4之后的版本都有支援。tmpfs(之前比较为人所知的名称是 "shmfs")和Linux 的ramdisk装置定位有所不同。Ramdisk是固定划分一块内存出来使用,且允许比较不常用的页面可以移动到置换空间去。

RAMFS相比之下,不会利用虚拟内存的部份(这个特点有利也有弊)。另外在MFS还有其它ramfs的旧版本,都不会动态的调整大小,只能一直占用一个固定的大小。

tmpfs的用法,举例来说是像:"mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0700 tmpfs /space" 这样就会使用1 GiB的置换空间,里头有10240 inodes且规定是在/space目录底下存取。这个档案系统的大小是可以随时调整的,像是再追加一个指令如:mount -o remount,size=2G /space"。

要注记一点,如果/tmp有安全上的顾虑的话,最好追加sticky bit上来。就是权限应该被设作 "mode=1777" ,而不是 "mode=0777 或 "mode=777"

BSD
从2005年九月10号之后tmpfs也正式被收录到NetBSD的源代码里头,同时在4.0之后的版本启用了这个功能。FreeBSD也已经收录了NetBSD的这项功能,在7.0之后的版本也跟着启用。

微软Windows
视窗操作系统也有一个类似tmpfs的方式来处理,就是 "temporary files"。在系统的低内存底下,档案会以 FILE_ATTRIBUTE_TEMPORARY和FILE_FLAG_DELETE_ON_CLOSE(“暂存盘案”与“关闭时删除该档”的旗标)标记在内存里面。这种方式的处理相当类似 tmpfs ,除了这些档案会被写入到特定的低内存位置而不是置换空间去。这个技术也常用在服务器传送档案的时候,把档案传送到客户端之前先丢到一个缓冲的暂存上面。

tmpfs的优点:
#因为tmpfs是建立在VM上的,而不是物理磁盘上,所以不需要格式化就可以使用,所以不用尝试mkfs.tmpfs了
#tmpfs的大小是动态的,用多少才分配多少,删除文件则会释放相应的VM空间。
#当您的物理内存不足以支撑分配为tmpfs的大小时,它会自动使用swap的页面。
#tmpfs大部分时间是驻留在物理内存中,这使得其读写速度超快。

tmpfs的缺点:
#tmpfs的先天优势变成了他的先天劣势:内存的特性导致位于tmpfs上的数据断电会丢失。
#相比较硬盘的价格来说,内存无疑还是很昂贵的,所以用tmpfs的目录不要放太大的东西。

tmpfs的用途:
程序运行产生的临时文件,我觉得tmpfs天生就是为tmp目录设计的,如果是用在服务器上更是前途无量,比如squid,网站之类。

那么可以在这些应用的临时目录挂载tmpfs系统,但是服务器级别的应用本菜一窍不通,这里面向desktop用户,说说如何加速/tmp/的读写
mount tmpfs /tmp -t tmpfs -o size=1024m

#1024不是固定的,实际大小根据你的实际情况定,比如可以在系统开了很长时间很大负载的时候看看(空闲的内存和swap)一共还有多少,最好不要超过这个值。
#这里必须有mount权限,ubuntu可以用sudo来获得权限,'size='指定tmpfs动态大小的上限,如果/tmp目录(即将使用的)大小超过指定大小,一样会提示你空间不足。
#之所以不推荐这样做,是因为mount之后/tmp会被立即清空,如果你有程序有在/tmp中打开的文件(比如socket),会出错,而且每次都要手动挂载,多麻烦。
#基于以上原因,最好还是编辑/etc/fstab文件来让系统启动时帮你搞定。

推荐方法如下:
edit /etc/fstab

在最后添加如下内容:
tmpfs /tmp tmpfs size=1024m 0 0

保存并关闭,然后在下次启动时你就用上tmpfs了。
/tmp分区是我最常拿来解压,编译的目录(不用清理,方便),用tmpfs在这里折腾就不用看着硬盘灯狂闪了,不管怎么说,我也把firefox的cache也放在这里了,有利有弊。

在firefox中输入about:config,搜索browser.cache.disk.parent_directory,如果没有,就新建这个字符串,然后修改其值为:/tmp/Firefox_cache,保存并重启firefox。

然后输入about:cache查看cache的详细信息。

这样做的结果:每次开机第一次启动firefox时由于cache为空,所以打开一个访问过的页面会比以前慢,但再载入就快了,好处是除了配置文件firefox不在硬盘上读写数据,自己权衡利弊吧。


Linux /dev/shm 设备

/dev/shm/是linux下一个目录,/dev/shm目录不在磁盘上,而是在内存里,因此其使用效率非常高,直接写进内存。该设备是系统的一个共享内存设备,可以把/dev/shm看作是系统内存的入口,可以把它看做是一块物理存储设备。

tmpfs特点:
1.tmpfs 是一个文件系统,而不是块设备,您只要安装了它,它就可以使用了。可动态地调整文件系统的大小。

2.tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。

3.tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载、绑定的操作。

/dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折去创建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。系统默认就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(内存磁盘)一样,但还是不一样的:像内存磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的内存磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它;tmpfs 是一个文件系统,而不是块设备,只要安装它,它就可以使用了,创建时不需要使用mkfs等初始化。

默认容量

linux下/dev/shm的容量默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有200M文件,那剩余的800M仍然可为其它应用程序所使用,但它所占用的200M内存,是绝不会被系统回收重新划分的.

容量(大小)调整

linux /dev/shm容量(大小)是可以调整,在有些情况下默认的最大一半内存不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它:
mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm

在2G的机器上,将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件。

通过/etc/fstab文件来修改/dev/shm的容量(增加size选项即可),修改后重新挂载即可:
tmpfs    /dev/shm    tmpfs   defaults        0 0

tmpfs    /dev/shm    tmpfs   defaults,size=1500M        0 0
or
tmpfs    /dev/shm    tmpfs   defaults,size=1.5G        0 0

如果出于安全考虑,可以加如下的选项到其中:
tmpfs    /dev/shm    tmpfs    defaults.nosuid,nodev,noexec,rw    0 0

通过上述方式就可以限制/dev/shm设备中不会有任何带S位权限的程序了,同时也限制了/dev/shm的可执行权限,系统内存的安全使用也得到了提升。如果合理使用该设备,可以避开磁盘IO不给力。据说Oracle 中的Automatic Memory Management特性就使用了/dev/shm,或将squid的缓存目录cache_dir放到/tmp下。

# mount -o remount /dev/shm

# mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm

首先在/dev/stm建个tmp文件夹,然后与实际/tmp绑定
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp 
mount --bind /dev/shm/tmp /tmp (--bind)

在使用'mount --bind olderdir newerdir'命令来挂载一个目录到另一个目录后,newerdir的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性,除了名称。
 
这个1777的权限位中的1是做什么用的,1是粘贴位,表示在此目录中任何人都具有完全权限,但是只有自己建立的文件才可以删除,即你不能删除和修改别人的东西。


Tmpfs is a file system which keeps all files in virtual memory.Everything in tmpfs is temporary in the sense that no files will be created on your hard drive. If you unmount a tmpfs instance,everything stored therein is lost.

tmpfs puts everything into the kernel internal caches and grows and shrinks to accommodate the files it contains and is able to swap unneeded pages out to swap space. It has maximum size limits which can be adjusted on the fly via 'mount -o remount …'

If you compare it to ramfs (which was the template to create tmpfs) you gain swapping and limit checking. Another similar thing is the RAM disk (/dev/ram*), which simulates a fixed size hard disk in physical RAM, where you have to create an ordinary filesystem on top. Ramdisks cannot swap and you do not have the possibility to resize them.

Since tmpfs lives completely in the page cache and on swap, all tmpfs pages currently in memory will show up as cached. It will not show up as shared or something like that. Further on you can check the actual

RAM+swap use of a tmpfs instance with df(1) and du(1).
tmpfs has the following uses:
1) There is always a kernel internal mount which you will not see at all. This is used for shared anonymous mappings and SYSV shared memory.

This mount does not depend on CONFIG_TMPFS. If CONFIG_TMPFS is not set, the user visible part of tmpfs is not build. But the internal mechanisms are always present.

2) glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for POSIX shared memory (shm_open, shm_unlink). Adding the following line to /etc/fstab should take care of this:
tmpfs   /dev/shm        tmpfs   defaults        0 0

Remember to create the directory that you intend to mount tmpfs on if necessary.This mount is _not_ needed for SYSV shared memory. The internal mount is used for that. (In the 2.3 kernel versions it was necessary to mount the predecessor of tmpfs (shm fs) to use SYSV shared memory)

3) Some people (including me) find it very convenient to mount it e.g. on /tmp and /var/tmp and have a big swap partition. And now loop mounts of tmpfs files do work, so mkinitrd shipped by most distributions should succeed with a tmpfs /tmp.

4) And probably a lot more I do not know about.

tmpfs has three mount options for sizing:

size:The limit of allocated bytes for this tmpfs instance. The default is half of your physical RAM without swap. If you oversize your tmpfs instances the machine will deadlock since the OOM handler will not be able to free that memory.

nr_blocks: The same as size, but in blocks of PAGE_CACHE_SIZE.
nr_inodes: The maximum number of inodes for this instance. The default is half of the number of your physical RAM pages, or (on a machine with highmem) the number of lowmem RAM pages,whichever is the lower.

These parameters accept a suffix k, m or g for kilo, mega and giga and can be changed on remount.  The size parameter also accepts a suffix % to limit this tmpfs instance to that percentage of your physical RAM:the default, when neither size nor nr_blocks is specified, is size=50%.

If nr_blocks=0 (or size=0), blocks will not be limited in that instance;if nr_inodes=0, inodes will not be limited. It is generally unwise tomount with such options, since it allows any user with write access to use up all the memory on the machine; but enhances the scalability of that instance in a system with many cpus making intensive use of it.

tmpfs has a mount option to set the NUMA memory allocation policy for all files in that instance (if CONFIG_NUMA is enabled) - which can be adjusted on the fly via 'mount -o remount ...'
mpol=default             prefers to allocate memory from the local node
mpol=prefer:Node         prefers to allocate memory from the given Node
mpol=bind:NodeList       allocates memory only from nodes in NodeList
mpol=interleave          prefers to allocate from each node in turn
mpol=interleave:NodeList allocates from each node of NodeList in turn

NodeList format is a comma-separated list of decimal numbers and ranges,a range being two hyphen-separated decimal numbers, the smallest and largest node numbers in the range.  For example, mpol=bind:0-3,5,7,9-15

Note that trying to mount a tmpfs with an mpol option will fail if the running kernel does not support NUMA; and will fail if its nodelist specifies a node which is not online.  If your system relies on that tmpfs being mounted, but from time to time runs a kernel built without NUMA capability (perhaps a safe recovery kernel), or with fewer nodes online, then it is advisable to omit the mpol option from automatic mount options.  It can be added later, when the tmpfs is already mounted on MountPoint, by 'mount -o remount,mpol=Policy:NodeList MountPoint'.

To specify the initial root directory you can use the following mount options:
mode:   The permissions as an octal number
uid:    The user id
gid:    The group id

The se options do not have any effect on remount. You can change these parameters with chmod(1), chown(1) and chgrp(1) on a mounted filesystem.

So 'mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs' will give you tmpfs instance on /mytmpfs which can allocate 10GB RAM/SWAP in 10240 inodes and it is only accessible by root.

Mount options for tmpfs
The following parameters accept a suffix k, m or g for Ki, Mi, Gi (binary kilo, mega and giga) and can be changed on remount.

size=nbytes
Override  default maximum size of the filesystem.  The size is given in bytes, and rounded down to entire pages.  The default is half of the memory.

nr_blocks=
Set number of blocks.

nr_inodes=
Set number of inodes.

mode=  Set initial permissions of the root directory.

该文章最后由 阿炯 于 2018-10-05 09:01:21 更新,目前是第 2 版。