LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 21651|回复: 31

initrd 有什麼用?[附原理详解]

[复制链接]
发表于 2004-6-13 20:24:13 | 显示全部楼层 |阅读模式
如果常常在不同的硬件上跑, initrd 很不錯的, 但其他的用途卻想不出?, 兄弟們知道的請說說
发表于 2004-6-13 20:36:30 | 显示全部楼层
主要是为了解决vmlinuz太大的问题,用initrd可以解决这个问题。否则的话在2.6的内核中启动会失败的。
 楼主| 发表于 2004-6-13 21:51:09 | 显示全部楼层
最初由 7dehao 发表
主要是为了解决vmlinuz太大的问题,用initrd可以解决这个问题。否则的话在2.6的内核中启动会失败的。

多大才太大啊?
发表于 2004-6-13 22:08:58 | 显示全部楼层
最初由 7dehao 发表
主要是为了解决vmlinuz太大的问题,用initrd可以解决这个问题。否则的话在2.6的内核中启动会失败的。


我一直都是自己编译2.6的内核,一直都没有用initrd,我想可能是因为make modules_install
的时候执行了depmod -a   这样启动的时候内核会加载/lib/modules/2.6* 下相应的模块,所以不用指定initrd吧!

不知道是不是这样,猜的!
发表于 2004-6-13 22:13:59 | 显示全部楼层
编译是选了ramdisk
发表于 2004-6-13 22:16:34 | 显示全部楼层
最初由 yangtou 发表
编译是选了ramdisk


是这个的原因????
发表于 2004-6-14 00:27:32 | 显示全部楼层
那顺带问一下:System.map这个文件又是什么用的呢?
我编译的2。6内核出来两 个用得上的文件,system.map是一个是bzImage文件,就可以使用新的内核来启动linux了,兄弟们有明白的讲讲这两 个文件都用来做什么,bzImage应该就是内核映像文件了,它里面都是一些驱动,内存管理,任务调度什么的吗?
因为不解,所以发问,兄弟们不要见笑
发表于 2004-7-18 17:38:06 | 显示全部楼层

The main motivation for implementing initrd was to allow for modular kernel configuration at system installation.

给出我对initrd man手册的部分翻译(粗糙得很,愿各位兄弟修正)。
Initrd

名称
initrd -- 由启动加载器进行初始化的RAM DISK

描述
/dev/initrd这个特殊文件是一个只读的块设备文件。/dev/initrd设备文件是一个在内核被启动之前由启动加载器进行初始化的RAM disk。
随后,内核利用/dev/initrd设备文件的内容进行两个阶段的(系统)自举。
在(系统)自举的第一个阶段,内核进行初始化,根据/dev/initrd的内容挂载一个原始根文件系统。
在第二个阶段,一些附加的驱动或者其他模块从原始的根设备中被加载。在加载完附加模块后,一个新的根文件系统(也就是常规的根文件系统)从别的设备被挂载。

自举操作流程
使用initrd进行系统自举,系统初始化如下:

1.启动加载器把内核程序以及/dev/initrd的内容加载到内存

2.在内核初始化过程中,内核把/dev/initrd设备的内容解压缩并拷贝到/dev/ram0设备上,随之释放被/dev/initrd占用的内存空间

3.接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统

4.如果(不知道如何翻译indicated)常规根文件系统也是原始根文件系统(举例来说,/dev/ram0),那么内核跳至最后一步正常启动

5.如果可执行文件/linuxrc存在于原始根文件系统上,/linuxrc就以uid为0的帐户身份被执行。(/linuxrc文件必须具有可执行属性,它可以是包括shell脚本在内的任何有效的可执行文件)

6.如果/linuxrc没有被执行或者当/linuxrc(的运行)终止时,常规根文件系统被挂载。(如果/linuxrc退出时在原始根文件系统上挂载了任意文件系统,那么内核的行为则是不定的。阅读注意事项以确定当前的内核行为)

7.如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。(当从/移动到/initrd而/dev/ram0没有被卸载时,会导致进程仍能从/dev/ram0运行)。如果/initrd目录不存在,并且当/linuxrc退出时任何进程仍能从/dev/ram0运行,内核的行为是不定的。阅读注意事项以确定当前内核的行为。)

8.正常的启动过程(比如/sbin/init的调用)将在常规根文件系统上进行
...
注意事项
1.在当前内核下,当/dev/ram0从/被移动到/initrd时,任何已挂载的文件系统依然能被访问。然而,/proc/mounts条目不会被更新。
2.在当前内核下,如果/initrd不存在,如果/dev/ram0被其他进程使用中或者有任何文件系统被挂载其上,/dev/ram0将不会被完全卸载。如果/dev/ram0没有被完全卸载,那么/dev/ram0将驻留在内存
发表于 2004-7-18 17:50:04 | 显示全部楼层
给出两个有用的链接以供参考:
Knoppix的initrd手册(其实也是man手册)
http://www.knoppix.net/docs/index.php/initrd
Knoppix Custom Kernel How-to(其实initrd常用于livecd,留意下文的knoppix boot process一段)
http://www.knoppix.net/docs/index.php/KnoppixRemasteringHowto
发表于 2004-7-18 17:53:18 | 显示全部楼层
最初由 aries1998 发表
我一直都是自己编译2.6的内核,一直都没有用initrd,我想可能是因为make modules_install
的时候执行了depmod -a   这样启动的时候内核会加载/lib/modules/2.6* 下相应的模块,所以不用指定initrd吧!

不知道是不是这样,猜的!

如果你的平台是redhat,内核会自动调用redhat提供的脚本来生成initrd,并更新grub或者lilo的配置文件。这透明的一步大家可能都会忽视掉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表