RAMFS是Linux下一种基于RAM做存储的文件系统。在使用过程中你就可以把ramfs理解为在普通的HDD上建立了一个文件系统,HDD被替换成了RAM,因为是RAM做存储所以会有很高的存储效率。
RAMFS 是 Linux 下一种基于 RAM 做存储的文件系统。在使用过程中你就可以把 ramfs 理解为在普通的 HDD 上建立了一个文件系统,而现在 HDD 被替换成了 RAM,因为是 RAM 做存储所以会有很高的存储效率。
由于 ramfs 的实现就相当于把 RAM 作为最后一层的存储,所以在 ramfs 中不会使用 swap。你什么时候听过会把 HDD 上的文件 swap 到哪里去吗?平常说的 swap 都是针对内存来说的,而 ramfs 底层的存储是 RAM,虽然不是 HDD,但是在 Linux 看来它就跟 HDD 一样。但是 ramfs 有一个很大的缺陷就是它会吃光系统所有的内存,即使你 mount 的时候指定了大小,同时它也只能被 root 用户访问。测试方法很简单:
sudo mount -t ramfs -o size=10M ramfs ./ramfs/
sudo dd if=/dev/zero of=./ramfs/test.file bs=1M count=20
测试时你会发现上面这个操作是能成功的,或者你再自己虚拟机上干脆做狠点,直接写一个比内存更大的文件,你会发现瞬间系统就卡主了。另外在 dd 命令如果不以 root 用户执行就会权限不够:
dd: opening `./ramfs/test.file’: Permission denied
tmpfs 也是 Linux 下的一个文件系统,它将所有的文件都保存在虚拟内存中,umount tmpfs 后所有的数据也会丢失,tmpfs 就是 ramfs 的衍生品。tmpfs 使用了虚拟内存的机制,它会进行 swap,但是它有一个相比 ramfs 的好处:mount 时指定的 size 参数是起作用的,这样就能保证系统的安全,而不是像 ramfs 那样,一不留心因为写入数据太大吃光系统所有内存导致系统被 hang 住。在我文章最开始的那个例子中就是 mount 了一个 10M 大小的 tmpfs,然后执行 sql 命令(它需要创建的临时表大于 10M),因为 tmpfs 限制了大小,因此也就报错。那么 tmpfs 适用的场景有哪些呢?在官方文档上主要有如下几点:
kernel 内部需要用到它,而我们是无法看到的
glibc 2.2 以上的版本,必须有一个 tmpfs 被 mount 在/dev/shm 用做 POSIX shared memory
还有很多包括现在还不知道的用途
包括我现在的公司就有一个需求,某些数据如果放在磁盘上访问压力根本扛不住,因此临时做了一个 tmpfs 做缓存来减缓压力,当然这不是最终的解决之道。所以总结来说 ramfs 与 tmpfs 有如下几点异同:
ramfs 会因为数据的写入自动增长空间,所以可能导致最后系统所有的内存耗完
tmpfs 可以再 mount 时限定大小,不会自动增长
ramfs 不会用 swap
tmpfs 会使用 swap
RAMFS 是一个非常巧妙的,利用 VFS 自身结构而形成的内存文件系统。
RAMFS 没有自已的文件存储结构,它的文件存储于 page cache 中,目录结构由 dentry 链表本身描述,文件则由 VFS 的 inode 结构本身描述。