Linux mkinitrd 命令实战示例

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 Linux 的 mkinitrd 命令来创建和定制初始 RAM 磁盘(initramfs)镜像,这是 Linux 启动过程中的关键组件。你将了解 mkinitrd 命令的用途,创建自定义的 initramfs 镜像,并使用该工具排查内核启动问题。本实验涵盖了磁盘和文件系统管理的基本技能,提供了实用的示例和逐步指导。

Linux 命令速查表


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/BasicFileOperationsGroup -.-> linux/cp("File Copying") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") linux/SystemInformationandMonitoringGroup -.-> linux/uname("System Information Displaying") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills linux/cp -.-> lab-422811{{"Linux mkinitrd 命令实战示例"}} linux/mkdir -.-> lab-422811{{"Linux mkinitrd 命令实战示例"}} linux/uname -.-> lab-422811{{"Linux mkinitrd 命令实战示例"}} linux/nano -.-> lab-422811{{"Linux mkinitrd 命令实战示例"}} end

理解 mkinitrd 命令的用途

在这一步中,你将学习 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 镜像。

创建自定义 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 命令来排查内核启动问题。由 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 无法挂载根文件系统的场景中非常有用。

Linux 命令速查表