DRACUT.CMDLINE(7)

πŸ’– NAME πŸ’–

dracut.cmdline β€” dracut kernel command line options. This is section 7 of the dracut manual, bestie, and it's literally the map for all the kernel command line parameters dracut processes. 🫢

✨ DESCRIPTION ✨

Okay so first: the root device used by the kernel is specified in the boot configuration file on the kernel command line, as always. That part is not new.

The traditional root=/dev/sda1 style device specification is allowed, but not encouraged. The root device should better be identified by LABEL or UUID. If a label is used, as in root=LABEL=<label_of_root>, the initramfs will search all available devices for a filesystem with the appropriate label, and mount that device as the root filesystem. root=UUID=<uuidnumber> will mount the partition with that UUID as the root filesystem.

In the following, all kernel command line parameters which are processed by dracut are described.

Quick vibe check: "rd.*" parameters mentioned without = are boolean parameters. They can be turned on/off by setting them to {0|1}. If the assignment with = is missing, =1 is implied. For example, rd.info can be turned off with rd.info=0 or turned on with rd.info=1 or rd.info. The last value in the kernel command line is the value which is honored. πŸ’…

🌟 Standard 🌟

  • init=<path to real init> β€” specify the path to the init program to be started after the initramfs has finished. ✨
  • root=<path to blockdevice> β€” specify the block device to use as the root filesystem.

Example, bestie:

root=/dev/sda1
root=/dev/disk/by-path/pci-0000:00:1f.1-scsi-0:0:1:0-part1
root=/dev/disk/by-label/Root
root=LABEL=Root
root=/dev/disk/by-uuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
root=UUID=3f5ad593-4546-4a94-a374-bcfb68aa11f7
root=PARTUUID=3f5ad593-4546-4a94-a374-bcfb68aa11f7
  • rootfstype=<filesystem type> β€” this one is "auto" if not specified.

Example:

rootfstype=ext4
  • rootflags=<mount options> β€” specify additional mount options for the root filesystem. If not set, /etc/fstab of the real root will be parsed for special mount options and mounted accordingly.
  • ro β€” force mounting / and /usr (if it is a separate device) read-only. If none of ro and rw is present, both are mounted according to /etc/fstab.
  • rw β€” force mounting / and /usr (if it is a separate device) read-write. See also the ro option.
  • rootfallback=<path to blockdevice> β€” specify the block device to use as the root filesystem, if the normal root cannot be found. This can only be a simple block device with a simple file system, for which the filesystem driver is either compiled in, or added manually to the initramfs. This parameter can be specified multiple times.
  • rd.auto, rd.auto=1 β€” enable autoassembly of special devices like cryptoLUKS, dmraid, mdraid or lvm. Default is off as of dracut version >= 024.
  • rd.hostonly=0 β€” removes all compiled in configuration of the host system the initramfs image was built on. This helps booting, if any disk layout changed, especially in combination with rd.auto or other parameters specifying the layout.
  • rd.cmdline=ask β€” prompts the user for additional kernel command line parameters.
  • rd.fstab=0 β€” do not honor special mount options for the root filesystem found in /etc/fstab of the real root.
  • resume=<path to resume partition> β€” resume from a swap partition.

Example:

resume=/dev/disk/by-path/pci-0000:00:1f.1-scsi-0:0:1:0-part1
resume=/dev/disk/by-uuid/3f5ad593-4546-4a94-a374-bcfb68aa11f7
resume=UUID=3f5ad593-4546-4a94-a374-bcfb68aa11f7
  • rd.skipfsck β€” skip fsck for rootfs and /usr. If you're mounting /usr read-only and the init system performs fsck before remount, you might want to use this option to avoid duplication. 🫢

πŸ“€ iso-scan/filename πŸ“€

Mount all mountable devices and search for ISO pointed by the argument. When the ISO is found, set it up as a loop device. Device containing this ISO image will stay mounted at /run/initramfs/isoscandev. Using iso-scan/filename with a Fedora/Red Hat/CentOS Live iso should just work by copying the original kernel cmdline parameters. Requires the dracut dmsquash-live module.

Example:

menuentry 'Live' --class gnu-linux --class gnu --class os {
    set isolabel=Live-x86_64
    set isofile="/boot/iso/Live-x86_64.iso"
    loopback loop $isofile
    linux (loop)/isolinux/vmlinuz0 boot=isolinux iso-scan/filename=$isofile root=live:LABEL=$isolabel ro rd.live.image quiet
    initrd (loop)/isolinux/initrd0.img
}

🧁 Misc 🧁

  • rd.emergency=[reboot|poweroff|halt] β€” specify what action to execute in case of a critical failure.
rd.shell=0 must also be specified. No cap, that part matters. ⚠️
  • rd.driver.blacklist=<drivername>[,<drivername>,...] β€” do not load kernel module <drivername>. This parameter can be specified multiple times.
  • rd.driver.pre=<drivername>[,<drivername>,...] β€” force loading kernel module <drivername>. This parameter can be specified multiple times.
  • rd.driver.post=<drivername>[,<drivername>,...] β€” force loading kernel module <drivername> after all automatic loading modules have been loaded. This parameter can be specified multiple times.
  • rd.driver.export β€” making all drivers from initramfs available to rootfs after switch_root. This parameter can be set to force for exporting over existing modules. Requires the dracut kernel-modules-export module.
  • rd.retry=<seconds> β€” specify how long dracut should retry the initqueue to configure devices. The default is 180 seconds. After 2/3 of the time, degraded raids are force started. If you have hardware, which takes a very long time to announce its drives, you might want to extend this value. Requires the dracut initqueue module.
  • rd.timeout=<seconds> β€” specify how long dracut should wait for devices to appear. The default is 0, which means forever. Note that this timeout should be longer than rd.retry to allow for proper configuration.
  • rd.noverifyssl β€” accept self-signed certificates for ssl downloads. Requires the dracut url-lib module.
  • rd.ctty=<terminal device> β€” specify the controlling terminal for the console. This is useful, if you have multiple console= arguments.
  • rd.shutdown.timeout.umount=<seconds> β€” specify how long dracut should wait for an individual umount to finish during shutdown. This avoids the system from blocking when unmounting a file system cannot complete and waits indefinitely. Value 0 means to wait forever. The default is 90 seconds. Requires the dracut shutdown module. πŸ•°οΈ

πŸ› Debug πŸ›

If you are dropped to an emergency shell, the file /run/initramfs/rdsosreport.txt is created, which can be saved to a (to be mounted by hand) partition (usually /boot) or a USB stick. Additional debugging info can be produced by adding rd.debug to the kernel command line. /run/initramfs/rdsosreport.txt contains all logs and the output of some tools. It should be attached to any report about dracut problems.

  • rd.info β€” print informational output even though "quiet" is set.
  • rd.shell β€” allow dropping to a shell, if root mounting fails.
  • rd.debug β€” set -x for the dracut shell. If systemd is active in the initramfs, all output is logged to the systemd journal, which you can inspect with journalctl -ab. If systemd is not active, the logs are written to dmesg and /run/initramfs/init.log. If "quiet" is set, it also logs to the console.
  • rd.memdebug=[0-5] β€” print memory usage info at various points, set the verbose level from 0 to 5.
