dracut

来自 ArchWiki

dracut 创建内核使用的初始镜像,用于预加载访问根文件系统所需的块设备模块(例如 IDE、SCSI 或 RAID)。安装 linux 时,您可以在 mkinitcpiodracut 之间选择。dracut 被 Fedora、RHEL、Gentoo 和 Debian 等使用。Arch 默认使用 mkinitcpio

您可以阅读 dracut 的完整项目文档,请参阅文档

安装

安装 dracut 软件包,或 dracut-gitAUR 获取最新的开发版本。

提示: 如果 dracut 在您的机器上工作在您测试之后,您可以 卸载 mkinitcpio

用法

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

为正在运行的内核生成 initramfs

# dracut --hostonly --no-hostonly-cmdline --add-confdir no-network /boot/initramfs-linux.img

要永久启用 hostonly 模式(这样您就不需要在命令行中包含它),您可以将以下内容添加到您的 dracut 配置中

/etc/dracut.conf.d/hostonly.conf
hostonly="yes"
注意: 在某些情况下,尤其是在首次安装系统时,上述命令将不起作用。请使用以下命令
# dracut --regenerate-all

要生成回退 initramfs,请运行

# dracut /boot/initramfs-linux-fallback.img

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

注意: 通过这些命令创建的文件嵌入了任何已安装的 微代码 镜像。

附加选项

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

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

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

高级配置

重要的是要注意,在初始 ramdisk 阶段执行各种任务的方式有两种截然不同的方法

基于 Shell (bash/busybox/dash) 的初始 ramdisk
启动一个 init 脚本,该脚本反过来扫描初始 ramdisk 的文件系统以查找要执行的 dracut 脚本。
基于 systemd(默认) 的初始 ramdisk
systemd 已经在初始 ramdisk 阶段的开始时启动。要执行的任务由常规 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 模块。例如,蓝牙 dracut 模块依赖于 dbus dracut 模块。下表仅列出直接 dracut 模块依赖项,即给定 dracut 模块的 module-setup.sh 中列出的给定模块所需的软件包。

有关其他 dracut 模块文档,请参阅 上游 dracut wiki

