分类: LINUX
2010-01-28 19:56:05
Linux 的 initrd 技术是一个非常普遍使用的机制,linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式,变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。本文首先介绍了什么是 initrd 技术,然后分别介绍了 Linux2.4 内核和 2.6 内核的 initrd 的处理流程。最后通过对 Linux2.6 内核的 initrd 处理部分代码的分析,使读者可以对 initrd 技术有一个全面的认识。为了更好的阅读本文,要求读者对 Linux 的 VFS 以及 initrd 有一个初步的了解。
1. boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储着initrd。 2. 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。 3. 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。 4. 如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动。 7. 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不存在, /dev/ram0 将被卸载。 2. 内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。 3. 内核将initrd的内容保存在rootfs下的/initrd.image文件中。 4. 内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。 5. 接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。 6. .如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。 9. 如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在, /dev/ram0将被卸载。 4.cpio-initrd同image-initrd的区别与优势 没有找到正式的关于cpio-initrd同image-initrd对比的文献,根据笔者的使用体验以及内核代码的分析,总结出如下三方面的区别,这些区别也正是cpio-initrd的优势所在:
2. cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完 /linuxrc进程后,还要进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。通过图1可以更加清晰的看出处理流程的区别:
image-initrd: 前面已经定义过,专指传统的文件镜像格式的initrd。
|