出自 Arch Linux 中文维基

dracut 會為內核創建初始映像,用於預載訪問根文件系統所需的塊設備模塊(如 IDE、SCSI 或 RAID)。安裝 linux 時,可以在 mkinitcpiodracut 之間進行選擇。Fedora、RHEL、Gentoo 和 Debian 等系統都使用 dracut,而Arch 默認使用mkinitcpio

你可以在此查看 dracut 的完整項目文檔。

安裝

安裝 dracut,你也可以安裝 dracut-gitAUR 使用最新的開發版本。

提示:如果 dracut 測試後功能一切正常,你可以卸載 mkinitcpio

用法

dracut 的用法非常簡單,而且通常就算在非標準環境下也不需要用戶進行配置(如在 LUKS 上配置 LVM)。

使用如下命令為當前運行的內核生成 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)

進階配置

要注意的是,initial ramdisk 階段有兩種執行各種任務的不同方式:

基於 Shell(bash/busybox/dash)的 initial ramdisk:該方式會啟動一個初始化腳本,然後掃描 initial ramdisk 的文件系統來查找要執行的 dracut 腳本。
基於 systemd(默認)的 initial ramdisk:systemd 在 initial 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 上游維基

dracut 模塊 所需軟體包 描述
bluetooth bluez 藍牙(鍵盤)
btrfs btrfs-progs 在塊設備上查找 Btrfs
busybox busybox 允許使用 BusyBox(後果自負)
crypt cryptsetup 加密 Dm-crypt 文件系統支持
dash dash 允許使用 Dash(後果自負)
dmraid dmraidmultipath-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 Starts random generator service on early boot
syslog rsyslogAUR 啟用 Rsyslog 日誌記錄
squash squashfs-tools squashed initramfs 構建支持
tpm2-tss tpm2-tools Trusted Platform Module
base 帶有所需工具的基礎模塊
bash bash 在有更多可用解釋器的情況下,Bash 是首選的解釋器
biosdevname biosdevnameAUR 啟用 BIOS 網絡設備重命名
caps Supports dropping capabilities before init
convertfs Merges / into /usr on next boot
crypt-gpg gnupg 為加密操作操作和智慧卡提供支持(可能需要 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 在掛載根文件系統前掛載任意分區
i18n 包括鍵盤布局,終端字體等
img-lib 提供用於解壓映像的多種工具
integrity 添加擴展驗證模塊支持
kernel-modules Kernel modules for root filesystems and other boot-time devices
kernel-modules-extra Extra out-of-tree kernel modules
lunmask Masks LUN devices to select only ones which required to boot
lvmmerge Merges lvm snapshots
lvmthinpool-monitor Monitor LVM thinpool service
masterkey Masterkey that can be used to decrypt other keys and keyutils
modsign Adds signing kernel modules support
overlayfs Kernel module for overlayfs
pcsc Adds support for PCSC Smart cards
pkcs11 Includes PKCS#11 libraries
pollcdrom Enables CD-ROM polling
qemu Includes kernel modules for QEMU environment
rescue utilities for rescue mode (such as ping, ssh, vi, fsck.*)
rootfs-block Arranges for the block device containing the rootfs to be mounted
securityfs Arranges for the securityfs to be mounted early
selinux Arranges for the selinux policy to be loaded
shutdown Sets up hooks to run on shutdown
systemd Adds systemd as early init initialization system
terminfo Includes a terminfo file
udev-rules Includes udev and some basic rules
uefi-lib Library to include UEFI tools
usrmount Mounts /usr
virtfs Adds virtual filesystems (9p) support
virtiofs Adds virtiofs filesystems support
warpclock Sets kernel's timezone and reset the system time if adjtime is set to LOCAL
watchdog Includes watchdog devices management; works only if systemd not in use
watchdog-modules Includes watchdog kernel modules to be loaded early in booting

以下為在早期啟動階段就需要使用 IP 地址的 dracut 模塊:

dracut 網絡模塊 所需軟體包 描述
cifs cifs-utils Samba 支持
nbd nbd 網絡塊設備支持
network-manager networkmanager NetworkManager 支持
nfs nfs-utils NFS 支持 - NFSv3 和 NFSv4
nvmf nvme-clijq NVMe over Fibre Channel and NVMe-over Fabrics support
iscsi open-iscsi ISCSI 支持
ssh-client openssh 安裝 ssh 和 scp 及配置文件和指定密鑰
network-legacy dhclient, iproute2, iputils 傳統網絡配置支持
connman connman ConnMan 網絡管理支持
kernel-network-modules 添加並加載網絡設備所需的內核模塊
livenet 為 SquashFS 映像拉取實時更新
network Virtual module for network service providers
url-lib 包含 curl 和 SSL 證書
qemu-net 包含 QEMU 環境網絡內核模塊
systemd-network-management Adds network management for systemd. Includes systemd-networkd, systemd-resolved and some othr networking related dracut modules
systemd-networkd Systemd-networkd
net-lib Networking library with ip

TPM2

要使用 systemd 通過 systemd-cryptenroll 調用 TPM2 解鎖 luks2 加密卷的功能,需要安裝 tpm2-tools 並啟用 tpm2-tss dracut 模塊。

早期內核模塊加載

可以通過 --force_drivers 命令行選項或 force_drivers+="" 配置項啟用 dracut 早期加載功能(在 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 會自動讀取配置,然後創建並寫入到 initramfs /etc/cmdline.d/ 目錄下的 01-default.conf 文件中。舉個例子,你的內核命令行選項文件內容可能如下:

/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
  • 提示輸入額外內核命令行參數:{ic|1=rd.cmdline=ask}}
  • 在設定了 quiet 的前提下輸出更多信息:rd.info

統一內核映像

dracut 可以通過 --uefi 命令行參數或 uefi="yes" 配置項生成統一內核映像

小提示

查看生成映像的信息

你可以查看生成的映像的信息,並輸出到單頁上:

# 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 時就不需要再次進行壓縮。
  • 理解在 initramfs 中添加 systemd 可能造成的影響。如果它會降低性能,就將其移除;如果會提升性能,就納入進來。
  • 在使用寫時複製文件系統時,考慮使用 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 軟體包提供了類似下面的鉤子和腳本。另外,如果你希望 initramfs 映像也是 EFI 可執行文件(即 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/

由於內核軟體包已不再將文件寫入 /boot/ 中,該腳本同時會將新的 vmlinuz 內核文件複製到 /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 或使用以下命令來阻止 mkinitcpio 創建和移除 initramfs 映像:

# 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 模式,默認情況下似乎並非如此。

排障

休眠

如果從休眠中恢復無效,你可能需要配置 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"

If you have issues booting or very long shutdown processes while the system waits for brltty, add the following to the dracut configuration line:

omit_dracutmodules+=" brltty "

Alternatively, uninstall brltty if it is not needed.

No usable keyslot is available

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

A failure to boot with a message similar to the above typically will only require the user to include the crypt module via add_dracutmodules.

參考