什么是initrd
什么是initrd
initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。
在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。
在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。
这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。
第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是 加载根文件系统存储介质的驱动模块。
initrd产生原因
要想明白initrd产生的原因,带要从linux启动说起。其实装入本地linux系统时可以不用initrd,只要在kernel参数中加入root参数就可以了。
在boot loader如grub等装入kernel后, kernel需要执行系统中的/sbin/init, 读取这个文件就必须先mount根文件系统。 早期是通过启动时的root=参数告诉内核根文件系统在哪个设备上。
随着硬件和技术的发展,现在根文件系统可能位于一个网络存储如NFS上, 可能由于RAID而散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,这时root=参数就显得不够了。
为了应付这种局面, 先后出现两种机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动过程的桥梁:initrd和initramfs。
两者有类似的地方,比如都是由内核执行其上的某个程序(initrd是/linuxrc, initramfs是/init),由这个程序决定加载什么驱动以及如何装载根文件系统。
例如,把linux装入U盘中时,就要用到initrd。这里不是指把系统做成initrd直接加载成内存式linux,而是像本地硬盘上那样是非镜像型的linux系统。
为什么必须要用initrd?我们可以从启动过程来看。首先,由如GRUB的引导加载器加载内核,这时可以识别U盘,如果你是从U盘启动的,那么U盘为hd0。这一切都是GRUB可以识别U盘的存在。
当内核加载后情况就不一样了,内核之中一般是没有U盘驱动的,那它就 找不到U盘,更不用说U盘中的系统了。所以就要用initrd来加载U盘驱动,并执行系统中的/sbin/init。
initrd 的用途
1. linux 发行版的必备部件
linux 发行版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd 技术是解决该问题的关键技术。Linux 发行版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,生成包含安装系统硬件驱动的 initrd,无非是一种即可行又灵活的解决方案。
2. livecd 的必备部件
同 linux 发行版相比,livecd 可能会面对更加复杂的硬件环境,所以也必须使用 initrd。
3. 制作 Linux usb 启动盘必须使用 initrd
usb 设备是启动比较慢的设备,从驱动加载到设备真正可用大概需要几秒钟时间。如果将 usb 驱动编译进内核,内核通常不能成功访问 usb 设备中的文件系统。因为在内核访问 usb 设备时, usb 设备通常没有初始化完毕。所以常规的做法是,在 initrd 中加载 usb 驱动,然后休眠几秒中,等待 usb设备初始化完毕后再挂载 usb 设备中的文件系统。
4. 在 linuxrc 脚本中可以很方便地启用个性化 bootsplash。