Higher level means more debugging output:

    0 - no output
    1 - partial /proc/meminfo
    2 - /proc/meminfo
    3 - /proc/meminfo + /proc/slabinfo
    4 - /proc/meminfo + /proc/slabinfo + memstrack summary
        NOTE: memstrack is a memory tracing tool that tracks the total memory
              consumption, and peak memory consumption of each kernel modules
              and userspace progress during the whole initramfs runtime, report
              is generated and the end of initramfs run.
    5 - /proc/meminfo + /proc/slabinfo + memstrack (with top memory stacktrace)
        NOTE: memstrack (with top memory stacktrace) will print top memory
              allocation stack traces during the whole initramfs runtime.
  • rd.break β€” drop to a shell at the end.
  • rd.break={cmdline|pre-udev|pre-trigger|initqueue|pre-mount|mount|pre-pivot|cleanup} β€” drop to a shell before the defined breakpoint starts. This parameter can be specified multiple times.
  • rd.udev.log_level={err|info|debug} β€” set udev log level. The default is err.

🌍 I18N 🌍

Requires the dracut i18n module.

  • rd.vconsole.keymap=<keymap base file name> β€” keyboard translation table loaded by loadkeys; taken from keymaps directory; will be written as KEYMAP to /etc/vconsole.conf in the initramfs.

Example:

rd.vconsole.keymap=de-latin1-nodeadkeys
  • rd.vconsole.keymap.ext=<list of keymap base file names> β€” list of extra keymaps to be loaded (sep. by space); will be written as EXT_KEYMAP to /etc/vconsole.conf in the initramfs.
  • rd.vconsole.unicode β€” boolean, indicating UTF-8 mode; will be written as UNICODE to /etc/vconsole.conf in the initramfs.
  • rd.vconsole.font=<font base file name> β€” console font; taken from consolefonts directory; will be written as FONT to /etc/vconsole.conf in the initramfs.

Example:

rd.vconsole.font=eurlatgr
  • rd.vconsole.font.map=<console map base file name> β€” see description of -m parameter in setfont manual; taken from consoletrans directory; will be written as FONT_MAP to /etc/vconsole.conf in the initramfs.
  • rd.vconsole.font.unimap=<unicode table base file name> β€” see description of -u parameter in setfont manual; taken from unimaps directory; will be written as FONT_UNIMAP to /etc/vconsole.conf in the initramfs.
  • rd.locale.LANG=<locale> β€” taken from the environment; if no UNICODE is defined we set its value in basis of LANG value (whether it ends with ".utf8" (or similar) or not); will be written as LANG to /etc/locale.conf in the initramfs.

Example:

rd.locale.LANG=pl_PL.utf8
  • rd.locale.LC_ALL=<locale> β€” taken from the environment; will be written as LC_ALL to /etc/locale.conf in the initramfs.

πŸ’½ LVM πŸ’½

Requires the dracut lvm module.

  • rd.lvm=0 β€” disable LVM detection.
  • rd.lvm.vg=<volume group name> β€” only activate all the logical volumes sitting inside the volume groups with that given name. And yes bestie, rd.lvm.vg can be specified multiple times on the kernel command line β€” stack 'em up πŸ’…
  • rd.lvm.lv=<volume group name>/<logical volume name> β€” only activate the logical volumes with that given name. Same deal: rd.lvm.lv can be specified multiple times on the kernel command line ✨
  • rd.lvm.conf=0 β€” removes any /etc/lvm/lvm.conf that might be hanging around in the initramfs. bye felicia πŸ‘‹

πŸ” crypto LUKS πŸ”

Requires the dracut crypt module.

  • rd.luks=0 β€” disables crypto LUKS detection entirely πŸ™ˆ
  • rd.luks.uuid=<luks uuid> β€” only activate the LUKS partitions with the given UUID. Any luks- at the front of the LUKS UUID gets stripped before comparing to <luks uuid>. The comparison also matches if <luks uuid> is only the beginning of the LUKS UUID β€” so no cap, you don't have to type the whole thing out. This parameter can be specified multiple times. <luks uuid> may also be prefixed by the keyword keysource:, see rd.luks.key below πŸ‘€
  • rd.luks.allow-discards=<luks uuid> β€” allow using discards (TRIM) requests for the LUKS partitions with the given UUID. Any luks- of the LUKS UUID is removed before comparing to <luks uuid>. Matching also works if <luks uuid> is only the beginning of the LUKS UUID, so you don't have to specify the full UUID. This parameter can be specified multiple times 🌸
  • rd.luks.allow-discards β€” allow using discards (TRIM) requests on all LUKS partitions. periodt 🫢
  • rd.luks.crypttab=0 β€” don't check whether the LUKS partition is in /etc/crypttab
  • rd.luks.timeout=<seconds> β€” specify how long dracut should wait when waiting for the user to enter the password. This avoids blocking the boot if no password is entered. It does not apply to luks key. The default is 0, which means forever 😭

πŸ—οΈ crypto LUKS - key on removable device support πŸ—οΈ

NB: If systemd is included in the dracut initrd, dracut's built-in removable device keying support won't work. systemd will prompt for a password from the console even if you've supplied rd.luks.key. You may be able to use standard systemd man:fstab[5,external] syntax to get the same effect. If you really do need rd.luks.key to work, you'll have to exclude the systemd dracut module and any modules that depend on it. See man:dracut.conf[5] and https://bugzilla.redhat.com/show_bug.cgi?id=905683 for more info πŸ’€
  • rd.luks.key=<keypath>[:<keydev>[:<luksdev>]] β€” okay so <keypath> is the pathname of a key file, relative to the root of the filesystem on some device. It's REQUIRED. When <keypath> ends with .gpg it's considered to be key encrypted symmetrically with GPG. You'll be prompted for the GPG password on boot. GPG support requires the crypt-gpg dracut module, which needs to be added explicitly πŸ”‘

<keydev> identifies the device on which the key file resides. It may be the kernel name of the device (should start with "/dev/"), a UUID (prefixed with "UUID=") or a label (prefix with "LABEL="). You don't have to specify a full UUID β€” just its beginning will suffice, even if it's ambiguous. All matching devices will be probed. This parameter is recommended, but not required. If it's not present, all block devices will be probed, which may significantly increase boot time 🐌

If <luksdev> is given, the specified key will only be used for the specified LUKS device. Possible values are the same as for <keydev>. Unless you have several LUKS devices, you don't have to specify this parameter. The simplest usage is:

Example

rd.luks.key=/foo/bar.key

As you can see, you can skip colons in such a case β€” iconic behavior tbh πŸ’…

Note
Your LUKS partition must match your key file.

dracut provides keys to cryptsetup with -d (an older alias for --key-file). This uses the entire binary content of the key file as part of the secret. If you pipe a password into cryptsetup without -d or --key-file, it will be treated as text user input, and only characters before the first newline will be used 😬 So when you're creating an encrypted partition for dracut to mount, and you pipe a key into cryptsetup luksFormat, you must use -d -.

Here's an example for a key encrypted with GPG (warning: --batch-mode will overwrite the device without asking for confirmation β€” do not do this casually bestie πŸ™ˆ):

gpg --quiet --decrypt rootkey.gpg | \
cryptsetup --batch-mode --key-file - \
           luksFormat /dev/sda47

If you use unencrypted key files, just use the key file pathname instead of the standard input. For a random key with 256 bits of entropy, you might use:

head -32c /dev/urandom > rootkey.key
cryptsetup --batch-mode --key-file rootkey.key \
           luksFormat /dev/sda47

You can also use regular key files on an encrypted keydev πŸ”₯

Compared to using GPG encrypted keyfiles on an unencrypted device, this provides the following advantages:

  • you can unlock your disk(s) using multiple passphrases
  • better security by not losing the key stretching mechanism

To use an encrypted keydev you must ensure that it becomes available by using the keyword keysource, e.g. rd.luks.uuid=keysource:aaaa β€” aaaa being the uuid of the encrypted keydev ✨

