介绍
在本实验中,你将学习如何使用 Linux 的 mkinitrd
命令来创建和定制初始 RAM 磁盘(initramfs)镜像,这是 Linux 启动过程中的关键组件。你将了解 mkinitrd
命令的用途,创建自定义的 initramfs 镜像,并使用该工具排查内核启动问题。本实验涵盖了磁盘和文件系统管理的基本技能,提供了实用的示例和逐步指导。
在本实验中,你将学习如何使用 Linux 的 mkinitrd
命令来创建和定制初始 RAM 磁盘(initramfs)镜像,这是 Linux 启动过程中的关键组件。你将了解 mkinitrd
命令的用途,创建自定义的 initramfs 镜像,并使用该工具排查内核启动问题。本实验涵盖了磁盘和文件系统管理的基本技能,提供了实用的示例和逐步指导。
在这一步中,你将学习 Linux 中 mkinitrd
命令的用途。mkinitrd
命令用于创建初始 RAM 磁盘(initramfs)镜像,这是 Linux 启动过程中的关键组件。
initramfs 是一个临时文件系统,在启动过程的早期阶段被加载到内存中。它包含了挂载根文件系统所需的驱动程序和模块,根文件系统可能位于各种存储设备上,例如硬盘、RAID 阵列或网络附加存储(NAS)。
如果没有 initramfs,内核将无法访问根文件系统并完成启动过程。mkinitrd
命令负责生成这个 initramfs 镜像,并且可以定制以包含系统所需的特定驱动程序、模块和工具。
让我们来探索 mkinitrd
命令及其用法:
sudo mkinitrd -v -f /boot/initramfs-$(uname -r).img $(uname -r)
示例输出:
Creating initramfs image file '/boot/initramfs-5.15.0-58-generic.img'
Copying modules to initramfs image...
Preparing initramfs image...
上述命令生成一个名为 initramfs-$(uname -r).img
的新 initramfs 镜像文件,并将其存储在 /boot
目录中。-v
选项启用详细输出,-f
选项强制创建新的镜像文件。
mkinitrd
命令从 uname -r
命令中读取内核版本,并使用它来生成相应内核的 initramfs 镜像。
在这一步中,你将学习如何使用 mkinitrd
命令创建自定义的 initramfs 镜像。在某些场景下,定制 initramfs 非常有用,例如当你需要包含默认 initramfs 中未包含的额外驱动程序、模块或工具时。
首先,我们创建一个目录来存储自定义 initramfs 文件:
mkdir ~/project/custom-initramfs
cd ~/project/custom-initramfs
接下来,我们为 initramfs 创建一个自定义配置文件。该文件将指定我们希望包含在镜像中的额外内容。
nano ~/project/custom-initramfs/initramfs.conf
在 initramfs.conf
文件中添加以下内容:
add_dracutmodules+="custom-module"
此配置将在 initramfs 镜像中包含一个名为 custom-module
的自定义模块。
现在,让我们生成自定义的 initramfs 镜像:
sudo mkinitrd -v -f /boot/custom-initramfs.img --with-modules --with-firmware --with-usb --with-i18n --with-nfs --with-crypt --with-dm --with-lvm --with-raid --with-md --with-fips --with-selinux --with-plymouth --with-shutdown --with-network --with-multipath --with-kernel-modules=custom-module
上述命令创建一个名为 custom-initramfs.img
的自定义 initramfs 镜像,并将其存储在 /boot
目录中。--with-*
选项指定了要包含在 initramfs 中的额外模块、驱动程序和工具。
示例输出:
Creating initramfs image file '/boot/custom-initramfs.img'
Copying modules to initramfs image...
Preparing initramfs image...
在这一步中,你将学习如何使用 mkinitrd
命令来排查内核启动问题。由 mkinitrd
生成的 initramfs 镜像是 Linux 启动过程中的关键组件,如果配置不当,可能会导致启动问题。
让我们通过修改 initramfs 镜像来模拟一个启动问题,然后使用 mkinitrd
来排查问题。
首先,我们为当前的 initramfs 镜像创建一个备份:
sudo cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
接下来,我们故意删除一个关键文件来破坏 initramfs 镜像:
sudo rm /boot/initramfs-$(uname -r).img
如果你现在尝试重启系统,很可能会遇到内核启动问题,因为 initramfs 镜像丢失了。
为了排查这个问题,我们可以使用 mkinitrd
命令重新创建 initramfs 镜像:
sudo mkinitrd -v -f /boot/initramfs-$(uname -r).img $(uname -r)
示例输出:
Creating initramfs image file '/boot/initramfs-5.15.0-58-generic.img'
Copying modules to initramfs image...
Preparing initramfs image...
运行 mkinitrd
命令后,initramfs 镜像应该会被重新创建,内核应该能够成功启动。
为了验证问题是否已解决,你可以重启系统并检查启动日志中是否有与 initramfs 相关的错误。
在本实验中,你首先学习了 Linux 中 mkinitrd
命令的用途,该命令用于创建初始 RAM 磁盘(initramfs)镜像。initramfs 是 Linux 启动过程中的关键组件,因为它包含了挂载根文件系统所需的驱动程序和模块。接着,你探索了如何通过包含默认 initramfs 中未包含的额外驱动程序、模块或工具来创建自定义的 initramfs 镜像。最后,你学习了如何使用 mkinitrd
命令排查内核启动问题,这在默认 initramfs 无法挂载根文件系统的场景中非常有用。