dracut 模块 所需软件包 描述
bluetooth bluez 蓝牙(键盘)
btrfs btrfs-progs 扫描块设备上的 Btrfs
busybox busybox 允许使用 BusyBox(风险自负)
crypt cryptsetup 支持加密的 Dm-crypt 文件系统
dash dash 允许使用 Dash(风险自负)
dmraid dmraid, multipath-tools dmraid dracut 模块支持
multipath multipath-tools Multipath dracut 模块支持
dmsquash-live-ntfs fuse3, ntfs-3g Live on NTFS
lvm lvm2 支持 LVM
mdraid mdadm 支持 MD 设备,也称为软件 RAID 设备
memstrack memstrackAUR 支持 memstrack
nvdimm ndctl NVDIMM 支持
plymouth plymouth Plymouth 启动画面
rescue 包含救援模式的各种实用程序(例如 ping、ssh、vi、fsck.*)
resume 允许 initramfs 从低功耗状态恢复
rngd 在早期启动时启动随机数生成器服务
syslog rsyslogAUR 启用使用 Rsyslog 进行日志记录
squash squashfs-tools 支持构建 squash 后的 initramfs
tpm2-tss tpm2-tools 可信平台模块
base 包含所需实用程序的基础模块
bash bash Bash 是首选解释器(如果有更多可用)
biosdevname biosdevnameAUR 启用 BIOS 网络设备重命名
caps 支持在 init 之前删除 capabilities
convertfs 在下次启动时将 / 合并到 /usr 中
crypt-gpg gnupg 为加密操作和智能卡添加 GPG 支持(可能需要 GPG 密钥)
crypt-loop 为加密的环回设备添加支持(对称密钥)
dbus dbus-broker 或 dbus-daemon 的虚拟软件包
dbus-broker dbus-broker 使用 dbus-broker 作为 dbus 服务提供商
dbus-daemon dbus 使用 dbus 作为 dbus 服务提供商
debug 启用调试功能
dm 添加 device-mapper 的支持
dmsquash-live-autooverlay 在根文件系统父块设备的可用空间中创建一个分区,用于 overlayfs
dracut-systemd 基础 systemd dracut 模块
drm 包含提供 DRM 支持的内核模块
ecryptfs 添加 ecryptfs 文件系统支持
fido2 允许使用 FIDO2 安全令牌解锁加密的文件系统
fips 强制执行 FIPS 安全标准法规
fs-lib 文件系统工具库(包括 fsck.* 和 mount)
fstab-sys 安排在 rootfs 之前挂载任意分区
i18n 包含键盘映射、控制台字体等。
img-lib 包含各种用于解压缩镜像的工具库
integrity 添加对扩展验证模块的支持
kernel-modules 用于根文件系统和其他启动时设备的内核模块
kernel-modules-extra 额外的树外内核模块
lunmask 屏蔽 LUN 设备以仅选择启动所需的设备
lvmmerge 合并 lvm 快照
lvmthinpool-monitor 监控 LVM thinpool 服务
masterkey 可用于解密其他密钥和 keyutils 的主密钥
modsign 添加签名内核模块支持
overlayfs overlayfs 的内核模块
pcsc 添加对 PCSC 智能卡的支持
pkcs11 包含 PKCS#11 库
pollcdrom 启用 CD-ROM 轮询
qemu 包含 QEMU 环境的内核模块
rescue 救援模式的实用程序(例如 ping、ssh、vi、fsck.*)
rootfs-block 安排挂载包含 rootfs 的块设备
securityfs 安排提前挂载 securityfs
selinux 安排加载 selinux 策略
shutdown 设置在关机时运行的钩子
systemd 添加 systemd 作为早期 init 初始化系统
terminfo 包含 terminfo 文件
udev-rules 包含 udev 和一些基本规则
uefi-lib 包含 UEFI 工具的库
usrmount 挂载 /usr
virtfs 添加虚拟文件系统(9p)支持
virtiofs 添加 virtiofs 文件系统支持
warpclock 如果 adjtime 设置为 LOCAL,则设置内核的时区并重置系统时间
watchdog 包含 watchdog 设备管理;仅在不使用 systemd 时有效
watchdog-modules 包含在启动早期加载的 watchdog 内核模块

Dracut 模块,旨在在早期启动期间需要 IP 地址 时使用。

networking dracut 模块 所需软件包 描述
cifs cifs-utils 支持 Samba
nbd nbd 支持网络块设备
network-manager networkmanager NetworkManager 支持
nfs nfs-utils NFS 支持 - NFSv3 和 NFSv4
nvmf nvme-cli, jq NVMe over Fibre Channel 和 NVMe-over Fabrics 支持
iscsi open-iscsi ISCSI 支持
ssh-client openssh 安装 ssh 和 scp 以及配置文件和指定的密钥
network-legacy dhclient, iproute2, iputils 传统 网络 支持
connman connman 支持 ConnMan 网络
kernel-network-modules 包含并加载网络设备的内核模块
livenet 获取 SquashFS 镜像的实时更新
network 网络服务提供商的虚拟模块
url-lib 包含 curl 和 SSL 证书的库
qemu-net 包含 QEMU 环境的网络内核模块
systemd-network-management 为 systemd 添加网络管理。包括 systemd-networkd、systemd-resolved 和一些其他与网络相关的 dracut 模块
systemd-networkd Systemd-networkd
net-lib 带有 ip 的网络库

TPM2

要通过 systemd-cryptenroll 使用 systemd 解锁 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

统一内核镜像

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 中的影响。如果它减慢了速度,请省略它。如果它使速度更快,请包含它。
  • 当使用写时复制文件系统时,请考虑使用 dracut-cpio。有关适用性,请参阅 --enhanced-cpio 选项。
  • 尽量减少 initramfs 中包含的内核模块和 dracut 模块的数量。例如:如果安装了 nfs-utils(但启动不需要),则您需要显式省略 nfs dracut 模块,否则将在默认配置中生成的 initramfs 中启用网络启动 - 请参阅 https://github.com/dracut-ng/dracut-ng/pull/297
  • 考虑使用 busybox 而不是 bash。
  • 考虑 hostonly。