Example:

Let's assume you have three disks A, B and C with the uuids aaaa, bbbb and cccc. You want to unlock A and B using keyfile keyfile. The unlocked volumes be A', B' and C' with the uuids AAAA, BBBB and CCCC. keyfile is saved on C' as /keyfile.

One luks keyslot of each A, B and C is setup with a passphrase. Another luks keyslot of each A and B is setup with keyfile.

To boot this configuration you could use:

rd.luks.uuid=aaaa
rd.luks.uuid=bbbb
rd.luks.uuid=keysource:cccc
rd.luks.key=/keyfile:UUID=CCCC

Dracut asks for the passphrase for C and uses the keyfile to unlock A and B. If getting the passphrase for C fails it falls back to asking for the passphrases for A and B 😀

If you want C' to stay unlocked, specify a luks name for it, e.g. rd.luks.name=cccc=mykeys, otherwise it gets closed when not needed anymore πŸ‘‹

  • rd.luks.key.tout=0 β€” specify how many times dracut will try to read the keys specified in rd.luks.key. This gives a chance to the removable device containing the key to initialize πŸ“

πŸ’Ύ MD RAID πŸ’Ύ

Requires the dracut mdraid module.

  • rd.md=0 β€” disable MD RAID detection
  • rd.md.imsm=0 β€” disable MD RAID for imsm/isw raids, use DM RAID instead
  • rd.md.ddf=0 β€” disable MD RAID for SNIA ddf raids, use DM RAID instead
  • rd.md.conf=0 β€” ignore mdadm.conf included in initramfs
  • rd.md.waitclean=1 β€” wait for any resync, recovery, or reshape activity to finish before continuing ⏳
  • rd.md.uuid=<md raid uuid> β€” only activate the raid sets with the given UUID. This parameter can be specified multiple times 🫢

🧊 DM RAID 🧊

Requires the dracut dmraid module.

  • rd.dm=0 β€” disable DM RAID detection
  • rd.dm.uuid=<dm raid uuid> β€” only activate the raid sets with the given UUID. This parameter can be specified multiple times ✨

🌈 MULTIPATH 🌈

Requires the dracut multipath module.

  • rd.multipath=0 β€” disable multipath detection
  • rd.multipath=default β€” use default multipath settings

πŸ›‘οΈ FIPS πŸ›‘οΈ

Requires the dracut fips module.

  • rd.fips β€” enable FIPS πŸ‘‘
  • boot=<boot device> β€” specify the device where /boot is located.

Example

boot=/dev/sda1
boot=/dev/disk/by-path/pci-0000:00:1f.1-scsi-0:0:1:0-part1
boot=UUID=<uuid>
boot=LABEL=<label>
  • rd.fips.skipkernel β€” skip checksum check of the kernel image. Useful if the kernel image is not in a separate boot partition πŸ’‘

🌐 Network 🌐

Important
It is recommended to either bind an interface to a MAC with the ifname argument, or to use the systemd-udevd predictable network interface names.

Predictable network interface device names based on:

  • firmware/bios-provided index numbers for on-board devices
  • firmware-provided pci-express hotplug slot index number
  • physical/geographical location of the hardware
  • the interface's MAC address

See: http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames

Two character prefixes based on the type of interface:

  • en β€” ethernet
  • wl β€” wlan
  • ww β€” wwan

Type of names:

  • o<index> β€” on-board device index number
  • s<slot>[f<function>][d<dev_id>] β€” hotplug slot index number
  • x<MAC> β€” MAC address
  • [P<domain>]p<bus>s<slot>[f<function>][d<dev_id>] β€” PCI geographical location
  • [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] β€” USB port number chain

All multi-function PCI devices will carry the [f<function>] number in the device name, including the function 0 device.

When using PCI geography, the PCI domain is only prepended when it is not 0 ✨

For USB devices the full chain of port numbers of hubs is composed. If the name gets longer than the maximum number of 15 characters, the name is not exported. The usual USB configuration == 1 and interface == 0 values are suppressed.

PCI ethernet card with firmware index "1":

  • eno1

PCI ethernet card in hotplug slot with firmware index number:

  • ens1

PCI ethernet multi-function card with 2 ports:

  • enp2s0f0
  • enp2s0f1

PCI wlan card:

  • wlp3s0

USB built-in 3G modem:

  • wwp0s29u1u4i6

USB Android phone:

  • enp0s29u1u2

The following options are supported by the network-legacy dracut module. Other network modules might support a slightly different set of options β€” refer to the documentation of the specific network module in use. For NetworkManager, see man:nm-initrd-generator[8] πŸ‘€

  • ip={dhcp|on|any|dhcp6|auto6|either6|link6|single-dhcp}
    • dhcp|on|any β€” get ip from dhcp server from all interfaces. If netroot=dhcp, loop sequentially through all interfaces (eth0, eth1, ...) and use the first with a valid DHCP root-path πŸ”₯
  • single-dhcp β€” ok so this one yeets DHCP at all available interfaces in parallel, not one after another, no waiting your turn bestie πŸ’…. The literal millisecond the first DHCP response comes back, it stops DHCP on every other interface. The result is the fastest boot time ever because you're just using the IP on whichever interface won the DHCP race during early boot πŸ”₯. Caveat tho: this does not apply to Network Manager. nope. not today.
  • auto6 β€” IPv6 autoconfiguration ✨
  • dhcp6 β€” IPv6 DHCP πŸ¦‹
  • either6 β€” if auto6 fails, then dhcp6. backup-plan energy, we love a safety net 🫢
  • link6 β€” bring up interface for IPv6 link-local addressing
  • ip=<interface>:{dhcp|on|any|dhcp6|auto6|link6}[:[<mtu>][:<macaddr>]] β€” this parameter can be specified multiple times, so stack 'em up bestie πŸ“š
    • dhcp|on|any|dhcp6 β€” get ip from dhcp server on a specific interface
    • auto6 β€” do IPv6 autoconfiguration
    • link6 β€” bring up interface for IPv6 link local address
    • <macaddr> β€” optionally set <macaddr> on the <interface>. This cannot be used in conjunction with the ifname argument for the same <interface>. like, pick a lane girlie πŸ™ˆ
  • ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<mtu>][:<macaddr>]] β€” explicit network configuration, i.e. you're hand-typing the whole thing instead of letting DHCP do its thing ✍️. If you want do define a IPv6 address, put it in brackets (e.g. [2001:DB8::1]). This parameter can be specified multiple times. <peer> is optional and is the address of the remote endpoint for pointopoint interfaces and it may be followed by a slash and a decimal number, encoding the network prefix length. look at her knowing her prefixes πŸ’œ
    • <macaddr> β€” optionally set <macaddr> on the <interface>. This cannot be used in conjunction with the ifname argument for the same <interface>. (same rule as above, we're not doing duplicates βœ‹)
  • ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<dns1>][:<dns2>]] β€” explicit network configuration. If you want do define a IPv6 address, put it in brackets (e.g. [2001:DB8::1]). This parameter can be specified multiple times. <peer> is optional and is the address of the remote endpoint for pointopoint interfaces and it may be followed by a slash and a decimal number, encoding the network prefix length. same deal as the last one, except this flavour lets you hand-pick your DNS servers at the end πŸŽ€
  • ifname=<interface>:<MAC> β€” assign network device name <interface> (i.e. "bootnet") to the NIC with MAC <MAC>. it's giving "you are who I say you are" πŸ’…
