dracut
dracut 创建内核使用的初始镜像,用于预加载访问根文件系统所需的块设备模块(例如 IDE、SCSI 或 RAID)。安装 linux 时,您可以在 mkinitcpio 和 dracut 之间选择。dracut 被 Fedora、RHEL、Gentoo 和 Debian 等使用。Arch 默认使用 mkinitcpio。
您可以阅读 dracut 的完整项目文档,请参阅文档。
安装
安装 dracut 软件包,或 dracut-gitAUR 获取最新的开发版本。
用法
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-gitAUR。dracut 的内置模块不幸地缺乏文档,尽管它们的名称可能是自解释的。
某些模块默认情况下是激活/未激活的,可以使用 --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_cert
和uefi_secureboot_key
选项(dracut.conf(5))。 - dracut-hookAUR 软件包包含类似于以下的钩子和脚本。或者,如果您想要一个作为 EFI 可执行文件的 initramfs 镜像(即
esp/EFI/Linux/linux-kernel-machine_id-build_id.efi
),您可能需要 dracut-uefi-hookAUR 或 dracut-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
模块。