跳转至内容

dracut

来自 ArchWiki

dracut 创建一个初始镜像,内核使用该镜像预加载块设备模块(例如 IDE、SCSI 或 RAID),这些模块是访问根文件系统所必需的。安装 linux 后,您可以在 mkinitcpioboosterdracut 之间进行选择。dracut 被 Fedora、RHEL 和 Gentoo 等发行版使用。Arch 默认使用 mkinitcpio

您可以在 文档中阅读 dracut 的完整项目文档。

安装

安装 dracut 包。

提示 如果 dracut 在您的机器上 测试成功,您可以 卸载 mkinitcpio

用法

dracut 使用简单,通常不需要用户配置,即使在使用非标准设置时,例如 LVM on LUKS

为正在运行的内核生成 initramfs

# dracut --add-confdir no-network /boot/initramfs-linux.img
注意 在某些情况下,尤其是在首次安装系统时,上述命令可能无效。请使用以下命令:
# dracut -f --regenerate-all

运行以下命令生成备用 initramfs:

# dracut -f --add-confdir rescue /boot/initramfs-linux-fallback.img

请注意,从 dracut v108 开始,在通常配置下,备用 initramfs 应不再需要,因为默认的 initramfs 已包含大多数内核驱动程序。

/boot/initramfs-linux.img 指的是输出镜像文件。如果您使用的是其他内核,请考虑更改文件名。例如,对于 linux-lts 内核,输出文件应命名为 /boot/initramfs-linux-lts.img。但是,您可以随意命名这些文件,只要您的 引导加载器配置使用相同的文件名即可。

注意 通过这些命令创建的文件会嵌入所有已安装的 微码镜像。

附加选项

--force 标志会覆盖已存在的镜像文件。

--kver 选项指定要使用的内核。此选项的参数必须与 /usr/lib/modules 中存在的目录名称匹配。

更多标志可以在 dracut(8) 中找到。

高级配置

需要注意的是,在初始内存盘(initial ramdisk)阶段,执行各种任务有两种截然不同的方法:

基于 Shell (bash/busybox/dash) 的初始 RAM 磁盘
将启动一个 init 脚本,该脚本会扫描初始 RAM 磁盘的文件系统以查找要执行的 dracut 脚本。
基于 systemd (默认) 的初始 RAM 磁盘
systemd 在初始内存盘阶段开始时就已经启动。要执行的任务由常规的 systemd 单元文件决定。请参阅 systemd 启动过程

具体的变体取决于 systemd dracut 模块是否存在。有关更多详细信息,请参阅 #dracut 模块

可以通过在命令行中直接传递参数来配置 dracut(请参阅 dracut(8) § OPTIONS)。如果您希望始终使用一组特定的标志来执行 dracut,可以将指定配置保存在 /etc/dracut.conf.d/ 中的 .conf 文件中。例如:

/etc/dracut.conf.d/myflags.conf
hostonly="yes"
compress="lz4"
add_drivers+=" i915 "
omit_dracutmodules+=" systemd network "

您可以在 dracut.conf(5) 中查看更多配置选项。每个选项的完整描述可以在 dracut(8) 中找到。接下将描述一些常用选项。

dracut 模块

dracut 使用模块化方法来构建 initramfs(请参阅 dracut.modules(7))。dracut 的所有内置模块都位于 /lib/dracut/modules.d 中,可以通过 dracut --list-modules 列出。额外的模块可以由外部包提供,例如 dracut-sshd-gitAURdracut 的内置模块不幸缺乏文档,尽管它们的名称可能具有自解释性。

一些模块默认是激活/非激活的,可以通过 --add/--omit 命令行参数或 add_dracutmodules+=""/omit_dracutmodules+="" 永久配置条目行来激活/非激活。

/etc/dracut.conf.d/myflags.conf
# ...
add_dracutmodules+=" dracut modules to activate "
omit_dracutmodules+=" dracut modules to deactivate "
# ...

有关 dracut 模块的文档,请参阅 上游 dracut 文档

大多数 dracut 模块都依赖于其他 dracut 模块。例如,bluetooth dracut 模块依赖于 dbus dracut 模块。


TPM2

要通过 systemd-cryptenroll 利用 systemd 通过 TPM2 解锁 luks2 加密卷,请安装 tpm2-tools 包并启用 tpm2-tss dracut 模块。

早期内核模块加载

Dracut 通过其 --force_drivers 命令或 force_drivers+="" 配置条目行来启用早期加载(在 initramfs 阶段,通过 modprobe)。例如:

/etc/dracut.conf.d/myflags.conf
# ...
force_drivers+=" nvidia nvidia_modeset nvidia_uvm nvidia_drm "
# ...

内核命令行选项

内核命令行选项可以放在 /etc/dracut.conf.d/.conf 文件中,并通过 kernel_cmdline= 标志设置。Dracut 将自动源化该文件,并创建一个 01-default.conf 文件并将其放置在 initramfs 目录 /etc/cmdline.d/ 中。例如,您的内核命令行选项文件可能如下所示:

/etc/dracut.conf.d/cmdline.conf
kernel_cmdline="rd.luks.uuid=luks-f6c738f3-ee64-4633-b6b0-eceddb1bb010 rd.lvm.lv=arch/root rd.lvm.lv=arch/swap root=/dev/arch/root rootfstype=ext4 rootflags=rw,relatime"

杂项说明

无需为 dracut 指定根块设备。根据 dracut.cmdline(7)

内核使用的根设备一如既往地在引导配置文件中的内核命令行上指定。