⚠️ Warning β€” Do not use the default kernel naming scheme for the interface name, as it can conflict with the kernel names. So, don't use "eth[0-9]+" for the interface name. Better name it "bootnet" or "bluesocket". seriously bestie, don't fight the kernel, the kernel wins 😭
  • rd.route=<net>/<netmask>:<gateway>[:<interface>] β€” add a static route with route options, which are separated by a colon. IPv6 addresses have to be put in brackets. 🧚

Example:

rd.route=192.168.200.0/24:192.168.100.222:ens10
rd.route=192.168.200.0/24:192.168.100.222
rd.route=192.168.200.0/24::ens10
rd.route=[2001:DB8:3::/8]:[2001:DB8:2::1]:ens10
  • bootdev=<interface> β€” specify network interface to use routing and netroot information from. Required if multiple ip= lines are used. iconic, mandatory, non-negotiable πŸ‘‘
  • BOOTIF=<MAC> β€” specify network interface to use routing and netroot information from. (yes, same description as bootdev=, just a different way in πŸ¦‹)
  • rd.bootif=0 β€” disable BOOTIF parsing, which is provided by PXE.
  • nameserver=<IP> [nameserver=<IP> ...] β€” specify nameserver(s) to use ✨ (yes you can pass more than one, go off)
  • rd.peerdns=0 β€” disable DNS setting of DHCP parameters.
  • biosdevname=0 β€” boolean, turn off biosdevname network interface renaming. bye bye renaming 🌸
  • rd.neednet=1 β€” boolean, bring up network even without netroot set.
  • vlan=<vlanname>:<phydevice> β€” set up vlan device named <vlanname> on <phydevice>. We support the four styles of vlan names: VLAN_PLUS_VID (vlan0005), VLAN_PLUS_VID_NO_PAD (vlan5), DEV_PLUS_VID (eth0.0005), DEV_PLUS_VID_NO_PAD (eth0.5). four aesthetics, all valid πŸ’œ
  • bond=<bondname>[:<bondslaves>:[:<options>[:<mtu>]]] β€” set up bonding device <bondname> on top of <bondslaves>. <bondslaves> is a comma-separated list of physical (ethernet) interfaces. <options> is a comma-separated list on bonding options (modinfo bonding for details) in format compatible with initscripts. If <options> includes multi-valued arp_ip_target option, then its values should be separated by semicolon. if the mtu is specified, it will be set on the bond master. Bond without parameters assumes bond=bond0:eth0,eth1:mode=balance-rr. teamwork makes the dream work fr fr 🀝
  • team=<teammaster>:<teamslaves>[:<teamrunner>] β€” set up team device <teammaster> on top of <teamslaves>. <teamslaves> is a comma-separated list of physical (ethernet) interfaces. <teamrunner> is the runner type to be used (see man:teamd.conf[5,external]); defaults to activebackup. Team without parameters assumes team=team0:eth0,eth1:activebackup.
  • bridge=<bridgename>:<ethnames> β€” set up bridge <bridgename> with <ethnames>. <ethnames> is a comma-separated list of physical (ethernet) interfaces. Bridge without parameters assumes bridge=br0:eth0. bridging the friend group together 🌈

πŸ“ NFS πŸ“

Requires the dracut nfs module.

  • root=<root-dir>[:<nfs-options>] β€” mount nfs share from <server-ip>:/<root-dir>, if no server-ip is given, use dhcp next_server. If server-ip is an IPv6 address it has to be put in brackets, e.g. [2001:DB8::1]. NFS options can be appended with the prefix ":" or "," and are separated by ",". 🧚
  • root=nfs:[<server-ip>:]<root-dir>[:<nfs-options>], root=nfs4:[<server-ip>:]<root-dir>[:<nfs-options>], root={dhcp|dhcp6} β€” netroot=dhcp alone directs initrd to look at the DHCP root-path where NFS options can be specified. πŸ‘€

Example:

root-path=<server-ip>:<root-dir>[,<nfs-options>]
root-path=nfs:<server-ip>:<root-dir>[,<nfs-options>]
root-path=nfs4:<server-ip>:<root-dir>[,<nfs-options>]
  • root=/dev/nfs nfsroot=<root-dir>[:<nfs-options>] β€” Deprecated! kernel Documentation/filesystems/nfsroot.txt defines this method. This is supported by dracut, but not recommended. like yeah it still works but don't πŸ’€
  • rd.nfs.domain=<NFSv4 domain name> β€” set the NFSv4 domain name. Will override the settings in /etc/idmap.conf.
  • rd.net.dhcp.retry=<cnt> β€” if this option is set, dracut will try to connect via dhcp <cnt> times before failing. Default is 1.
  • rd.net.timeout.dhcp=<arg> β€” if this option is set, dhclient is called with "--timeout <arg>".
  • rd.net.timeout.iflink=<seconds> β€” wait <seconds> until link shows up. Default is 60 seconds. ⏳
  • rd.net.timeout.ifup=<seconds> β€” wait <seconds> until link has state "UP". Default is 20 seconds.
  • rd.net.timeout.route=<seconds> β€” wait <seconds> until route shows up. Default is 20 seconds.
  • rd.net.timeout.ipv6dad=<seconds> β€” wait <seconds> until IPv6 DAD is finished. Default is 50 seconds.
  • rd.net.timeout.ipv6auto=<seconds> β€” wait <seconds> until IPv6 automatic addresses are assigned. Default is 40 seconds.
  • rd.net.timeout.carrier=<seconds> β€” wait <seconds> until carrier is recognized. Default is 10 seconds.

🌸 CIFS 🌸

Requires the dracut cifs module.

  • root=cifs://[<username>[:<password>]@]<server-ip>:<root-dir> β€” mount cifs share from <server-ip>:/<root-dir>, if no server-ip is given, use dhcp next_server. if server-ip is an IPv6 address it has to be put in brackets, e.g. [2001:DB8::1]. If a username or password are not specified as part of the root, then they must be passed on the command line through cifsuser/cifspass.
⚠️ Warning β€” Passwords specified on the kernel command line are visible for all users via the file /proc/cmdline and via dmesg or can be sniffed on the network, when using DHCP with DHCP root-path. bestie I am BEGGING you, be careful with this one 😭
  • cifsuser=<username> β€” set the cifs username, if not specified as part of the root.
  • cifspass=<password> β€” set the cifs password, if not specified as part of the root.
