Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90100
  • 博文数量: 34
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 275
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-13 23:05
文章分类

全部博文(34)

文章存档

2011年(1)

2010年(7)

2009年(26)

我的朋友

分类: LINUX

2009-06-26 00:42:57

========initramfs和initrd的区别=================

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, 这样也导致一个更为干净漂亮的设计.

===============make initramfs =============

(1) 黃敬群先生的blog:深入理解 Linux 2.6 initramfs 機制

http://blog.linux.org.tw/~jserv/archives/001954.html

(2) initramfs, a new model for initial RAM

http://www.linuxdevices.com/articles/AT4017834659.html


下面是一些使用initramfs简单帮助

1. 查看initramfs的内容

# mkdir temp ; cd temp
# cp /boot/initrd.img-2.6.24-16 initrd.img-2.6.24-16.gz
# gunzip initrd.img-2.6.24-16.gz
# cpio -i --make-directories < initrd.img-2.6.24-16
#

2. 创建initramfs

命令:mkinitramfs, update-initramfs

1) mkinitramfs

# mkinitramfs -o /boot/initrd.img 2.6.24-16

Note: 2.6.24-16是需要创建initramfskernel版本号,如果是给当前kernel制作initramfs,可以用uname -r查看当前的版本号。提供kernel版本号的主要目的是为了在initramfs中添加指定kernel的驱动模块。mkinitramfs会把/lib/modules/${kernel_version}/ 目录下的一些启动会用到的模块添加到initramfs中。

2update-initramfs

更新当前kernelinitramfs

# update-initramfs -u

在添加模块时,initramfs tools只会添加一些必要模块,用户可以通过在/etc/initramfs-tools/modules文件中加入模块名称来指定必须添加的模块。




阅读(1342) | 评论(0) | 转发(0) |
0

上一篇:romfs

下一篇:Linux裁减指南

给主人留下些什么吧!~~