什么是initrd图像?如何在Linux中创建initrd镜像

时间:2020-03-05 15:27:43  来源:igfitidea点击:

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