zl程序教程

您现在的位置是:首页 >  系统

当前栏目

什么是 Initrd 映像?如何在 Linux 中创建 initrd 映像

Linux 如何 什么 创建 映像
2023-09-14 09:15:45 时间

Linux 系统的引导过程涉及多个阶段。其中包括 BIOS 初始化、读取 MBR、引导加载程序、内核初始化和 init 进程。

initrd(初始 ramdisk)在引导系统中起着非常重要的作用。本教程讨论 initrd ramdisk 以及在需要重新创建它时如何创建它。

GRUB 引导加载程序和 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。initrd 可以使用“mkinitrd”命令创建。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 /boot/initrd-latest.img

/boot/initrd-latest.img: gzip compressed data, from Unix, last modified: Fri Aug 3 10:47:47 2012, max compression