RHEL6由initrd走向initramfs

2011年01月04日 Linux基础 暂无评论 阅读 10,172 views 次

我们知道:boot loader装入kernel,然后kernel需要执行/sbin/init,读取这个文件就必须先mount根文件系统,早期是通过启动时的root="参数"告诉内核根文件系统在哪个设备上,随着硬件和技术的发展,现在根文件系统可能位于一个网络存储如NFS上,可能由于RAID而散布于多个设备上,可能位于一个加密设备上需要提供用户名和密码,这时root="参数"就显得不够了。为了应付这种局面,先后出现两种机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动过程的桥梁: initrd和nitramfs

我们在一天一点学习Linux之RHEL6的开机流程分析(http://www.opsers.org/2010_12_1518.html)中讲到,RHEL6已经启用了新的模式:用initramfs代替了initrd。下面我们就来了解一下这两个的区别:

initrd:
ram disk是一个基于ram的块设备,因此它占据了一块固定的内存,而且事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统驱动来读写其上的文件。如果这个disk上的空间没有用完,这些未用的内存就浪费掉了,并且这个disk的空间固定导致容量有限,要想装入更多的文件就需要重新格式化。由于Linux的块设备缓冲特性,ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),这个也导致内存浪费。
initramfs:
最初的想法是Linus提出的: 把cache当作文件系统装载。 他在一个叫ramfs的cache实现上加了一层很薄的封装,其它内核开发人员编写了一个改进版tmpfs, 这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。Linux 2.6 kernel提出了这种新的实现机制,即initramfs。顾名思义,initramfs只是一种RAM filesystem而不是disk。

initramfs的优点:
      (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,这样也导致一个更为干净漂亮的设计。

转自:http://www.36ji.net/article/1113/11611.html

给我留言

Copyright © 羽飞博客 保留所有权利.   Ality主题 皖ICP备14013844号-1

用户登录