分享

ramfs 和 ramdisk 的区别

 guitarhua 2012-07-31

ramfs 和 ramdisk 的区别

分类: linux kernel 739人阅读 评论(0) 收藏 举报

  Ramdisk, ramfs, tmpfs.

  ① 第一种就是传统意义上的,可以格式化,然后加载。

  这在Linux内核2.0/2.2就已经支持,其不足之处是大小固定,之后不能改变。

  为了能够使用Ramdisk,我们在编译内核时须将block device中的Ramdisk支持选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是initrd的支持。

  如果对Ramdisk的支持已经编译进内核,我们就可以使用它了:

  首先查看一下可用的RamDisk,使用ls /dev/ram*

  首先创建一个目录,比如test,运行mkdir /mnt/test;

  然后对/dev/ram0 创建文件系统,运行mke2fs /dev/ram0;

  最后挂载 /dev/ram0,运行mount /dev/ram /mnt/test,就可以象对普通硬盘一样对它进行操作了。

  ② 另两种则是内核2.4才支持的,通过Ramfs或者Tmpfs来实现:

  它们不需经过格式化,用起来灵活,其大小随所需要的空间而增加或减少。

  Ramfs顾名思义是内存文件系统,它处于虚拟文件系统(VFS)层,而不像ramdisk那样基于虚拟在内存中的其他文件系统(ex2fs)。

  因而,它无需格式化,可以创建多个,只要内存足够,在创建时可以指定其最大能使用的内存大小。

  如果你的Linux已经将Ramfs编译进内核,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可:

  # mkdir /testRam

  # mount -t ramfs none /testRAM

  缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。

  # mount -t ramfs none /testRAM -o maxsize=2000 (创建了一个限定最大使用内存为2M的ramdisk)

  ③ Tmpfs是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的Ramdisk,也不同于针对物理内存的Ramfs。

  Tmpfs可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。

  Tmpfs向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。

  使用tmpfs,首先你编译内核时得选择"虚拟内存文件系统支持(Virtual memory filesystem support)" 。

  然后就可以加载tmpfs文件系统了:

  # mkdir -p /mnt/tmpfs

  # mount tmpfs /mnt/tmpfs -t tmpfs

  同样可以在加载时指定tmpfs文件系统大小的最大限制:

  # mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

 

上面说的是ramdisk ramfs tmpfs, 并没有涉及到前面的init。

 

// 在/sbin/init执行之前, 系统中还是有很多东西可嚼的.

http://wiki./InitrdReplacementOptions
http://www./articles/AT4017834659.html

boot loader装入kernel, 然后kernel需要执行/sbin/init, 读取
这个文件就必须先mount根文件系统, 早期是通过启动时的root=
参数告诉内核根文件系统在哪个设备上,  随着硬件和技术的发展,
现在根文件系统可能位于一个网络存储如NFS上, 可能由于RAID而
散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,
这时root=参数就显得不够了. 为了应付这种局面, 先后出现两种
机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动
过程的桥梁: initrd和initramfs, 两者有类似的地方, 比如都是
由内核执行其上的某个程序(initrd是/linuxrc, initramfs是/init),
由这个程序决定加载什么驱动以及如何装载根文件系统. 下面一点
笔记总结initrd的缺点和initramfs的优点.

initrd:
ram disk是一个基于ram的块设备,因此它占据了一块固定的内存,
而且事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统
驱动来读写其上的文件。
如果这个disk上的空间没有用完,这些未用的内存就浪费掉了,并且
这个disk的空间固定导致容量有限,要想装入更多的文件就需要重新
格式化。
由于Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache
(对于文件数据)和dentry cache(对于目录项), 这个也导致内存浪费.

initramfs:
最初的想法是Linus提出的: 把cache当作文件系统装载. 他在一个叫
ramfs的cache实现上加了一层很薄的封装, 其它内核开发人员编写了
一个改进版tmpfs, 这个文件系统上的数据可以写出到交换分区, 而且
可以设定一个tmpfs装载点的最大尺寸以免耗尽内存. initramfs就是
tmpfs的一个应用.
优点:
    (1)tmpfs随着其中数据的增减自动增减容量.
    (2)在tmpfs和page cache/dentry cache之间没有重复数据.
    (3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核
     尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量
     也有保证.
    (4)不需要额外的文件系统驱动.

另外, initrd机制被设计为旧的"root="机制的前端, 而非其替代物,
它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,
这样不便将NFS等作为根文件系统, 最后/linuxrc不是以PID=1执行的, 因为
1这个进程ID是给/sbin/init保留的. initrd机制找到真正的根设备后将
其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由
其装载根文件系统并启动/sbin/init.

initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件
系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多