dracut 會為內核創建初始映像,用於預載訪問根文件系統所需的塊設備模塊(如 IDE、SCSI 或 RAID)。安裝 linux包 時,可以在 mkinitcpio 和 dracut 之間進行選擇。Fedora、RHEL、Gentoo 和 Debian 等系統都使用 dracut,而Arch 默認使用mkinitcpio。
你可以在此查看 dracut 的完整項目文檔。
安裝
安裝 dracut包,你也可以安裝 dracut-gitAUR 使用最新的開發版本。
用法
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 | 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 | 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-cli包,jq包 | 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_cert
和uefi_secureboot_key
選項(dracut.conf(5))。 -
dracut-hookAUR 軟體包提供了類似下面的鉤子和腳本。另外,如果你希望 initramfs 映像也是 EFI 可執行文件(即
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/
。
由於內核軟體包已不再將文件寫入 /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
.