initrd的缺点和initramfs的优点

来源:互联网 发布:企业海关出口数据查询 编辑:程序博客网 时间:2024/05/16 12:17

发信人: JulyClyde (七月), 信区: LinuxApp
标  题: [合集] initrd vs initramfs
发信站: 水木社区 (Tue Jun 20 19:10:17 2006), 站内

☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 15:06:24 2006)  提到:

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

http://wiki.debian.org/InitrdReplacementOptions
http://www.linuxdevices.com/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, 这样也导致一个更为干净漂亮的设计.




☆─────────────────────────────────────☆
   shenmue (黑社会就是好) 于  (Tue Jun  6 15:20:46 2006)  提到:

问个问题,在 mkinitramfs 的时候,怎么把 Ubuntu 的 artwork-usplash 加到 ramdisk 里面呢?

我自己 mkinitramfs -o initrd `uname -r` 做出来的就没有 usplash 了

//bow
【 在 Dieken (风催草低) 的大作中提到: 】
: // 在/sbin/init执行之前, 系统中还是有很多东西可嚼的.
: http://wiki.debian.org/InitrdReplacementOptions
: http://www.linuxdevices.com/articles/AT4017834659.html
: ...................



☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 15:26:02 2006)  提到:

这两天才看这个, 你可以参考linux-2.6/Documentation/early-userspace/README
和linux-2.6/Documentation/initrd.txt,
mkinitramfs生成的就是一个gzip的了cpio档, 
cp /initrd.img /tmp/initrd.gz
gzip -d /tmp/initrd.gz
cd myinitrd/
cpio -i < /tmp/initrd
然后你往这个目录里加usplash就行了, 看看你的usplash在哪个目录
下面, 相应的拷贝过来, myinitrd/对应/目录.
可能需要配置什么, 我没搞过splash这个东西.

拷贝完后cpio打个包然后gzip一下. 可能不行, 你不妨试验一下.

这两个东西可能也有启发, 我都还没细看:
linux-2.6/scripts/gen_initramfs_list.sh
linux-2.6/usr/gen_init_cpio.c

【 在 shenmue (黑社会就是好) 的大作中提到: 】
: 问个问题,在 mkinitramfs 的时候,怎么把 Ubuntu 的 artwork-usplash 加到 ramdisk 里面呢?
: 我自己 mkinitramfs -o initrd `uname -r` 做出来的就没有 usplash 了
: //bow





☆─────────────────────────────────────☆
   gnawux (我有分寸) 于  (Tue Jun  6 15:36:07 2006)  提到:


【 在 Dieken (风催草低) 的大作中提到: 】
: 这两天才看这个, 你可以参考linux-2.6/Documentation/early-userspace/README
: 和linux-2.6/Documentation/initrd.txt,
: mkinitramfs生成的就是一个gzip的了cpio档, 
: cp /initrd.img /tmp/initrd.gz
: gzip -d /tmp/initrd.gz
: cd myinitrd/
: cp -i < /tmp/initrd
cpio ?

: 然后你忘这个目录里加usplash就行了, 看看你的usplash在哪个目录
: 下面, 相应的拷贝过来, myinitrd/对应/目录.
: 可能需要配置什么, 我没搞过splash这个东西.
: 拷贝完后cpio打个包然后gzip一下. 可能不行, 你不妨试验一下.




☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 15:44:34 2006)  提到:

汗, 最近手很失水准, 我马上改过来.

【 在 gnawux (我有分寸) 的大作中提到: 】
: cpio ?





☆─────────────────────────────────────☆
   shenmue (黑社会就是好) 于  (Tue Jun  6 15:46:11 2006)  提到:

我看了一下 Kubuntu Dapper 的 initrd,usplash 好像涉及到这样几个文件

sbin/usplash
sbin/usplash_write
usr/lib/usplash/usplash-artwork.so
【 在 Dieken (风催草低) 的大作中提到: 】
: 这两天才看这个, 你可以参考linux-2.6/Documentation/early-userspace/README
: 和linux-2.6/Documentation/initrd.txt,
: mkinitramfs生成的就是一个gzip的了cpio档, 
: ...................



☆─────────────────────────────────────☆
   shenmue (黑社会就是好) 于  (Tue Jun  6 15:47:08 2006)  提到:

