[3/8] initramfs: move dracut logic to initrd-dracut class

Message ID 20260915100125.1991311-4-felix.moessbauer@siemens.com
State Under Review
Headers show
Series [1/8] rootfs: generalize deployment of rootfs artifact | expand

Commit Message

Felix Moessbauer Sept. 15, 2026, 10:01 a.m. UTC
As a preparation to extend the dracut logic for cross, we move it to the
initrd-dracut class. This also gives a cleaner interface for initrd
generation, as both mkinitramfs and dracut can now be generated by
inheriting the initramfs.bbclass.

Signed-off-by: Felix Moessbauer <felix.moessbauer@siemens.com>
---
 .../recipes-initramfs/images/isar-dracut.bb   |  4 ++-
 meta/classes-recipe/initramfs.bbclass         |  2 ++
 meta/classes-recipe/initrd-dracut.bbclass     |  7 ++++-
 meta/classes-recipe/rootfs.bbclass            | 28 ++++++++++++-------
 4 files changed, 29 insertions(+), 12 deletions(-)

Patch

diff --git a/meta-isar/recipes-initramfs/images/isar-dracut.bb b/meta-isar/recipes-initramfs/images/isar-dracut.bb
index c75b69e3..efd6d1ec 100644
--- a/meta-isar/recipes-initramfs/images/isar-dracut.bb
+++ b/meta-isar/recipes-initramfs/images/isar-dracut.bb
@@ -4,7 +4,9 @@ 
 #
 # This software is a part of Isar.
 
-inherit initrd-dracut
+INITRAMFS_USE_DRACUT = "1"
+
+inherit initramfs
 
 # Debian packages that should be installed into the system for building the
 # initramfs.  E.g. the cryptsetup package which contains initramfs scripts for
diff --git a/meta/classes-recipe/initramfs.bbclass b/meta/classes-recipe/initramfs.bbclass
index 45626319..41828487 100644
--- a/meta/classes-recipe/initramfs.bbclass
+++ b/meta/classes-recipe/initramfs.bbclass
@@ -10,6 +10,7 @@  INITRAMFS_PREINSTALL ?= ""
 INITRAMFS_ROOTFS ?= "${WORKDIR}/rootfs"
 INITRAMFS_IMAGE_NAME = "${INITRAMFS_FULLNAME}-initrd.img"
 INITRAMFS_GENERATOR_PKG ??= "initramfs-tools"
+INITRAMFS_USE_DRACUT ??= "0"
 INITRD_DEPLOY_FILE = "${INITRAMFS_IMAGE_NAME}"
 
 # Install proper kernel
@@ -28,6 +29,7 @@  DEPENDS += "${INITRAMFS_INSTALL}"
 ROOTFSDIR = "${INITRAMFS_ROOTFS}"
 ROOTFS_FEATURES += "generate-manifest generate-sbom generate-initrd"
 ROOTFS_PACKAGES = "${INITRAMFS_GENERATOR_PKG} ${INITRAMFS_PREINSTALL} ${INITRAMFS_INSTALL}"
