LinuxSir.cn,穿越时空的Linuxsir!

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

/initrd目录的作用和当删除时出现的错误

[复制链接]
发表于 2004-12-16 22:23:13 | 显示全部楼层 |阅读模式
自己的机器安装的redhat linux 9(以下为rh9)好多次了,每次出了故障搞不定时就是-----重装

其中有一个排错,是自己多次摸索出来的,希望对大家有用!

在安装好rh9后,查看根目录有一个 /initrd,很多的linux书上没有提到为个目录!它是一个非标准目录,查看了一个,里面是空的!于时出于清洁系统的目的
rm -rf /initrd

结果在下次重启时,发现系统不能启动!
内核load之后,提示无法mount 根目录,找不到init

自己以前有过编译内核的经验,好几次也是编译内核无法工作,因为配置的原因而无法mount根目录!

这次出现同样的问题肯定不会是内核问题,因为我用是rh9自带的内核!


好几天没有搞定这个问题,只好重装!
初学者往往是这样,以前为了运行级别3和5,我也重装过几次……

重装后
mv /initrd ~/
重启后出了问题!当然问题可能出在/initrd这个目录上了!

用急救盘启动,将原来的/initrd目录还原!
重启ok,l正常 !

结论:/initrd这个目录是空目录,但是内核在启动时会用到它!如果册除它,将无法启动!!!
发表于 2004-12-16 22:34:39 | 显示全部楼层
系统在启动前的内核是压缩的(和ramdisk有关),启动时需要解压缩,这个目录是解压缩时的临时目录,当启动完后又将该目录清空。所以不能删除
发表于 2004-12-17 09:24:37 | 显示全部楼层
如果你man initrd就不会有这样的疑问!
发表于 2004-12-17 10:14:08 | 显示全部楼层

这样的好贴应该——顶!!!

好贴!很有帮助啊!两位大侠的回复也很精!谢谢!!!
 楼主| 发表于 2004-12-17 13:11:26 | 显示全部楼层

多谢!

man得太好的结果
发表于 2004-12-21 11:12:55 | 显示全部楼层
哈哈!!!支持!!
发表于 2004-12-21 12:50:01 | 显示全部楼层
如果考试的时候,不小心出现这个故障,在恢复,会有问题么
发表于 2006-5-22 20:37:38 | 显示全部楼层
initrd这个目录非常重要,是内核挂载硬盘的rootfs之前文件系统的挂载点。这个initrd的man,以及rh的reference guide都提到过。
回复 支持 反对

使用道具 举报

发表于 2006-5-24 11:35:04 | 显示全部楼层

这原贴有些老了,麻烦不要再顶起来

有些老了

linux 2.6 的 cpio-initrd 跟早期 linux 的 image-initrd 不太一样了

linux2.6 内核的 initrd 的文件格式由原来的 image-initrd 文件系统镜像文件转变成了 cpio 格式(  cpio-initrd  ),变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。



先看Linux2.4内核对 Initrd 的处理流程
Linux2.4内核的initrd的格式是文件系统镜像文件,称为image-initrd
linux2.4内核对initrd的处理流程如下:
1. boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储着initrd。
2. 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。
3. 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。
4. 如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
5. 执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
6. /linuxrc 执行完毕,真正的根文件系统被挂载。
7. 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不存在, /dev/ram0 将被卸载。
8. 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。 linux2.4 内核的 initrd 的执行是作为内核启动的一个中间阶段,也就是说 initrd 的 /linuxrc 执行以后,内核会继续执行初始化代码,




再看Linux2.6 内核对 Initrd 的处理流程
cpio-initrd 的处理流程

1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。

2. 内核判断initrd的文件格式,如果是cpio格式。

3. 将initrd的内容释放到rootfs中。

4. 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。




Linux 2.6 的 cpio-initrd 相对以前的,最主要的变化是
1. cpio-initrd并没有使用额外的ramdisk,而是将其内容输入到rootfs中,其实rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等步骤。

2. cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完/linuxrc进程后,还要进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。
回复 支持 反对

使用道具 举报

发表于 2006-5-28 09:34:05 | 显示全部楼层
谢谢斑竹的授业解惑。我在RHEL4的根目录中的确做过删除/initrd的操作,发现对启动没有影响,正在困惑。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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