但是,早期设置某些参数可能很有用,并且您可以启用附加功能,例如提示输入其他命令行参数。有关所有选项,请参阅 dracut.cmdline(7)。以下是一些示例配置选项:

  • 从交换分区恢复: resume=UUID=80895b78-7312-45bc-afe5-58eb4b579422
  • 提示输入其他内核命令行参数: rd.cmdline=ask
  • 即使设置了 quiet 标志,也打印信息性输出: rd.info

统一内核镜像 (Unified kernel image)

dracut 可以使用 --uefi 命令行选项或 uefi="yes" 配置选项生成 统一内核镜像

技巧与提示

查看生成镜像信息

您可以查看生成的 initramfs 镜像的信息,您可能希望在分页器中查看该信息:

# lsinitrd /path/to/initramfs_or_uefi_image | less

此命令将列出创建镜像时传递给 dracut 的参数、包含的 dracut 模块列表以及包含的所有文件列表。

更改压缩程序

为了减少压缩最终镜像所花费的时间,您可以更改使用的压缩程序。

警告 确保您的内核已编译支持您选择的解压缩,否则您将无法引导。您还必须安装所选的压缩程序包。

只需将以下任意一行(不要多行)添加到您的 dracut 配置中

compress="cat"
compress="gzip"
compress="bzip2"
compress="lzma"
compress="xz"
compress="lzo"
compress="lz4"
compress="zstd"

gzip 是默认使用的压缩程序。compress="cat" 将生成未压缩的 initramfs。

您也可以使用非官方支持的压缩程序。

compress="program"

性能考量

一些优化引导和 initramfs 创建性能的考虑因素包括:

  • 了解并配置最快的压缩。如果内核模块已经压缩,那么在创建时可能无需重新压缩 initramfs。
  • 了解将 systemd 包含到 initramfs 中的影响。如果它减慢了速度,请将其省略。如果它加快了速度,请将其包含。
  • 使用 copy-on-write 文件系统时,考虑使用 dracut-cpio。请参阅 --enhanced-cpio 选项以了解适用性。
  • 最小化 initramfs 中包含的内核模块和 dracut 模块的数量。例如:如果安装了 nfs-utils(但不需要引导),那么您需要显式省略 nfs dracut 模块,否则默认配置生成的 initramfs 将启用网络引导 - 请参阅 https://github.com/dracut-ng/dracut-ng/pull/297
  • 考虑添加 busybox dracut 模块以替换 bash。
  • 考虑 hostonlyhostonly_mode=strict

内核升级时生成新的 initramfs

dracut 包包含 pacman 的钩子,可在每次内核升级时自动生成新的 initramfs 镜像。

如果 KERNEL_INSTALL_INITRD_GENERATOR 在主系统上设置,则 dracut 钩子不会使用 dracut 生成 initramfs。

提示 dracut-ukifyAUR 包是使用 systemd-ukify 生成 统一内核镜像的现代方式。与下面的方法不同,您可以通过在 /etc/dracut-ukify.conf 中配置密钥和证书来签名整个内核镜像(包括 initramfs)(请注意,它无法使用在 dracut 的配置文件夹中配置的密钥和证书)。它能够生成 EFI 可执行的 initramfs 镜像(即 esp/EFI/Linux/linux-kernel-machine_id-build_id.efi)。此目录中的 EFI 二进制文件会被 systemd-boot 自动检测,因此不需要在 /boot/loader/loader.conf 中设置条目。请注意,在使用这些时,90-dracut-install 钩子可能仍然会在 /boot/ 中生成非 EFI initramfs 镜像,例如 initramfs-linux.img。这些可能没有任何用途,因此会浪费 ESP 分区空间。要阻止创建这些镜像,请以 root 身份运行 touch /etc/pacman.d/hooks/90-dracut-install.hook

您还应该阻止 mkinitcpio 创建和删除 initramfs 镜像,方法是卸载 mkinitcpio 或使用以下命令:

# ln -sf /dev/null /etc/pacman.d/hooks/90-mkinitcpio-install.hook
# ln -sf /dev/null /etc/pacman.d/hooks/60-mkinitcpio-remove.hook

蓝牙键盘支持

当检测到蓝牙键盘时,Dracut 会自动启用蓝牙模块。但是,dracut 必须处于 hostonly 模式才能自动发现蓝牙键盘。

Limine 引导加载器支持

limine-dracut-supportAUR 包利用 limine-entry-tool 结合 dracut 和 pacman 钩子,自动在 Limine 引导加载器中安装和移除内核和引导条目。有关更多信息,请参阅 Limine#Boot entry automation

故障排除

休眠

如果从休眠恢复不起作用,您可能需要配置 dracut 以包含 resume 模块。您需要 添加一个配置文件

/etc/dracut.conf.d/resume-from-hibernate.conf
add_dracutmodules+=" resume "

如果适用于您的系统,您可能还想查看 从加密交换分区恢复的说明,包括 dracut 特定说明

LVM / 软件 RAID / LUKS

如果内核在自动发现和挂载 LVM / 软件 RAID / LUKS 块时遇到问题,您可以尝试使用以下内核命令行选项重新生成 initramfs:

rd.auto rd.lvm=1 rd.dm=1 rd.md=1 rd.luks=1

A stop job is running for "brltty"

如果您在启动时遇到问题,或者系统在等待 brltty 时出现长时间的关机过程,请将以下内容添加到 dracut 配置行:

omit_dracutmodules+=" brltty "

或者,如果不需要,卸载 brltty

No usable keyslot is available

Cannot use whirlpool hash for keyslot encryption.
Keyslot open failed.
No usable keyslot is available.

出现类似上述消息的引导失败通常只需要用户通过 add_dracutmodules 包含 crypt 模块。

参见