在内核升级时生成新的 initramfs

可以在每次内核升级时自动生成新的 initramfs 镜像。此处的说明适用于默认的 linux 内核,但为其他内核添加额外的钩子应该很容易。

提示
  • dracut-ukifyAUR 软件包是使用 systemd-ukify 生成 统一内核镜像 的现代方法。与以下方法不同,您可以签名您的整个内核镜像 包括 initramfs。在您的 dracut 配置中使用 uefi_secureboot_certuefi_secureboot_key 选项(dracut.conf(5))。
  • dracut-hookAUR 软件包包含类似于以下的钩子和脚本。或者,如果您想要一个作为 EFI 可执行文件的 initramfs 镜像(即 esp/EFI/Linux/linux-kernel-machine_id-build_id.efi),您可能需要 dracut-uefi-hookAURdracut-hook-uefiAUR。此目录中的 EFI 二进制文件由 systemd-boot 自动检测,因此不需要在 /boot/loader/loader.conf 中添加条目。

由于找出内核版本的命令有些复杂,因此它本身在 pacman 钩子中不起作用。因此,在您的系统上的任何位置创建一个脚本。在此示例中,它将在 /usr/local/bin/ 中创建。

该脚本还将新的 vmlinuz 内核文件复制到 /boot/,因为内核软件包不再将文件放置在 /boot/ 中。[1]

/usr/local/bin/dracut-install.sh
#!/usr/bin/env bash

args=('--force' '--no-hostonly-cmdline')

while read -r line; do
	if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then
		read -r pkgbase < "/${line}"
		kver="${line#'usr/lib/modules/'}"
		kver="${kver%'/pkgbase'}"

		install -Dm0644 "/${line%'/pkgbase'}/vmlinuz" "/boot/vmlinuz-${pkgbase}"
		dracut "${args[@]}" --hostonly "/boot/initramfs-${pkgbase}.img" --kver "$kver"
		dracut "${args[@]}" --add-confdir rescue  "/boot/initramfs-${pkgbase}-fallback.img" --kver "$kver"
	fi
done
/usr/local/bin/dracut-remove.sh
#!/usr/bin/env bash

while read -r line; do
	if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then
		read -r pkgbase < "/${line}"
		rm -f "/boot/vmlinuz-${pkgbase}" "/boot/initramfs-${pkgbase}.img" "/boot/initramfs-${pkgbase}-fallback.img"
	fi
done

您需要使脚本 可执行。如果您希望添加或删除标志,则应将它们添加到您的 dracut 配置中

下一步是创建 pacman 钩子

/etc/pacman.d/hooks/90-dracut-install.hook
[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Target = usr/lib/modules/*/pkgbase

[Action]
Description = Updating linux initcpios (with dracut!)...
When = PostTransaction
Exec = /usr/local/bin/dracut-install.sh
Depends = dracut
NeedsTargets
/etc/pacman.d/hooks/60-dracut-remove.hook
[Trigger]
Type = Path
Operation = Remove
Target = usr/lib/modules/*/pkgbase

[Action]
Description = Removing linux initcpios...
When = PreTransaction
Exec = /usr/local/bin/dracut-remove.sh
NeedsTargets

您还应该阻止 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 将自动启用 bluetooth 模块。但是,这要求 dracut 处于 hostonly 模式。这似乎不是默认设置。

Limine 启动引导器支持

limine-dracut-supportAUR 软件包利用 limine-entry-tool 与 dracut 和 pacman 钩子来自动化 Limine 启动引导器中内核和启动条目的安装和删除。有关更多信息,请参阅 Limine#启动条目自动化

故障排除

休眠

如果从休眠状态恢复不起作用,您可能需要配置 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

“brltty” 的停止任务正在运行

如果您在启动时遇到问题或关机过程非常缓慢,系统正在等待 brltty,请将以下内容添加到 dracut 配置文件行

omit_dracutmodules+=" brltty "

或者,如果不需要 brltty,请卸载它。

没有可用的密钥槽

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

启动失败并显示类似于上述消息通常只需要用户通过 add_dracutmodules 包含 crypt 模块。

参见