feat: initramfs module (#376)

* feat: `initramfs` module

* chore: Add `initramfs` to `modules.json`

* docs: Mention `dracut.conf.d` files as modifications which need initramfs regeneration

* docs: Style fix

* docs: Style fix

* docs: One more style fix

* docs: Add note about difference between `rpm-ostree initramfs` & this module

* docs: Further explanation of initramfs

* docs: Style fixes

* docs: Style fix

* docs: Grammar fixes

* chore: Add check for Fedora 41+

* docs: Add note about F41+ support

* docs: Add 3 dots for note

* chore: Grammar improvement in log

* chore: Some more explanations in log for old Fedora version

* chore: Add error message for cliwrapped images

* chore: Use cliwrapped dracut if available

* docs: Apply caution card suggestion

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>

* docs: Apply suggestion about modifications list

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>

* docs: Apply grammar suggestion for when this module should be used

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>

* chore: Make log message about initramfs regeneration state clearer

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>

* docs: Apply suggestion about expanded module description

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>

* docs: RAM instead of ram

* chore: Fix log typo

* docs: Update description in typeschema

* docs: Update description in module.yml

* chore: Notify of more than 1 qualified kernel before initramfs image variable

* chore: finalize shortdesc wording

---------

Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>
This commit is contained in:
fiftydinar 2024-12-15 11:02:37 +01:00 committed by GitHub
parent 902a0b1c61
commit 23e36119b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 82 additions and 0 deletions

View file

@ -10,6 +10,7 @@
"https://raw.githubusercontent.com/blue-build/modules/main/modules/gschema-overrides/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/justfiles/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/rpm-ostree/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/initramfs/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/script/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/signing/module.yml",
"https://raw.githubusercontent.com/blue-build/modules/main/modules/systemd/module.yml",

View file

@ -0,0 +1,23 @@
# `initramfs`
:::caution
This module is only supported for Fedora 41+ images.
:::
The `initramfs` module is used to regenerate initramfs, which is the temporary file system loaded into RAM, as part of the early Linux startup process, used by many things happening during boot.
If you are trying to modify something related to the kernel or boot sequence (such as plymouth), but you don't see any changes applied to the system, you'll likely need to use this module.
You need to regenerate initramfs at least when doing any of the following:
- modifying `modprobe.d` config files
- modifying `modules-load.d` config files
- modifying `dracut.conf.d` config files
- customizing `plymouth` theming
- other unknown modifications
You only need to run the regeneration once per build, not separately for each modification requiring it. It is recommended to set this module as one of the last in your recipe, to ensure that initramfs regeneration will cover all the modifications done before it.
:::note
Client-side initramfs regeneration like `rpm-ostree initramfs` & `rpm-ostree initramfs-etc` are for local-users only & not to be confused with this module's build-time initramfs regeneration.
This module regenerates the system initramfs during the build process, while `rpm-ostree initramfs` & `rpm-ostree initramfs-etc` regenerate the local initramfs on top of the system one every update on the local-user's system.
:::

View file

@ -0,0 +1,44 @@
#!/usr/bin/env bash
set -euo pipefail
if ! command -v rpm-ostree &> /dev/null || ! command -v bootc &> /dev/null; then
echo "This module is only compatible with Fedora Atomic images"
exit 1
fi
if [[ "${OS_VERSION}" -le 40 ]]; then
echo "This module is only compatible with Fedora 41+ images."
exit 1
fi
# If images already installed cliwrap, use it. Only used in transition period, so it should be removed when base images like Ublue remove cliwrap
if [[ -f "/usr/libexec/rpm-ostree/wrapped/dracut" ]]; then
DRACUT="/usr/libexec/rpm-ostree/wrapped/dracut"
else
DRACUT="/usr/bin/dracut"
fi
# NOTE!
# This won't work when Fedora starts to utilize UKIs (Unified Kernel Images).
# UKIs will contain kernel + initramfs + bootloader.
# Refactor the module to support UKIs once they are starting to be used, if possible.
# That won't be soon, so this module should work for good period of time
KERNEL_MODULES_PATH="/usr/lib/modules"
readarray -t QUALIFIED_KERNEL < <(find "${KERNEL_MODULES_PATH}" -mindepth 1 -maxdepth 1 -type d -printf "%f\n")
if [[ "${#QUALIFIED_KERNEL[@]}" -gt 1 ]]; then
echo "ERROR: There are several versions of kernel's initramfs."
echo " Cannot determine which one to regenerate."
echo " There is a possibility that you have multiple kernels installed in the image."
echo " Please only include 1 kernel in the image to solve this issue."
exit 1
fi
INITRAMFS_IMAGE="${KERNEL_MODULES_PATH}/${QUALIFIED_KERNEL[*]}/initramfs.img"
echo "Starting initramfs regeneration for kernel version: ${QUALIFIED_KERNEL[*]}"
"${DRACUT}" --no-hostonly --kver "${QUALIFIED_KERNEL[*]}" --reproducible -v --add ostree -f "${INITRAMFS_IMAGE}"
chmod 0600 "${INITRAMFS_IMAGE}"

View file

@ -0,0 +1,10 @@
import "@typespec/json-schema";
using TypeSpec.JsonSchema;
@jsonSchema("/modules/initramfs.json")
model InitramfsModule {
/** The initramfs module is used to regenerate initramfs, needed to apply some modifications early in the Linux startup process.
* https://blue-build.org/reference/modules/initramfs/
*/
type: "initramfs";
}

View file

@ -0,0 +1,4 @@
name: initramfs
shortdesc: The `initramfs` module is used to regenerate initramfs, needed to apply some modifications early in the Linux startup process
example: |
type: initramfs