这一步直接 gzip -dc initrd-file | cpio -idmv 就可以了
【 在 gnawux (我有分寸) 的大作中提到: 】
: cpio ?




☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 15:51:42 2006)  提到:

从哪看到的? 我man了cpio凑合弄了一个简陋的-i参数说是解档, 还可以用,
以前都tar, 没用过cpio.

【 在 shenmue (黑社会就是好) 的大作中提到: 】
: 这一步直接 gzip -dc initrd-file | cpio -idmv 就可以了





☆─────────────────────────────────────☆
   shenmue (黑社会就是好) 于  (Tue Jun  6 15:54:14 2006)  提到:

以前看过一点儿介绍 initrd 的文章,出处记不得了,呵呵
【 在 Dieken (风催草低) 的大作中提到: 】
: 从哪看到的? 我man了cpio凑合弄了一个简陋的-i参数说是解档, 还可以用,
: 以前都tar, 没用过cpio.




☆─────────────────────────────────────☆
   gnawux (我有分寸) 于  (Tue Jun  6 16:05:53 2006)  提到:

cpio 可以看 info

我也是前两天手工处理了一个 initrd 才迫不得已学的一点皮毛

【 在 Dieken (风催草低) 的大作中提到: 】
: 从哪看到的? 我man了cpio凑合弄了一个简陋的-i参数说是解档, 还可以用,
: 以前都tar, 没用过cpio.




☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 16:09:46 2006)  提到:

我的意思是想看initrd/initramfs的文档 :-)

【 在 gnawux (我有分寸) 的大作中提到: 】
: cpio 可以看 info
: 我也是前两天手工处理了一个 initrd 才迫不得已学的一点皮毛





☆─────────────────────────────────────☆
   nx (一棵二叉树王国的国王) 于  (Tue Jun  6 16:12:03 2006)  提到:

initrd 的还可以
initramfs 的看了好多遍都没弄明白是怎么回事

【 在 Dieken (风催草低) 的大作中提到: 】
: 我的意思是想看initrd/initramfs的文档 :-)




☆─────────────────────────────────────☆
   gnawux (我有分寸) 于  (Tue Jun  6 16:14:03 2006)  提到:

developerworks 前两天有一篇,不会是你写的吧……

【 在 Dieken (风催草低) 的大作中提到: 】
: 我的意思是想看initrd/initramfs的文档 :-)




☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 16:17:31 2006)  提到:

推荐看看linux-2.6/Documentation/initrd.txt里头的第一篇引文, 对于那个
怎么从一个根文件系统转到另一个根文件系统说的很好. 不错似乎没谈到initramfs
看完了对这个还是不了解, 直道看这个主题第一篇中的第二个链接那篇文章才明白为什么出来一个initramfs, 顺便做了个笔记.

想弄明白这个恐怕还得看devfs和udev怎么回事, 还有sysfs, 还有模块加载过程.

【 在 nx (一棵二叉树王国的国王) 的大作中提到: 】
: initrd 的还可以
: initramfs 的看了好多遍都没弄明白是怎么回事





☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 16:19:01 2006)  提到:

不是我写的, 我才看这个没几天, 好多东西不懂, 那篇文章有链接吗? 很感兴趣.

【 在 gnawux (我有分寸) 的大作中提到: 】
: developerworks 前两天有一篇,不会是你写的吧……





☆─────────────────────────────────────☆
   gnawux (我有分寸) 于  (Tue Jun  6 16:19:27 2006)  提到:

http://www-128.ibm.com/developerworks/cn/linux/l-k26initrd/index.html?ca=dwcn-newsletter-linux

【 在 Dieken (风催草低) 的大作中提到: 】
: 不是我写的, 我才看这个没几天, 好多东西不懂, 那篇文章有链接吗? 很感兴趣.




☆─────────────────────────────────────☆
   Dieken (风催草低) 于  (Tue Jun  6 16:25:22 2006)  提到:

好文, 非常感谢!
【 在 gnawux (我有分寸) 的大作中提到: 】
: http://www-128.ibm.com/developerworks/cn/linux/l-k26initrd/index.html?ca=dwcn-newsletter-linux

原创粉丝点击