什么是 initial ram disk (缩写 initrd)
它是由 bootloader 初始化的内存盘。在 linux 启动之前,bootloader 会将它(通常是 initrd.img-xxx...xxx 文件)加载到内存中。内核启动的时候会将这个文件解开,并作为根文件系统使用。
设计 initrd 的主要目的是让系统的启动分为两个阶段。首先,带有最少但是必要的驱动的内核启动。然后,其它需要的模块将从 initrd 中根据实际需要加载。这样就可以不必将所有的驱动都编译进内核,而根据实际情况有选择地加载。对于启动较慢的设备如 usb 设备等,如果将驱动编译进内核,当内核访问其上的文件系统时,通常设备还没有准备好,就会造成访问失败。所以,通常在 initrd 中加载 usb 驱动,然后休眠几秒钟,带设备初始化完成后,再挂载其中的文件系统。
initrd 的具体形式
目前有两种形式:cpio-initrd 和 image-initrd。
image-initrd 的制作相对麻烦,处理流程相对复杂(内核空间->用户空间->内核空间 与初始化越来越多的在用户空间进行的趋势不符),本文不对其进行介绍。
cpio-initrd 的处理流程(内核空间->用户空间):
1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。
2. 内核判断 initrd 的文件格式,如果是 cpio 格式。
3. 将 initrd 的内容释放到 rootfs 中。
4. 执行 initrd 中的 /init 文件,执行到这一点,内核的工作全部结束,完全交给 /init 文件处理。