InitRAMFS、Dracut 和 Dracut 紧急外壳

Linux启动过程 在进入决赛之前经历了几个阶段 图形或多用户目标. initramfs 阶段发生在根文件系统安装之前。 Dracut 是一个用于管理 initramfs 的工具。 dracut 紧急 shell 是一种交互模式,可以在加载 initramfs 时启动。

本文将展示如何使用 dracut 命令修改 initramfs。 还将演示一些可以从 dracut 紧急 shell 运行的基本故障排除命令。

初始化 RAMFS

初始化程序 代表初始随机存取存储器文件系统。 在现代 Linux 系统上,它通常存储在 /boot 目录下的文件中。 为其构建的内核版本将包含在文件名中。 每次安装新内核时都会生成一个新的 initramfs。

Linux 引导目录

默认情况下, Fedora 保留内核的前两个版本及其相关的 initramfs。 可以通过修改 installonly_limit 设置 /etc/dnf/dnf.conf 文件的值来更改此默认值。

您可以使用 lsinitrd 命令列出 initramfs 存档的内容:

LsInitRD 命令

上面的屏幕截图显示我的 initramfs 存档包含 nouveau GPU 驱动程序。 modinfo 命令告诉我 nouveau 驱动程序支持多种型号的 NVIDIA 显卡。 lspci 命令显示我电脑的 PCI 插槽中有一块 NVIDIA GeForce 显卡。 存档中还包含几个基本的 Unix 命令,例如 cat 和 cp。

默认情况下,initramfs 存档仅包含特定计算机所需的驱动程序。 这允许存档更小并减少计算机启动所需的时间。

Dracut 命令

dracut 命令可用于修改 initramfs 的内容。 为了 example,如果您要将硬盘驱动器移动到新计算机上,您可能希望将所有驱动程序临时包含在 initramfs 中,以确保操作系统可以在新计算机上加载。 为此,您将运行以下命令:

# dracut –force –no-hostonly

force 参数告诉 dracut 可以覆盖现有的 initramfs 存档。 no-hostonly 参数覆盖了仅包含与当前运行的计算机密切相关的驱动程序的默认行为,并导致 dracut 将所有驱动程序包含在 initramfs 中。

默认情况下,dracut 在当前运行的内核的 initramfs 上运行。 您可以使用 uname 命令显示您当前正在运行的 Linux 内核版本:

$ unname -r
5.0.5-200.fc29.x86_64

在新计算机上安装并运行硬盘驱动器后,您可以重新运行 dracut 命令以仅使用新计算机所需的驱动程序重新生成 initramfs:

# dracut –force

还有一些参数可以将任意驱动程序、dracut 模块和文件添加到 initramfs 存档中。 您还可以为 dracut 创建配置文件并将它们保存在 /etc/dracut.conf.d 目录下,以便您的自定义设置将自动应用于安装新内核时生成的所有新 initramfs 存档。 与往常一样,查看手册页以获取特定于您在计算机上安装的 dracut 版本的详细信息:

$男子德拉克特

Dracut 紧急外壳

Dracut 紧急外壳

有时在计算机启动过程的 initramfs 阶段会出现问题。 发生这种情况时,您将看到“进入紧急模式”打印到屏幕上,然后是 shell 提示符。 这使您有机会尝试手动修复并继续启动过程。

作为一个有点做作的 example,假设我在引导加载程序配置中不小心删除了一个重要的内核参数:

# sed -i ‘s/rd.lvm.lv=fedora/root //’ /boot/grub2/grub.cfg

下次我重新启动计算机时,它似乎会在试图找到根分区并最终放弃并进入紧急外壳时挂起几分钟。

从紧急外壳,我可以输入 journalctl 然后使用 空间 通过启动日志向下翻页的键。 在日志的末尾,我看到一条警告,上面写着“/dev/mapper/fedora-root 不存在”。 然后我可以使用 ls 命令找出存在的内容:

# ls /dev/mapper
控制 fedora-swap

嗯,fedora-root LVM 卷似乎丢失了。 让我们看看我可以使用 lvm 命令找到什么:

# lvm lvscan
ACTIVE ‘/dev/fedora/swap’ [3.85 GiB] 继承
非活动“/dev/fedora/home” [22.85 GiB] 继承
非活动“/dev/fedora/root” [46.80 GiB] 继承

啊哈! 这是我的根分区。 它只是不活跃。 我需要做的就是激活它并退出紧急外壳以继续启动过程:

# lvm lvchange -ay fedora/root
# 出口

这 Fedora 登录屏幕

以上 example 只演示基本概念。 你可以检查 故障排除部分德拉克特指南 再举几个例子。

可以通过将 rd.break 参数添加到内核命令行来手动访问 dracut 紧急 shell。 如果您需要在任何系统服务启动之前访问您的文件,这将非常有用。

查看 dracut.kernel 手册页以获取有关您的 dracut 版本支持哪些内核选项的详细信息:

$ man dracut.kernel