+ROOTFS_USE_DRACUT ?= "${INITRAMFS_USE_DRACUT}"
 
 # validate whether there are incompatible packages in the installation list
 python do_validate_rootfs_packages () {
diff --git a/meta/classes-recipe/initrd-dracut.bbclass b/meta/classes-recipe/initrd-dracut.bbclass
index 542b1fbe..c2018f03 100644
--- a/meta/classes-recipe/initrd-dracut.bbclass
+++ b/meta/classes-recipe/initrd-dracut.bbclass
@@ -53,6 +53,11 @@  def extend_dracut_cmdline(d):
         cmdline.append(f'--add "{extra_modules}"')
     return ' '.join(cmdline)
 
+ROOTFS_INITRAMFS_GENERATOR_CMDLINE = "dracut --force --kver $kernel_version"
 ROOTFS_INITRAMFS_GENERATOR_CMDLINE:append = " ${@ extend_dracut_cmdline(d)}"
 
-inherit initramfs
+run_initrd_generator() {
+    mods_total="$(find ${ROOTFSDIR}/usr/lib/modules/$kernel_version -type f -name '*.ko*' | wc -l)"
+    echo "Total number of modules: $mods_total (dracut)"
+    run_in_chroot "${ROOTFSDIR}" sh -c "${ROOTFS_INITRAMFS_GENERATOR_CMDLINE}"
+}
diff --git a/meta/classes-recipe/rootfs.bbclass b/meta/classes-recipe/rootfs.bbclass
index d3b0d471..1de27d7b 100644
--- a/meta/classes-recipe/rootfs.bbclass
+++ b/meta/classes-recipe/rootfs.bbclass
@@ -13,18 +13,20 @@  DEPLOYDIR = "${WORKDIR}/deploy"
 # This variable is intended to be set if dracut is
 # the default initramfs generator and it is not
 # possible to derive the value in another way
-ROOTFS_USE_DRACUT ??= ""
+ROOTFS_USE_DRACUT ??= "${@ '1' if 'dracut' in (d.getVar('ROOTFS_PACKAGES') or '').split() else '0' }"
 
-def initramfs_generator_cmdline(d):
-    rootfs_packages =  d.getVar('ROOTFS_PACKAGES') or ''
-    if 'dracut' in rootfs_packages or bb.utils.to_boolean(d.getVar('ROOTFS_USE_DRACUT')):
-        return "dracut --force --kver \"$kernel_version\""
-    return "update-initramfs -u -v -k \"$kernel_version\""
+# In case no initrd is generated, force dracut off to not let bitbake hashes
+# depend on the dracut config which anyways is not used.
+python () {
+    rootfs_features = d.getVar('ROOTFS_FEATURES') or ''
+    if 'generate-initrd' not in rootfs_features.split():
+        d.setVar('ROOTFS_USE_DRACUT', '0')
+}
 
 ROOTFS_PACKAGES ?= ""
 ROOTFS_VARDEPS ?= ""
 ROOTFS_INITRAMFS_GENERATOR_CMD = "${@ d.getVar('ROOTFS_INITRAMFS_GENERATOR_CMDLINE').split()[0]}"
-ROOTFS_INITRAMFS_GENERATOR_CMDLINE = "${@ initramfs_generator_cmdline(d)}"
+ROOTFS_INITRAMFS_GENERATOR_CMDLINE = "update-initramfs -u -v -k $kernel_version"
 ROOTFS_BASE_DISTRO ?= "${BASE_DISTRO}"
 
 # Features of the rootfs creation:
@@ -650,6 +652,14 @@  rootfs_set_timestamps() {
         -exec touch '{}' -h -d@${SOURCE_DATE_EPOCH} ';'
 }
 
+run_initrd_generator() {
+    mods_total="$(find ${ROOTFSDIR}/usr/lib/modules/$kernel_version -type f -name '*.ko*' | wc -l)"
+    echo "Total number of modules: $mods_total (mkinitramfs)"
+    run_in_chroot "${ROOTFSDIR}" sh -ec '${ROOTFS_INITRAMFS_GENERATOR_CMDLINE}'
+}
+
+inherit_defer ${@'initrd-dracut' if bb.utils.to_boolean(d.getVar('ROOTFS_USE_DRACUT')) else ''}
+
 ROOTFS_INSTALL_COMMAND += "${@bb.utils.contains('ROOTFS_FEATURES', 'generate-initrd', 'rootfs_generate_initramfs', '', d)}"
 rootfs_generate_initramfs[weight] = "1000"
 rootfs_generate_initramfs[progress] = "custom:rootfs_progress.InitrdProgressHandler"
@@ -657,10 +667,8 @@  rootfs_generate_initramfs() {
     if [ -n "$(find '${ROOTFSDIR}/boot' -type f -name 'vmlinu[xz]*')" ]; then
         for kernel in ${ROOTFSDIR}/boot/vmlinu[xz]-*; do
             export kernel_version=$(basename $kernel | cut -d'-' -f2-)
-            mods_total="$(find ${ROOTFSDIR}/usr/lib/modules/$kernel_version -type f -name '*.ko*' | wc -l)"
-            echo "Total number of modules: $mods_total"
             echo "Generating initrd for kernel version: $kernel_version"
-            run_in_chroot "${ROOTFSDIR}" sh -ec '${ROOTFS_INITRAMFS_GENERATOR_CMDLINE}'
+            run_initrd_generator
             # on dracut, the initrd is not world-readable
             run_privileged find ${ROOTFSDIR}/boot -name "initrd.img-$kernel_version*" -exec cat {} \; \
                 > ${DEPLOYDIR}/${INITRD_DEPLOY_FILE}