⚠️ Warning β€” Passwords specified on the kernel command line are visible for all users via the file /proc/cmdline and via dmesg or can be sniffed on the network, when using DHCP with DHCP root-path. (yes, again. it's that serious πŸ™ˆ)

πŸ¦‹ iSCSI πŸ¦‹

Requires the dracut iscsi module.

  • root=iscsi:[<username>:<password>[:<reverse>:<password>]@][<servername>]:[<protocol>]:[<port>][:[<iscsi_iface_name>]:[<netdev_name>]]:[<LUN>]:<targetname> β€” protocol defaults to "6", LUN defaults to "0". If the "servername" field is provided by BOOTP or DHCP, then that field is used in conjunction with other associated fields to contact the boot server in the Boot stage. However, if the "servername" field is not provided, then the "targetname" field is then used in the Discovery Service stage in conjunction with other associated fields. See rfc4173 <http://tools.ietf.org/html/rfc4173#section-5>. πŸ“œ
⚠️ Warning β€” Passwords specified on the kernel command line are visible for all users via the file /proc/cmdline and via dmesg or can be sniffed on the network, when using DHCP with DHCP root-path.

Example:

root=iscsi:192.168.50.1::::iqn.2009-06.dracut:target0

If servername is an IPv6 address, it has to be put in brackets:

Example:

root=iscsi:[2001:DB8::1]::::iqn.2009-06.dracut:target0
  • root=???
  • netroot=iscsi:[<username>:<password>[:<reverse>:<password>]@][<servername>]:[<protocol>]:[<port>][:[<iscsi_iface_name>]:[<netdev_name>]]:[<LUN>]:<targetname>
  • ... β€” multiple netroot options allow setting up multiple iscsi disks, which is honestly kind of a slay πŸ’…

Example:

root=UUID=12424547
netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target0
netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target1

If servername is an IPv6 address, it has to be put in brackets:

Example:

netroot=iscsi:[2001:DB8::1]::::iqn.2009-06.dracut:target0
⚠️ Warning β€” Passwords specified on the kernel command line are visible for all users via the file /proc/cmdline and via dmesg or can be sniffed on the network, when using DHCP with DHCP root-path. You may want to use rd.iscsi.firmware. 🫢
  • root=??? rd.iscsi.initiator=<initiator> rd.iscsi.target.name=<target name> rd.iscsi.target.ip=<target ip> rd.iscsi.target.port=<target port> rd.iscsi.target.group=<target group> rd.iscsi.username=<username> rd.iscsi.password=<password> rd.iscsi.in.username=<in username> rd.iscsi.in.password=<in password> β€” manually specify all iscsistart parameter (see iscsistart --help). full control, you're the main character now πŸ‘‘
⚠️ Warning
⚠️ real talk before we start: anything you type as a password on the kernel command line is lowkey public. Like, every user on the box can read it in /proc/cmdline, it shows up in dmesg, and if you're doing DHCP with a DHCP root-path it can literally be sniffed off the network. not the vibe. You might wanna use rd.iscsi.firmware instead. πŸ’…
  • root=??? netroot=iscsi rd.iscsi.firmware=1 β€” this one pulls the iscsi parameter straight out of the BIOS firmware. firmware girlies stay winning ✨
  • rd.iscsi.login_retry_max=<num> β€” sets the maximum number of login retries. That's it, that's the whole thing πŸŽ€
  • rd.iscsi.param=<param> β€” whatever you put in <param> gets handed to iscsistart as --param <param>. You can drop this parameter multiple times if you've got a lot of feelings (params) to share πŸ¦‹

Example:

"netroot=iscsi rd.iscsi.firmware=1 rd.iscsi.param=node.session.timeo.replacement_timeout=30"

will result in:

iscsistart -b --param node.session.timeo.replacement_timeout=30
  • rd.iscsi.ibft, rd.iscsi.ibft=1 β€” turns on iBFT autoconfiguration for the interfaces. autoconfig era πŸ’œ
  • rd.iscsi.mp, rd.iscsi.mp=1 β€” configures all iBFT interfaces, not just the one you're booting from (this is the multipath one, iykyk).
  • rd.iscsi.waitnet=0 β€” turns off waiting for all interfaces to come up before it tries to log in to the iSCSI targets. impatient queen behavior ⭐
  • rd.iscsi.testroute=0 β€” turns off the check that asks "hey is the route to the iSCSI target IP even possible?" before trying to log in.
  • rd.iscsi.transport=<transport_name> β€” sets the iSCSI transport name (peep man:iscsiadm[8,external] for that one). Okay so iSCSI offload transports like bnx2i don't need the network up to bring up iSCSI connections. What this parameter is telling you is that network setup can be skipped in the initramfs, which makes booting with iSCSI offload cards faster and more reliable. speed AND reliability?? we love to see it πŸ”₯ Heads up tho: right now this parameter only does anything when <transport_name>=bnx2i or <transport_name>=qedi.

FCoE πŸ’–

Needs the dracut fcoe module, bestie. Don't forget it.

  • rd.fcoe=0 β€” disables FCoE and lldpad. goodbye πŸ‘‹
  • fcoe=<edd|interface|MAC>:{dcb|nodcb}:{fabric|vn2vn} β€” tries to connect to a FCoE SAN through the NIC specified by <interface> or <MAC> or EDD settings. The second argument says whether DCB should be used or not. The optional third argument says whether fabric or VN2VN mode should be used. You can specify this parameter multiple times πŸŽ€
πŸ“£ PSA: letters in the MAC-address must be lowercase! No AA:BB:CC, only aa:bb:cc. fr fr.

NVMf πŸ¦‹

Needs the dracut nvmf module.

  • rd.nonvmf β€” disables NVMf. periodt.
  • rd.nvmf.nonbft β€” stops it from connecting to targets from the NVMe Boot Firmware Table. Without this parameter, NBFT connections take precedence over rd.nvmf.discover. whoever's first wins, apparently πŸ’œ
  • rd.nvmf.nostatic β€” stops it from connecting to targets that were statically configured when the initramfs was built. Targets you specified with rd.nvmf.discover on the kernel command line will still be tried, tho 🫢
  • rd.nvmf.hostnqn=<hostNQN> β€” the NVMe host NQN to use.
  • rd.nvmf.hostid=<hostID> β€” the NVMe host id to use.
  • rd.nvmf.discover={rdma|fc|tcp},<traddr>,[<host_traddr>],[<trsvcid>] β€” discovers and connects to a NVMe-over-Fabric controller specified by <traddr> and the optionally <host_traddr> or <trsvcid>. The first argument is the transport to use; currently only rdma, fc, or tcp are supported. You can specify this parameter multiple times ✨

Examples:

rd.nvmf.discover=tcp,192.168.10.10,,4420
rd.nvmf.discover=fc,nn-0x201700a05634f5bf:pn-0x201900a05634f5bf,nn-0x200000109b579ef3:pn-0x100000109b579ef3
  • rd.nvmf.discover=fc,auto β€” this special syntax says "actually, use Fibre Channel autodiscovery instead of regular NVMe discovery." And it takes precedence over all other rd.nvmf.discover= arguments. main character energy, honestly πŸ‘‘

NBD 🌈

Needs the dracut nbd module.

  • root=??? and netroot=nbd:<server>:<port/exportname>[:<fstype>[:<mountopts>[:<nbdopts>]]] β€” mounts the nbd share from <server>.
πŸ“Œ NOTE: if you give "exportname" instead of "port", the standard port is used. And newer versions of nbd are only supported with "exportname". iykyk πŸ’€
  • root=/dev/root netroot=dhcp with dhcp and root-path=nbd:<server>:<port/exportname>[:<fstype>[:<mountopts>[:<nbdopts>]]] β€” netroot=dhcp on its own tells initrd to go look at the DHCP root-path, where the NBD options can be specified. This syntax is only usable in cases where you're directly mounting the volume as the rootfs.
πŸ“Œ NOTE (again, yes really): if you give "exportname" instead of "port", the standard port is used. Newer versions of nbd are only supported with "exportname".

VIRTIOFS 🧚

Needs the dracut virtiofs module.

  • root=virtiofs:<mount-tag> β€” mounts the virtiofs share using the tag <mount-tag>. The tag name is arbitrary and must match the tag given in the qemu -device command. matching tags = matching outfits, it's giving coordination πŸ’œ
  • rootfstype=virtiofs root=<mount-tag> β€” also mounts the virtiofs share using the tag <mount-tag>. Same deal: the tag name is arbitrary and must match the tag given in the qemu -device command.

Both formats are supported by the virtiofs dracut module. See https://gitlab.com/virtio-fs/virtiofsd for more information πŸŽ€

Example:

root=virtiofs:host rw

DASD πŸ“

Needs the dracut dasd module.

⚠️ NOTE: this parameter is no longer handled by dracut itself β€” it's handled with the exact same syntax by https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/dracut/95zdev. not me finding out it moved 😭

ZFCP ⭐

Needs the dracut zfcp module.

  • rd.zfcp=<zfcp adaptor device bus ID>,<WWPN>,<FCPLUN> β€” rd.zfcp can be specified multiple times on the kernel command line.
⚠️ NOTE: this parameter is no longer handled by dracut itself β€” it's handled with the exact same syntax by https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/dracut/95zdev.
  • rd.zfcp=<zfcp adaptor device bus ID> β€” if NPIV is enabled and the allow_lun_scan parameter to the zfcp module is set to Y, then the zfcp driver will be initiating a scan internally and the <WWPN> and <FCPLUN> parameters can be omitted. less typing, more slaying ✨
⚠️ NOTE: this parameter is no longer handled by dracut itself β€” it's handled with the exact same syntax by https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/dracut/95zdev.

Example:

rd.zfcp=0.0.4000,0x5005076300C213e9,0x5022000000000000
rd.zfcp=0.0.4000
  • rd.zfcp.conf=0 β€” ignores zfcp.conf included in the initramfs. bye πŸ‘‹

ZNET πŸ¦‹

Needs the dracut znet module.

  • rd.znet=<nettype>,<subchannels>,<options> β€” activates a channel-attached network interface on s390 architecture. So <nettype> is one of: qeth, lcs, ctc. <subchannels> is a comma-separated list of ccw device bus-IDs β€” the list has 3 entries with nettype qeth, and 2 for other nettype. And <options> is a comma-separated list of <name>=<value> pairs, where <name> refers to a device sysfs attribute to which <value> gets written. rd.znet can be specified multiple times on the kernel command line πŸŽ€
  • rd.znet_ifname=<ifname>:<subchannels> β€” assigns the network device name <interface> (i.e. "bootnet") to the NIC that corresponds to the subchannels. This is useful when dracut's default ifname= doesn't work because the device has a changing MAC address. the glow-up your ifname needed πŸ’…

Example:

rd.znet=qeth,0.0.0600,0.0.0601,0.0.0602,layer2=1,portname=foo
rd.znet=ctc,0.0.0600,0.0.0601,protocol=bar

OverlayFS πŸ’–

Needs the dracut overlayfs module.

  • rd.overlay β€” enables the use of the OverlayFS kernel module, if available, to provide a copy-on-write union directory for the root filesystem. So here's the tea: OverlayFS overlays are directories of the files that have changed on the read-only base (lower) filesystem. The root filesystem is provided through a special overlay type mount that merges at least two directories, designated the lower and the upper. If an OverlayFS upper directory is not present on the boot device, a tmpfs directory will be created at /run/overlayfs to provide temporary storage. surprise storage, cute πŸ’œ

Persistent storage can be provided on vfat or msdos formatted devices by supplying the OverlayFS upper directory within an embedded filesystem that supports the creation of trusted.* extended attributes and provides a valid d_type in readdir responses, such as with btrfs, ext4, f2fs, & xfs. On non-vfat-formatted devices, a persistent OverlayFS overlay can extend the available root filesystem storage up to the capacity of the LiveOS disk device. capacity queen πŸ”₯

The rd.overlay.readonly option, which allows a persistent overlayfs to be mounted read-only through a higher level transient overlay directory, has been implemented through the multiple lower layers feature of OverlayFS.

  • rd.overlay=tmpfs:[size=<size>][,nr_blocks=<n>][,nr_inodes=<n>] β€” mounts a dedicated tmpfs with the specified options for the OverlayFS upper directory, instead of using the default /run tmpfs. This lets you control the size of the writable overlay at boot time, which is useful for deployments where the available RAM is known in advance (e.g. MAAS ephemeral environments). planning ahead?? we stan ✨

Supported options (comma-separated):

  • size=<size> β€” Maximum size of the tmpfs (e.g. 4G, 512M, 25%). Accepts the same values as the tmpfs size= mount option.
  • nr_blocks=<n> β€” Maximum number of blocks allocated to the tmpfs.
  • nr_inodes=<n> β€” Maximum number of inodes in the tmpfs.

Examples:

rd.overlay=tmpfs:size=4G
rd.overlay=tmpfs:size=25%
rd.overlay=tmpfs:size=512M,nr_inodes=100000
  • rd.overlay={LABEL=<label>|UUID=<uuid>|PARTUUID=<uuid>|PARTLABEL=<label>|/dev/<device>} β€” specifies the storage device for persistent overlay (for both live images and regular OverlayFS). When a block device is specified, it will be mounted and used for persistent overlay storage. For live images with LABEL= specification, if the labeled partition does not exist, it will be automatically created using available free space on the device. it literally builds itself?? iconic 😭

Supported device specifications:

  • LABEL=<label> β€” Use the device with the specified filesystem label.
  • UUID=<uuid> β€” Use the device with the specified UUID.
  • PARTUUID=<uuid> β€” Use the device with the specified partition UUID.
  • PARTLABEL=<label> β€” Use the device with the specified partition label.
  • /dev/<device> β€” Use the specified device path directly.

Examples:

rd.overlay=LABEL=persist
rd.overlay=UUID=12345678-1234-1234-1234-123456789abc
rd.overlay=/dev/sdb1
  • rd.overlay.crypt=<device>[,<option>]... β€” requires the dracut overlayfs-crypt module. spicy and encrypted πŸ”πŸ’œ

okay so rd.overlay.crypt= is literally your LUKS bestie πŸ’œ β€” it marks out an encrypted (LUKS) device for persistent overlay storage. Here's the vibe: if that device already has a valid LUKS volume on it, you get prompted for the passphrase interactively (via Plymouth if that's a thing on your system, otherwise straight up via TTY, no filter 😭). If it doesn't have one? bestie, that device is getting wiped β€” formatted with LUKS using a randomly generated passphrase, and a brand new filesystem gets created on top. That random passphrase lives at /run/initramfs/overlayfs.passwd for the duration of the boot, then it's gone, iykyk.

