* [PATCH 2/4] overlayfs: oe-selftest: Make the test more deterministic
2025-12-22 11:38 [PATCH 1/4] overlayfs: Fix QA failure uvv.mail
@ 2025-12-22 11:38 ` uvv.mail
2025-12-22 11:38 ` [PATCH 3/4] overlayfs: Remove helper unit uvv.mail
2025-12-22 11:38 ` [PATCH 4/4] oe-selftest: overlayfs: Add a demo case for /etc uvv.mail
2 siblings, 0 replies; 6+ messages in thread
From: uvv.mail @ 2025-12-22 11:38 UTC (permalink / raw)
To: openembedded-core; +Cc: Vyacheslav Yurkov
From: Vyacheslav Yurkov <uvv.mail@gmail.com>
The test orignally was written under assumption that poky distro is
used. When poky-altcft is used for example, then systemd is already set
in DISTRO_FETURES, which the test did not expect.
Signed-off-by: Vyacheslav Yurkov <uvv.mail@gmail.com>
---
meta/lib/oeqa/selftest/cases/overlayfs.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/meta/lib/oeqa/selftest/cases/overlayfs.py b/meta/lib/oeqa/selftest/cases/overlayfs.py
index 580fbdcb9c..3e55e97927 100644
--- a/meta/lib/oeqa/selftest/cases/overlayfs.py
+++ b/meta/lib/oeqa/selftest/cases/overlayfs.py
@@ -5,7 +5,7 @@
#
from oeqa.selftest.case import OESelftestTestCase
-from oeqa.utils.commands import bitbake, runqemu, get_bb_vars
+from oeqa.utils.commands import bitbake, runqemu, get_bb_vars, get_bb_var
from oeqa.core.decorator import OETestTag
from oeqa.core.decorator.data import skipIfNotMachine
@@ -46,7 +46,8 @@ inherit overlayfs
res = bitbake('core-image-minimal', ignore_status=True)
line = getline(res, "overlayfs-user was skipped: missing required distro features")
self.assertTrue("overlayfs" in res.output, msg=res.output)
- self.assertTrue("systemd" in res.output, msg=res.output)
+ if not "systemd" in get_bb_var('DISTRO_FEATURES'):
+ self.assertTrue("systemd" in res.output, msg=res.output)
self.assertTrue("ERROR: Required build target 'core-image-minimal' has no buildable providers." in res.output, msg=res.output)
def test_not_all_units_installed(self):
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 3/4] overlayfs: Remove helper unit
2025-12-22 11:38 [PATCH 1/4] overlayfs: Fix QA failure uvv.mail
2025-12-22 11:38 ` [PATCH 2/4] overlayfs: oe-selftest: Make the test more deterministic uvv.mail
@ 2025-12-22 11:38 ` uvv.mail
2025-12-22 11:38 ` [PATCH 4/4] oe-selftest: overlayfs: Add a demo case for /etc uvv.mail
2 siblings, 0 replies; 6+ messages in thread
From: uvv.mail @ 2025-12-22 11:38 UTC (permalink / raw)
To: openembedded-core; +Cc: Vyacheslav Yurkov
From: Vyacheslav Yurkov <uvv.mail@gmail.com>
Since systemd v256 workdir and upperdir are automatically created if
they don't exist, so we don't need an additional helper unit anymore.
Ref: https://github.com/systemd/systemd/commit/6c75eff6afd90596d09a33a9275be292db4e3380
Signed-off-by: Vyacheslav Yurkov <uvv.mail@gmail.com>
---
meta/classes-recipe/overlayfs.bbclass | 10 ----------
meta/classes-recipe/rootfs-postcommands.bbclass | 13 +------------
meta/files/overlayfs-create-dirs.service.in | 13 -------------
meta/files/overlayfs-create-dirs.sh | 11 -----------
meta/files/overlayfs-unit.mount.in | 3 +--
meta/lib/oe/overlayfs.py | 4 ----
6 files changed, 2 insertions(+), 52 deletions(-)
delete mode 100644 meta/files/overlayfs-create-dirs.service.in
delete mode 100644 meta/files/overlayfs-create-dirs.sh
diff --git a/meta/classes-recipe/overlayfs.bbclass b/meta/classes-recipe/overlayfs.bbclass
index a82763ec10..07cc68ad7b 100644
--- a/meta/classes-recipe/overlayfs.bbclass
+++ b/meta/classes-recipe/overlayfs.bbclass
@@ -55,27 +55,21 @@ REQUIRED_DISTRO_FEATURES += "systemd overlayfs"
inherit systemd features_check
-OVERLAYFS_CREATE_DIRS_TEMPLATE ??= "${COREBASE}/meta/files/overlayfs-create-dirs.service.in"
OVERLAYFS_MOUNT_UNIT_TEMPLATE ??= "${COREBASE}/meta/files/overlayfs-unit.mount.in"
OVERLAYFS_ALL_OVERLAYS_TEMPLATE ??= "${COREBASE}/meta/files/overlayfs-all-overlays.service.in"
python do_create_overlayfs_units() {
from oe.overlayfs import mountUnitName
- with open(d.getVar("OVERLAYFS_CREATE_DIRS_TEMPLATE"), "r") as f:
- CreateDirsUnitTemplate = f.read()
with open(d.getVar("OVERLAYFS_MOUNT_UNIT_TEMPLATE"), "r") as f:
MountUnitTemplate = f.read()
with open(d.getVar("OVERLAYFS_ALL_OVERLAYS_TEMPLATE"), "r") as f:
AllOverlaysTemplate = f.read()
def prepareUnits(data, lower):
- from oe.overlayfs import helperUnitName
-
args = {
'DATA_MOUNT_POINT': data,
'DATA_MOUNT_UNIT': mountUnitName(data),
- 'CREATE_DIRS_SERVICE': helperUnitName(lower),
'LOWERDIR': lower,
}
@@ -83,10 +77,6 @@ python do_create_overlayfs_units() {
with open(os.path.join(d.getVar('WORKDIR'), mountUnitName(lower)), 'w') as f:
f.write(MountUnitTemplate.format(**args))
- bb.debug(1, "Generate helper systemd unit %s" % helperUnitName(lower))
- with open(os.path.join(d.getVar('WORKDIR'), helperUnitName(lower)), 'w') as f:
- f.write(CreateDirsUnitTemplate.format(**args))
-
def prepareGlobalUnit(dependentUnits):
from oe.overlayfs import allOverlaysUnitName
args = {
diff --git a/meta/classes-recipe/rootfs-postcommands.bbclass b/meta/classes-recipe/rootfs-postcommands.bbclass
index 2a36840f29..f0c7ee658d 100644
--- a/meta/classes-recipe/rootfs-postcommands.bbclass
+++ b/meta/classes-recipe/rootfs-postcommands.bbclass
@@ -47,7 +47,7 @@ ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "systemd"
ROOTFS_POSTPROCESS_COMMAND += 'empty_var_volatile'
-ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "overlayfs", "overlayfs_qa_check overlayfs_postprocess", "", d)}'
+ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "overlayfs", "overlayfs_qa_check", "", d)}'
inherit image-artifact-names
@@ -570,14 +570,3 @@ python overlayfs_qa_check() {
if not allUnitExist:
bb.fatal('Not all mount paths and units are installed in the image')
}
-
-python overlayfs_postprocess() {
- import shutil
-
- # install helper script
- helperScriptName = "overlayfs-create-dirs.sh"
- helperScriptSource = oe.path.join(d.getVar("COREBASE"), "meta/files", helperScriptName)
- helperScriptDest = oe.path.join(d.getVar("IMAGE_ROOTFS"), "/usr/sbin/", helperScriptName)
- shutil.copyfile(helperScriptSource, helperScriptDest)
- os.chmod(helperScriptDest, 0o755)
-}
diff --git a/meta/files/overlayfs-create-dirs.service.in b/meta/files/overlayfs-create-dirs.service.in
deleted file mode 100644
index c8431548d7..0000000000
--- a/meta/files/overlayfs-create-dirs.service.in
+++ /dev/null
@@ -1,13 +0,0 @@
-[Unit]
-Description=Overlayfs directories setup {LOWERDIR}
-RequiresMountsFor={DATA_MOUNT_POINT}
-DefaultDependencies=no
-
-[Service]
-Type=oneshot
-ExecStart=/usr/sbin/overlayfs-create-dirs.sh {LOWERDIR} {DATA_MOUNT_POINT}
-RemainAfterExit=true
-StandardOutput=journal
-
-[Install]
-WantedBy=multi-user.target
diff --git a/meta/files/overlayfs-create-dirs.sh b/meta/files/overlayfs-create-dirs.sh
deleted file mode 100644
index 9954c34352..0000000000
--- a/meta/files/overlayfs-create-dirs.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-# This script is intended to be used sorely by overlayfs-create-dirs.service
-# Usage: overlayfs-create-dirs.sh <LOWERDIR> <DATA_MOUNT_POINT>
-
-lowerdir=$1
-datamountpoint=$2
-mkdir -p ${datamountpoint}/upper${lowerdir}
-mkdir -p ${datamountpoint}/workdir${lowerdir}
-if [ -d "$lowerdir" ]; then
- chown $(stat -c "%U:%G" ${lowerdir}) ${datamountpoint}/upper${lowerdir}
-fi
diff --git a/meta/files/overlayfs-unit.mount.in b/meta/files/overlayfs-unit.mount.in
index 9c117f2c52..eb78d2cb4f 100644
--- a/meta/files/overlayfs-unit.mount.in
+++ b/meta/files/overlayfs-unit.mount.in
@@ -1,7 +1,6 @@
[Unit]
Description=Overlayfs mount unit {LOWERDIR}
-Requires={CREATE_DIRS_SERVICE}
-After={CREATE_DIRS_SERVICE}
+RequiresMountsFor={DATA_MOUNT_POINT}
[Mount]
What=overlay
diff --git a/meta/lib/oe/overlayfs.py b/meta/lib/oe/overlayfs.py
index dbfed317c0..3805746d90 100644
--- a/meta/lib/oe/overlayfs.py
+++ b/meta/lib/oe/overlayfs.py
@@ -23,9 +23,6 @@ def allOverlaysUnitName(d):
def mountUnitName(unit):
return escapeSystemdUnitName(unit) + '.mount'
-def helperUnitName(unit):
- return escapeSystemdUnitName(unit) + '-create-upper-dir.service'
-
def unitFileList(d):
fileList = []
overlayMountPoints = d.getVarFlags("OVERLAYFS_MOUNT_POINT")
@@ -47,7 +44,6 @@ def unitFileList(d):
continue
for path in mountPointList.split():
fileList.append(mountUnitName(path))
- fileList.append(helperUnitName(path))
fileList.append(allOverlaysUnitName(d))
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 4/4] oe-selftest: overlayfs: Add a demo case for /etc
2025-12-22 11:38 [PATCH 1/4] overlayfs: Fix QA failure uvv.mail
2025-12-22 11:38 ` [PATCH 2/4] overlayfs: oe-selftest: Make the test more deterministic uvv.mail
2025-12-22 11:38 ` [PATCH 3/4] overlayfs: Remove helper unit uvv.mail
@ 2025-12-22 11:38 ` uvv.mail
2025-12-24 12:07 ` [OE-core] " Mathieu Dubois-Briand
2 siblings, 1 reply; 6+ messages in thread
From: uvv.mail @ 2025-12-22 11:38 UTC (permalink / raw)
To: openembedded-core; +Cc: Vyacheslav Yurkov
From: Vyacheslav Yurkov <uvv.mail@gmail.com>
/etc is a special directory. It's possible to create a mount unit for
it, but many system services that start early at boot time will not
rescan its content when you mount overlay on top. The added test case
demonstrates this but adding a sample systemd service and enabling it in
overlay.
Signed-off-by: Vyacheslav Yurkov <uvv.mail@gmail.com>
---
meta/lib/oeqa/selftest/cases/overlayfs.py | 98 +++++++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git a/meta/lib/oeqa/selftest/cases/overlayfs.py b/meta/lib/oeqa/selftest/cases/overlayfs.py
index 3e55e97927..288d889f03 100644
--- a/meta/lib/oeqa/selftest/cases/overlayfs.py
+++ b/meta/lib/oeqa/selftest/cases/overlayfs.py
@@ -263,6 +263,104 @@ EOT
self._test_correct_image('systemd-machine-units', systemd_machine_unit_append)
+ @OETestTag("runqemu")
+ def test_etc_mount(self):
+ """
+ Summary: /etc is not supposed to be used with overlayfs.bbclass
+ Expected: Observe inconsistencies after using etc overlay with a mount unit
+ Author: Vyacheslav Yurkov <uvv.mail@gmail.com>
+ """
+ systemd_machine_unit_append = """
+SYSTEMD_SERVICE:${PN} += " \
+ data.mount \
+ etc.mount \
+"
+
+do_install:append() {
+ install -d ${D}${systemd_system_unitdir}
+ install -d ${D}${ROOT_HOME}
+ cat <<EOT > ${D}${systemd_system_unitdir}/etc.mount
+[Unit]
+Description=OverlayFS mount for /etc directory
+DefaultDependencies=no
+RequiresMountsFor=/data
+
+[Mount]
+What=overlay
+Where=/etc
+Type=overlay
+Options=lowerdir=/etc,upperdir=/data/overlay/etc,workdir=/data/overlay-workdir/etc
+[Install]
+WantedBy=local-fs.target
+EOT
+
+ cat <<EOT >${D}${systemd_system_unitdir}/data.mount
+[Unit]
+Description=Persistent storage partition
+
+[Mount]
+What=/dev/sda3
+Where=/data
+Type=ext4
+Options=defaults
+
+[Install]
+WantedBy=local-fs.target
+EOT
+ cat <<EOT > ${D}${ROOT_HOME}/test-daemon.service
+[Unit]
+Description=My one-shot task
+After=local-fs.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/echo test
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
+EOT
+}
+
+FILES:${PN} += "${ROOT_HOME}"
+"""
+
+ config = """
+IMAGE_INSTALL:append = " systemd-machine-units"
+DISTRO_FEATURES:append = " overlayfs"
+
+# Use systemd as init manager
+INIT_MANAGER = "systemd"
+
+# enable overlayfs in the kernel
+KERNEL_EXTRA_FEATURES:append = " features/overlayfs/overlayfs.scc"
+
+IMAGE_FSTYPES += "wic"
+WKS_FILE = "overlayfs_etc.wks.in"
+OVERLAYFS_ROOTFS_TYPE = "ext4"
+"""
+
+ self.write_config(config)
+
+ machine_inc = """
+OVERLAYFS_MOUNT_POINT[etc] = "/etc"
+OVERLAYFS_QA_SKIP[mnt-overlay] = "mount-configured"
+"""
+ self.set_machine_config(machine_inc)
+ self.write_recipeinc('systemd-machine-units', systemd_machine_unit_append)
+ bitbake('core-image-minimal')
+ with runqemu('core-image-minimal', image_fstype='wic', discard_writes=False) as qemu:
+ test_daemon_path = get_bb_var('ROOT_HOME') + '/test-daemon.service'
+ status, output = qemu.run_serial('cp -f ' + test_daemon_path + ' /etc/systemd/system/')
+ status, output = qemu.run_serial("systemctl enable test-daemon")
+ status, output = qemu.run_serial("sync")
+ with runqemu('core-image-minimal', image_fstype='wic') as qemu:
+ # Check the test service status. It's enabled and supposed to start, but it didn't
+ status, output = qemu.run_serial("systemctl is-enabled test-daemon")
+ self.assertTrue("enabled" in output, msg=output)
+ status, output = qemu.run_serial("systemctl is-active test-daemon")
+ self.assertTrue("inactive" in output, msg=output)
+
@OETestTag("runqemu")
class OverlayFSEtcRunTimeTests(OESelftestTestCase):
"""overlayfs-etc class tests"""
^ permalink raw reply related [flat|nested] 6+ messages in thread