dracut
dracut creates an initial image used by the kernel for preloading the block device modules (such as IDE, SCSI or RAID) which are needed to access the root filesystem. Upon installing linux, you can choose between mkinitcpio and dracut. dracut is used by Fedora, RHEL, Gentoo, and Debian, among others. Arch uses mkinitcpio by default.
You can read the full project documentation for dracut in the kernel documentation.
Installation
Install the dracut package, or dracut-gitAUR for the latest development version.
Configuration
If you wish to always execute dracut with a certain set of flags, you can save a specified configuration in a .conf file in /etc/dracut.conf.d/
. For example:
/etc/dracut.conf.d/myflags.conf
hostonly="yes" compress="lz4" add_drivers+=" i915 " omit_dracutmodules+=" network iscsi "
You can see more configuration options with dracut.conf(5). Fuller descriptions of each option can be found with dracut(8).
Kernel command line options
/etc/cmdline.d
could/should be on your system. It (/etc/cmdline.d
) is part of the initramfs filesystem, and dracut does not recognize a created system /etc/cmdline.d
—thus, creating this directory is pointless.You can force dracut to use kernel command line parameters in the initramfs environment. Be aware that you should use the UUID naming scheme for specifying block devices.
It is not necessary to specify the root block device for dracut. From dracut.cmdline(7):
- The root device used by the kernel is specified in the boot configuration file on the kernel command line, as always.
However, it may be useful to set some parameters early, and you can enable additional features like prompting for additional command line parameters. See dracut.cmdline(7) for all options. Here are some example configuration options:
- Resume from a swap partition:
resume=UUID=80895b78-7312-45bc-afe5-58eb4b579422
- Prompt for additional kernel command line parameters:
rd.cmdline=ask
- Print informational output even if "quiet" is set:
rd.info
Kernel command line options can be placed in a .conf file in /etc/dracut.conf.d/
, and set via the kernel_cmdline=
flag. Dracut will automatically source this file and create a 01-default.conf
file and place it inside the initramfs directory /etc/cmdline.d/
. For example, your kernel command line options file could look like:
/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"
This file is also sourced by Dracut for unified kernel images. The resulting file (both initramfs.img
and uefi.efi
files) can be viewed with lsinitrd(1) utilizing the --unpackearly
option, e.g:
# lsinitrd --unpackearly /boot/EFI/Arch/Arch.efi /etc/cmdline.d/01-default.conf | less
Usage
dracut is easy to use and typically does not require user configuration, even when using non-standard setups, like LVM on LUKS.
To generate an initramfs for the running kernel:
# dracut --hostonly --no-hostonly-cmdline /boot/initramfs-linux.img
To generate a fallback initramfs run:
# dracut /boot/initramfs-linux-fallback.img
/boot/initramfs-linux.img
refers to the output image file. If you are using the non-regular kernel, consider changing the file name. For example, for the linux-lts kernel, the output file should be named /boot/initramfs-linux-lts.img
. However, you can name these files whatever you wish as long as your boot loader configuration uses the same file names.
Additional options
The --force
flag overwrites the image file if it is already present.
The --kver
option specifies which kernel to use. The argument to this option must match the name of a directory present in /usr/lib/modules
.
More flags can be found with dracut(8).
Tips and tricks
View information about generated image
You can view information about a generated initramfs image, which you may wish to view in a pager:
# lsinitrd /path/to/initramfs_image | less
This command will list the arguments passed to dracut when the image was created, the list of included dracut modules, and the list of all included files.
Change compression program
To reduce the amount of time spent compressing the final image, you may change the compression program used.
- Make sure your kernel has your chosen decompression support compiled in, otherwise you will not be able to boot. You must also have the chosen compression program package installed.
- The upstream Linux kernel does not support zstd compressed initramfs before version 5.9. linux-zen supports it since version 5.8
Simply add any one of the following lines (not multiple) to your dracut configuration:
compress="cat" compress="gzip" compress="bzip2" compress="lzma" compress="xz" compress="lzo" compress="lz4" compress="zstd"
gzip is the default compression program used. compress="cat"
will make the initramfs with no compression.
You can also use a non-officially-supported compression program:
compress="program"
Generate a new initramfs on kernel upgrade
It is possible to automatically generate new initramfs images upon each kernel upgrade. The instructions here are for the default linux kernel, but it should be easy to add extra hooks for other kernels.
esp/EFI/Linux/linux-kernel-machine_id-build_id.efi
). EFI binaries in this directory are automatically detected by systemd-boot and therefore do not need an entry in /boot/loader/loader.conf
.As the command to figure out the kernel version is somewhat complex, it will not work by itself in a pacman hook. So create a script anywhere on your system. For this example it will be created in /usr/local/bin/
.
The script will also copy the new vmlinuz
kernel file to /boot/
, since the kernel packages do not place files in /boot/
anymore.[2]
/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[@]}" --no-hostonly "/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
You need to make the scripts executable. If you wish to add or remove flags, you should add them to your dracut configuration.
The next step is creating pacman hooks:
/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
You should stop mkinitcpio from creating and removing initramfs images as well, either by removing mkinitcpio or with the following commands:
# ln -sf /dev/null /etc/pacman.d/hooks/90-mkinitcpio-install.hook # ln -sf /dev/null /etc/pacman.d/hooks/60-mkinitcpio-remove.hook
Troubleshooting
Spaces in kernel parameters
dracut does not support quoted values with spaces in the root=
and resume=
kernel parameters. For example root="PARTLABEL=Arch Linux"
. See dracut issue 720.
You will need to specify the parameters using a different block device naming scheme like UUID.
Hibernation
If resuming from hibernation does not work, you may need to configure dracut to include the resume
module. You will need to add a configuration file:
/etc/dracut.conf.d/resume-from-hibernate.conf
add_dracutmodules+=" resume "