You pass the device as the first argument, then whatever optional comma-separated options you want:

  • <device> β€” (Required) the device spec. It's giving one of: LABEL=, UUID=, PARTLABEL=, PARTUUID=, or /dev/<device>.
  • mapname=<name> β€” the device mapper name. Default is overlay-crypt ✨
  • fstype=<type> β€” filesystem type, pick from ext2, ext3, or ext4. Default: ext4 πŸŽ€
  • mkfs=<0|1> β€” what to do about creating a filesystem: 0 = literally never create one (so you'd better already have a LUKS volume on there, fr), 1 = create it if needed (this is the default).
  • timeout=<seconds> β€” how long to wait for the device to show up. By default the global rd.timeout value is used. Set it to 0 and you skip waiting entirely, zero patience, respect πŸ’…

Examples

rd.overlay.crypt=LABEL=CRYPTOVL
rd.overlay.crypt=UUID=12345678-1234-1234-1234-123456789abc,fstype=ext3

πŸ¦‹ Booting live images πŸ¦‹

This whole situation needs the dracut dmsquash-live module, no exceptions. Dracut's got multiple options for live booted images, so let's get into it πŸ‘‘

🌸 SquashFS (read-only) base filesystem image 🌸

Note β€” there are actually 3 separate overlay types available:
  • Device-mapper snapshots (the original offering, the OG)
  • Device-mapper thin provisioning snapshots (see rd.live.overlay.thin, a later offering)
  • OverlayFS based overlay mounts (a more recent offering ✨)

Using one of these technologies, the system provides a writable overlay for the base, read-only SquashFS root filesystem. These methods enable a relatively fast boot and lower RAM usage. slay 🫢

With the original Device-mapper snapshot overlay, bestie you gotta be careful β€” do not write too many blocks to the snapshot device. Once the blocks of the snapshot overlay are exhausted, the whole root filesystem goes read-only and your applications start failing 😭. The snapshot overlay device gets marked Overflow, and a difficult recovery is required to repair and enlarge the overlay offline. So like, genuinely a whole ordeal.

When rd.overlay= is not specified for persistent overlay storage β€” or the specified file isn't found or isn't writable β€” a Device-mapper snapshot based non-persistent or temporary overlay is automatically created as a sparse file in RAM of the initramfs. This file only consumes content space as required blocks get allocated. That snapshot based overlay defaults to an apparent size of 32 GiB in RAM, and you can adjust it with the rd.live.overlay.size= kernel command line option. This file is hidden (and appears deleted πŸ‘») when the boot process switches out of the initramfs to the main root filesystem β€” but its loop device remains connected to the Device-mapper snapshot.

Even with large Device-mapper overlay files for write space, the available root filesystem capacity is limited by the total allocated size of the base root filesystem, which often provides only a small number of gigabytes of free space. rude, honestly.

That shortage could be remedied by building the root filesystem with more allocated free space β€” or you can use the OverlayFS based overlay mount method instead. your call πŸ’…

When the rd.overlay option is specified, or when rd.overlay= points to an appropriate directory with a sister at /../ovlwork, then an OverlayFS based overlay mount is employed. Such a persistent OverlayFS overlay can extend the available root filesystem storage up to the capacity of the LiveOS disk device. iconic.

For non-persistent OverlayFS overlays, the /run/overlayfs directory in the /run tmpfs is used for temporary storage. This filesystem is typically sized to one half of the RAM total in the system. The command:

mount -o remount,size=<nbytes> /run

will resize this virtual filesystem after booting. handy πŸŽ€

The internal SquashFS structure is traditionally expected to be:

squashfs.img          |  SquashFS from LiveCD .iso
   !(mount)
   /LiveOS
       |- rootfs.img  |  Usually a ext4 filesystem image to mount read-only
            !(mount)
            /bin      |  Base Live root filesystem
            /boot     |
            /dev      |
            ...       |

For OverlayFS mount overlays, the internal SquashFS structure may be a direct compression of the root filesystem:

squashfs.img          |  SquashFS from LiveCD .iso
   !(mount)
   /bin               |  Base Live root filesystem
   /boot              |
   /dev               |
   ...                |

Dracut uses one of the overlay methods of live booting by default β€” so genuinely no additional command line options are required other than root=live:<path to blockdevice> or root=live:<URL> to specify the location of your squashed root filesystem. easy ✨

  • The compressed SquashFS image can be copied during boot to RAM at /run/initramfs/squashed.img by using the rd.live.ram=1 option.
  • A device with a persistent overlay can be booted read-only by using the rd.live.overlay.readonly option on the kernel command line. This will either cause a temporary, writable overlay to be stacked over a read-only snapshot of the root filesystem, or the OverlayFS mount will use an additional lower layer with the root filesystem.

🌈 Uncompressed live filesystem image 🌈

When the live system was installed with the --skipcompress option of the livecd-iso-to-disk installation script for Live USB devices, the root filesystem image, rootfs.img, is expanded on installation and no SquashFS is involved during boot. no compression, no drama πŸ’…

  • If rd.live.ram=1 is used in this situation, the full, uncompressed root filesystem is copied during boot to /run/initramfs/rootfs.img in the /run tmpfs.
  • If rd.overlay=none is provided as a kernel command line option, a writable, linear Device-mapper target is created on boot with no overlay.

⭐ Writable filesystem image ⭐

The system will retrieve a compressed filesystem image, extract it to /run/initramfs/fsimg/rootfs.img, connect it to a loop device, create a writable, linear Device-mapper target at /dev/mapper/live-rw, and mount that as a writable volume at /. More RAM is required during boot, but the live filesystem is easier to manage if it becomes full. Users can make a filesystem image of any size and that size will be maintained when the system boots. That said β€” there is no persistence of root filesystem changes between boots with this option. gone with the wind πŸƒ

The filesystem structure is expected to be:

rootfs.tgz            |  Compressed tarball containing filesystem image
   !(unpack)
   /rootfs.img        |  Filesystem image at /run/initramfs/fsimg/
      !(mount)
      /bin            |  Live filesystem
      /boot           |
      /dev            |
      ...             |

To use this boot option, ensure that rd.writable.fsimg=1 is in your kernel command line and add the root=live:<URL> to specify the location of your compressed filesystem image tarball or SquashFS image.


πŸŽ€ rd.writable.fsimg=1 πŸŽ€

Enables writable filesystem support. The system will boot with a fully writable (but non-persistent) filesystem without snapshots (see the notes above about available live boot options πŸ’–). You can use the rootflags option to set mount options for the live filesystem as well (see documentation about rootflags in the Standard section above). This implies that the whole image is copied to RAM before the boot continues. this method is very suitable for diskless boots, ngl πŸ‘‘

Note There must be enough free RAM available to hold the complete image. like, the whole thing. don't skip this check 😭

🫢 rd.minmem=<megabyte> 🫢

Specify minimum free RAM in MB after copying a live disk image into memory. The default is 1024.

This parameter only applies together with the parameters rd.writable.fsimg or rd.live.ram. it's picky like that πŸ’…


🌸 root=live:<url> 🌸

Boots a live image retrieved from <url>. Requires the dracut livenet module. Valid handlers: http, https, ftp, torrent, tftp.

Examples

root=live:http://example.com/liveboot.img
root=live:ftp://ftp.example.com/liveboot.img
root=live:torrent://example.com/liveboot.img.torrent

πŸ¦‹ root=<http-url> πŸ¦‹

This is an alias for root=live:<url> β€” same energy, different name πŸ’œ. Boots a live image retrieved from <http-url>. Requires the dracut livenet module. Valid handlers: http, https.

Examples

root=http://example.com/root.squashfs
root=https://example.com/live.sqfs

πŸ” rd.live.debug=1 πŸ”

Enables debug output from the live boot process. use it when something's acting sus and you need the receipts πŸ’€


πŸ“ rd.live.dir=<path> πŸ“

Specifies the directory within the boot device where the squashfs.img or rootfs.img can be found. By default, this is /LiveOS.


πŸ₯ž rd.live.squashimg=<filename of SquashFS image> πŸ₯ž

Specifies the filename for a SquashFS image of the root filesystem. By default, this is squashfs.img.


πŸ’Ύ rd.live.ram=1 πŸ’Ύ

Copy the complete image to RAM and use this for booting. This is useful when the image resides on, e.g., a DVD which needs to be ejected later on. (eject that disc, bestie ✨)


🧚 rd.overlay={<devspec>[:{<pathspec>|auto}]|none} 🧚

Manage the usage of a persistent overlay for live images. this is the main character option fr πŸ‘‘

  • <devspec> specifies the path to a device with a mountable filesystem.
  • <pathspec> is a path within the <devspec> filesystem to either
    • a file (that is loop mounted for a Device-mapper overlay) or
    • a directory (that is symbolically linked to /run/overlayfs for a OverlayFS mount overlay). (A required sister directory /<pathspec>/../ovlwork is automatically made. no cap 🫢)
  • none (the word itself) β€” means no overlay at all, periodt. Use this when you’ve got an uncompressed, writable live root filesystem already available. πŸ’…

The above method is how you persist changes made to the root filesystem specified within the root=live:<path to blockdevice> or root=live:<url> device.

The default pathspec, when :auto or no :<pathspec> is given, is /<rd.live.dir>/overlay-<label>-<uuid>, where <label> and <uuid> are the LABEL and UUID of the filesystem specified by the root=live:<path|url> device.

If a persistent overlay is detected at the standard LiveOS path, and rd.overlay is not set to 1, the overlay type (either Device-mapper or OverlayFS) will be detected and it will be used. ✨

Examples:

rd.overlay=/dev/sdb1:/persistent-overlay.img
rd.overlay=UUID=99440c1f-8daa-41bf-b965-b7240a8996f4

  • rd.live.overlay.cowfs=[btrfs|ext4|xfs] β€” tells it which filesystem to use when formatting the overlay partition. The default is ext4. πŸŽ€
  • rd.live.overlay.size=<size_MiB> β€” sets a non-persistent Device-mapper overlay size in MiB. The default is 32768. πŸ¦‹
  • rd.live.overlay.readonly=1 β€” boots in read-only mode with a normally read-write persistent overlay. With this option:
    • Device-mapper overlays will have an additional, non-persistent, writable snapshot overlay stacked over a read-only snapshot (/dev/mapper/live‑ro) of the base root filesystem and the persistent overlay, or
    • for writable rootfs.img images, the above over a read-only loop device, or
    • an OverlayFS mount will link the persistent overlay directory at /run/overlayfs‑r as an additional read-only lower layer stacked over the base root filesystem, and /run/overlayfs becomes the temporary, writable, upper directory overlay, to complete the bootable root filesystem.
  • rd.live.overlay.nouserconfirmprompt= β€” suppresses the Using temporary overlay blocking prompt that asks for user confirmation before proceeding to boot. This lets the boot process continue to completion without any user interaction. 😌
  • rd.overlay.reset=1 β€” says a persistent overlay should be reset on boot. All previous root filesystem changes are vacated by this action. πŸ’€
  • rd.live.overlay.thin=1 β€” enables thin snapshots instead of classic dm snapshots. The advantage of thin snapshots is that they support discards, and will free blocks that are not claimed by the filesystem. In this use case, this means that memory is given back to the kernel when the filesystem does not claim it anymore. πŸ”₯

🧚 ZIPL 🧚

Requires the dracut zipl module.

  • rd.zipl=<path to blockdevice> β€” updates the dracut commandline with the values found in the dracut-cmdline.conf file on the given device. The values are merged into the existing commandline values and the udev events are regenerated. ✨

Example:

rd.zipl=UUID=0fb28157-99e3-4395-adef-da3f7d44835a

πŸŒ€ CIO_IGNORE πŸŒ€

Requires the dracut cio_ignore module.

  • rd.cio_accept=<device-ids> β€” removes the devices listed in <device-ids> from the default cio_ignore kernel command-line settings. <device-ids> is a list of comma-separated CCW device ids. The default for this value is taken from the /boot/zipl/active_devices.txt file. 🫢

Example:

rd.cio_accept=0.0.0180,0.0.0800,0.0.0801,0.0.0802

πŸ› Plymouth Boot Splash πŸ›

Requires the dracut plymouth module.

  • plymouth.enable=0 β€” disables the plymouth bootsplash completely. πŸ’…
  • rd.plymouth=0 β€” disables the plymouth bootsplash only for the initramfs. 🌸

πŸ”‘ Kernel keys πŸ”‘

  • masterkey=<kernel master key path name> β€” sets the path name of the kernel master key.

Example:

masterkey=/etc/keys/kmk-trusted.blob
  • masterkeytype=<kernel master key type> β€” sets the type of the kernel master key.

Example:

masterkeytype=trusted
  • evmkey=<EVM HMAC key path name> β€” sets the path name of the EVM HMAC key.

Example:

evmkey=/etc/keys/evm-trusted.blob
  • evmx509=<EVM X.509 cert path name> β€” sets the path name of the EVM X.509 certificate.

Example:

evmx509=/etc/keys/x509_evm.der
  • ecryptfskey=<eCryptfs key path name> β€” sets the path name of the eCryptfs key.

Example:

ecryptfskey=/etc/keys/ecryptfs-trusted.blob

πŸ’€ Deprecated, renamed Options πŸ’€

Here’s the list of options and their new replacement. Lowkey important if you’re holding onto old habits, bestie.

  • rd_NO_DM β†’ rd.dm=0 (since version 008)
  • rd_NO_MDADMCONF β†’ rd.md.conf=0 (since version 008)
  • rd_NO_MDIMSM β†’ rd.md.imsm=0 (since version 008)
  • rd_NO_MD β†’ rd.md=0 (since version 008)
  • rd_MD_UUID β†’ rd.md.uuid (since version 008)
  • iscsi_initiator β†’ rd.iscsi.initiator (since version 008)
  • iscsi_target_name β†’ rd.iscsi.target.name (since version 008)
  • iscsi_target_ip β†’ rd.iscsi.target.ip (since version 008)
  • iscsi_target_port β†’ rd.iscsi.target.port (since version 008)
  • iscsi_target_group β†’ rd.iscsi.target.group (since version 008)
  • iscsi_username β†’ rd.iscsi.username (since version 008)
  • iscsi_password β†’ rd.iscsi.password (since version 008)
  • iscsi_in_username β†’ rd.iscsi.in.username (since version 008)
  • iscsi_in_password β†’ rd.iscsi.in.password (since version 008)
  • iscsi_firmware β†’ rd.iscsi.firmware=0 (since version 008)
  • rdudevdebug β†’ rd.udev.udev_log=debug (since version 102)
  • rdudevinfo β†’ rd.udev.udev_log=info (since version 102)
  • rd.udev.debug β†’ rd.udev.udev_log=debug (since version 102)
  • rd.udev.info β†’ rd.udev.udev_log=info (since version 102)
  • KEYMAP β†’ vconsole.keymap (since version 008)
  • KEYTABLE β†’ vconsole.keymap (since version 008)
  • SYSFONT β†’ vconsole.font (since version 008)
  • CONTRANS β†’ vconsole.font.map (since version 008)
  • UNIMAP β†’ vconsole.font.unimap (since version 008)
  • UNICODE β†’ vconsole.unicode (since version 008)
  • EXT_KEYMAP β†’ vconsole.keymap.ext (since version 008)
  • rd.live.overlay.overlayfs β†’ rd.overlay (since version 110)
  • rd.live.overlay.readonly β†’ rd.overlay.readonly (since version 110)
  • rd.live.overlay β†’ rd.overlay (since version 110)
  • rd.live.overlay.reset β†’ rd.overlay.reset (since version 110)

πŸ“ Configuration in the Initramfs πŸ“

  • /etc/conf.d/ β€” any files found in /etc/conf.d/ will be sourced in the initramfs to set initial values. Command line options will override these values set in the configuration files. πŸ“
  • /etc/cmdline β€” can contain additional command line options. Deprecated, better use /etc/cmdline.d/*.conf. πŸ™ˆ
  • /etc/cmdline.d/*.conf β€” can contain additional command line options. πŸ’œ

πŸ‘‘ AUTHOR πŸ‘‘

Harald Hoyer

🌈 SEE ALSO 🌈

man:dracut[8] man:dracut.conf[5]


This cutie is from the dracut source/version, dated 2026-06-01, and it lives at DRACUT.CMDLINE(7) β€” bye bestie, go slay your boot config! πŸ’–πŸŽ€

πŸ“¦ where this page comes from