diff mbox series

[RFC,07/08] rootfs: don't carry debug rootfs postinst registrations into the image

Message ID 20261106173235.4155305-8-bruce.ashfield@gmail.com
State New
Headers show
Series enhance kernel -devsrc output options | expand

Commit Message

Bruce Ashfield Nov. 6, 2026, 5:32 p.m. UTC
From: Bruce Ashfield <bruce.ashfield@gmail.com>

The debug rootfs is created in the image's rootfs directory, with the
same package manager, so its package installs use the image's intercept
scripts. Postinsts register their packages in those scripts, and the
intercepts are only run once, for the image, after the debug rootfs has
been moved aside.

So a package that is only installed in the debug rootfs (from
IMAGE_INSTALL_DEBUGFS) and has an on-target postinst is registered with
delay_to_first_boot, and do_rootfs then tries to save its postinst from
the image, where it isn't installed:

  ERROR: core-image-minimal-1.0-r0 do_rootfs: Could not invoke rpm. Command
  '.../rpm -q --root=.../rootfs --queryformat %{postin} <pkg>' returned 1:
  package <pkg> is not installed

Other intercepts get the debug packages added to their package lists in
the same way.

The debug rootfs is a debug sysroot, it isn't booted, so there is nothing
to defer its postinsts to. Save the image's intercept scripts before the
debug packages are installed, and put them back afterwards, so the
intercepts only see what the image installed.

Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
---
 meta/lib/oe/rootfs.py | 13 +++++++++++++
 1 file changed, 13 insertions(+)
diff mbox series

Patch

diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index e0365da285..aac93dc42e 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -145,6 +145,16 @@  class Rootfs(object, metaclass=ABCMeta):
                     shutil.copy(os.path.join(root, f),
                                 self.image_rootfs + relative_dir)
 
+        # The debug rootfs is installed with the image's intercept scripts, and
+        # postinsts register their packages in them (delay_to_first_boot, for
+        # example). The intercepts are only run for the image, so a package
+        # installed only in the debug rootfs would have its postinst saved
+        # against an image that doesn't contain it. Put the image's intercepts
+        # back once the debug packages are installed.
+        intercepts_dir = self.pm.intercepts_dir
+        bb.utils.remove(intercepts_dir + '-orig', True)
+        shutil.copytree(intercepts_dir, intercepts_dir + '-orig', symlinks=True)
+
         bb.note("  Install complementary '*-dbg' packages...")
         self.pm.install_complementary('*-dbg')
 
@@ -162,6 +172,9 @@  class Rootfs(object, metaclass=ABCMeta):
             bb.note("  Install extra debug packages...")
             self.pm.install(extra_debug_pkgs.split(), True)
 
+        bb.utils.remove(intercepts_dir, True)
+        bb.utils.rename(intercepts_dir + '-orig', intercepts_dir)
+
         bb.note("  Removing package database...")
         for path in package_paths:
             if os.path.isdir(self.image_rootfs + path):