什么是initrd图像?如何在Linux中创建initrd镜像
Linux系统的启动过程涉及许多阶段。
这些包括BIOS初始化,读取MBR,Bootloader,内核初始化和init过程。
initrd(初始ramdisk)在启动系统方面发挥着非常重要的作用。
本教程讨论initrd ramdisk以及我们如何创建它,如果需要重新创建它。
grub bootloader和initrd
引导加载程序是在启动过程中运行的第一个软件程序。
它负责启动操作系统。
Bootloader将内核加载到内存中,内核挂载根分区,以便它可以启动第一个进程,例如:init进程。
让我们看看引导加载程序为这些任务执行的命令:
root (hd0,0) kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-238.el5.img
第一个命令"root(hd0,0)"告诉引导加载程序在硬盘HD0的第一分区上存在内核图像(即HD0,0)。
这是内核图像的位置。
第二个命令是内核图像本身。
在这种情况下,它是"/vmlinuz-2.6.18-238.el5"。
传递给此命令的参数是RO和root。
Ro指定只读模式,根告诉root文件系统所在的分区。
内核在只读模式下安装此根域分区。
第三个命令是Initrd的位置。
现在要了解Initrd是什么,让我们看一下封装时内核面孔的问题。
鸡和蛋模块问题
我们刚刚看到内核必须以只读模式安装根分区。
但是根文件系统可以在具有以下一个或者多个功能中的分区上:
Logical Volume Management (as in our case). Software RAID. NFS. Encrypted partition. SCSI controller support.
内核需要这些设备的模块,因为它们不会被编译为内核本身。
因此,内核将在运行时加载这些设备的模块。
这些模块存在于"/lib/modules /"目录中。
该目录存在于根文件系统本身上,尚未安装根分区(这就是这一切的方式)。
那么,内核如何访问驻留在根分区上的根分区的模块本身(不安装它)?
这里的Initrd来拯救。
initrd ramdisk包含安装根分区所需的模块。
此INITRD驻留在存在内核图像的同一分区上。
因此,内核在内存中加载INITRD,访问模块并在只读模式下安装根分区。
创建initrd.
当文件系统硬件或者软件更改时,我们需要重新创建initrd。
可以使用"mkinitrd"命令创建initrd。
initrd的位置是/boot目录。
正在创建initrd镜像的内核版本需要作为mkinitrd命令的参数传递。
可以使用uname命令检查当前的内核版本。
# uname -r 2.6.18-238.el5
我们可以使用此命令通过命令替换来传递所需的参数:
# mkinitrd /boot/initrd-latest.img $(uname -r)
$(uname -r)将在其位置替换命令"uname -r"的输出。
initrd图像是压缩图像。
我们可以使用file命令查看此方法:
# file /boot/initrd-latest.img /boot/initrd-latest.img: gzip compressed data, from Unix, last modified: Fri Aug 3 10:47:47 2012, max compression