Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Managing the initramfs after installation

The initramfs is part of the container image and is updated together with the image. On systems using the OSTree backend with a split kernel and initramfs, the canonical path is /usr/lib/modules/$kver/initramfs.img. Editing the copy in /boot is not supported because bootc replaces it from the container image during an update.

For how to modify and regenerate the initramfs inside an image build, including dracut drop-in configuration, see your operating system's documentation, for example Fedora's bootc initramfs guide.

Prefer generic configuration

Content that at first looks machine-specific often does not need to be. A single generic image can carry configuration that dispatches on a machine-specific identifier at runtime — a hardware MAC address, a DMI property, a disk serial, and so on. A udev rule that matches particular hardware, for instance, can ship in the base or a shared derived image and still only act on the machine that has that hardware.

Reach for a machine-local image only when the content genuinely cannot be expressed generically. Keeping configuration in shared images means fewer distinct images to build, test, and update.

Machine-local initramfs content

When machine-specific initramfs content really is required — such as a udev rule needed to unlock local storage that cannot be selected generically — and until bootc has a dedicated interface for this use case, build a machine-local derived image containing the configuration and its regenerated initramfs. This keeps the image, rather than mutable files in /boot, as the source of truth.

This procedure applies to the OSTree backend with a split kernel and initramfs. It does not apply to sealed composefs/UKI images.

Create a build context containing the machine-specific files. For example:

.
├── Containerfile
└── 98-storage.rules

The Containerfile derives from the image shown by bootc status, adds the files, and regenerates the initramfs. Configure dracut with a drop-in under /usr/lib/dracut/dracut.conf.d and regenerate for the image's kernel, per your OS's initramfs documentation:

FROM quay.io/example/example-bootc:latest

COPY 98-storage.rules /etc/udev/rules.d/98-storage.rules
RUN echo 'install_items+=" /etc/udev/rules.d/98-storage.rules "' \
      > /usr/lib/dracut/dracut.conf.d/50-storage.conf

RUN set -xe; kver=$(ls /usr/lib/modules); \
    env DRACUT_NO_XATTR=1 dracut -vf "/usr/lib/modules/${kver}/initramfs.img" "$kver"; \
    bootc container lint

A bootc image must contain exactly one kernel, so ls /usr/lib/modules must resolve to a single directory; bootc container lint checks this image invariant. Dracut must be told the kernel version explicitly, because its default targets the running kernel, which is not what a build should use. The exact dracut modules and arguments depend on the base image and the content being added.

Build the image locally and deploy it exactly as any other local build; see Booting local builds for building against the booted image, the containers-storage transport, and automating the rebuild. Rebuild and switch to this derived image whenever either the base image or the machine-specific configuration changes.

The rpm-ostree client-side initramfs mechanism

On rpm-ostree-managed systems, rpm-ostree initramfs --enable enables client-side initramfs regeneration and accepts additional dracut arguments. However, this mechanism predates bootc and records the regenerated initramfs as a local rpm-ostree modification in the deployment origin (a regenerate-initramfs key under [rpmostree]).

Bootc does not currently know how to reproduce or carry that configuration onto a new container-image deployment. It marks a deployment with rpm-ostree local modifications as incompatible, and bootc upgrade refuses to update it with an error such as "Deployment contains local rpm-ostree modifications". Running rpm-ostree reset removes the local modifications and allows bootc to manage the deployment again, but also removes the client-side initramfs configuration. It may remove other rpm-ostree package layering and overrides as well, so inspect the pending changes before running it. Therefore, do not use rpm-ostree initramfs --enable for this workflow if the system is intended to continue receiving updates through bootc; use a derived container image instead. See also Relationship with rpm-ostree.

Future direction

UKI add-ons are the intended mechanism for adding machine-specific kernel arguments or initrd content without rebuilding a Unified Kernel Image. The bootc project is working toward this model for composefs/UKI systems.

For OSTree environments that do not use composefs with sealed UKIs, support for supplementary initrds has been requested in ostree#3634, and a general bootc interface is being designed in bootc#2414. Until that design is implemented, use the machine-local derived-image workflow above.


The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see Trademark Usage.