From 6cd5db1e626c36c11dd22322daeaaec307c68d07 Mon Sep 17 00:00:00 2001 From: Vyacheslav Yurkov Date: Wed, 7 Sep 2022 21:51:39 +0200 Subject: [PATCH] oeqa/selftest: Add lower layer test for overlayfs-etc Place a test file on the /etc by means of overlayfs-user recipe. Perform QA checks to make sure that: - When lower layer is exposed, that it's read-only to avoid undefined behavior - By default lower layer is not exposed (From OE-Core rev: 2fc742178675598208b400d9889a1681249d7eea) Signed-off-by: Vyacheslav Yurkov Signed-off-by: Alexandre Belloni Signed-off-by: Richard Purdie --- .../overlayfs-user/overlayfs-user.bb | 7 +- meta/lib/oeqa/selftest/cases/overlayfs.py | 110 +++++++++++++----- 2 files changed, 84 insertions(+), 33 deletions(-) diff --git a/meta-selftest/recipes-test/overlayfs-user/overlayfs-user.bb b/meta-selftest/recipes-test/overlayfs-user/overlayfs-user.bb index 913a4d1fdb..50cba9514b 100644 --- a/meta-selftest/recipes-test/overlayfs-user/overlayfs-user.bb +++ b/meta-selftest/recipes-test/overlayfs-user/overlayfs-user.bb @@ -12,6 +12,11 @@ OVERLAYFS_WRITABLE_PATHS[mnt-overlay] += "/usr/share/my-application" do_install() { install -d ${D}/usr/share/my-application + install -d ${D}${sysconfdir} + echo "Original file in /etc" >> ${D}${sysconfdir}/lower-layer-test.txt } -FILES:${PN} += "/usr" +FILES:${PN} += "\ + ${exec_prefix} \ + ${sysconfdir \ +" diff --git a/meta/lib/oeqa/selftest/cases/overlayfs.py b/meta/lib/oeqa/selftest/cases/overlayfs.py index f550015b4b..57a8c8bdb6 100644 --- a/meta/lib/oeqa/selftest/cases/overlayfs.py +++ b/meta/lib/oeqa/selftest/cases/overlayfs.py @@ -381,7 +381,84 @@ OVERLAYFS_ETC_DEVICE = "/dev/sda3" Author: Vyacheslav Yurkov """ - config = """ + config = self.get_working_config() + + args = { + 'OVERLAYFS_INIT_OPTION': "" if origInit else "init=/sbin/preinit", + 'OVERLAYFS_ETC_USE_ORIG_INIT_NAME': int(origInit == True) + } + + self.write_config(config.format(**args)) + + bitbake('core-image-minimal') + testFile = "/etc/my-test-data" + + with runqemu('core-image-minimal', image_fstype='wic', discard_writes=False) as qemu: + status, output = qemu.run_serial("/bin/mount") + + line = getline_qemu(output, "/dev/sda3") + self.assertTrue("/data" in output, msg=output) + + line = getline_qemu(output, "upperdir=/data/overlay-etc/upper") + self.assertTrue(line and line.startswith("/data/overlay-etc/upper on /etc type overlay"), msg=output) + + # check that lower layer is not available + status, output = qemu.run_serial("ls -1 /data/overlay-etc/lower") + line = getline_qemu(output, "No such file or directory") + self.assertTrue(line, msg=output) + + status, output = qemu.run_serial("touch " + testFile) + status, output = qemu.run_serial("sync") + status, output = qemu.run_serial("ls -1 " + testFile) + line = getline_qemu(output, testFile) + self.assertTrue(line and line.startswith(testFile), msg=output) + + # Check that file exists in /etc after reboot + with runqemu('core-image-minimal', image_fstype='wic') as qemu: + status, output = qemu.run_serial("ls -1 " + testFile) + line = getline_qemu(output, testFile) + self.assertTrue(line and line.startswith(testFile), msg=output) + + def test_lower_layer_access(self): + """ + Summary: Test that lower layer of /etc is available read-only when configured + Expected: Can't write to lower layer. The files on lower and upper different after + modification + Author: Vyacheslav Yurkov + """ + + config = self.get_working_config() + + configLower = """ +OVERLAYFS_ETC_EXPOSE_LOWER = "1" +IMAGE_INSTALL:append = " overlayfs-user" +""" + testFile = "lower-layer-test.txt" + + args = { + 'OVERLAYFS_INIT_OPTION': "", + 'OVERLAYFS_ETC_USE_ORIG_INIT_NAME': 1 + } + + self.write_config(config.format(**args)) + + self.append_config(configLower) + bitbake('core-image-minimal') + + with runqemu('core-image-minimal', image_fstype='wic') as qemu: + status, output = qemu.run_serial("echo \"Modified in upper\" > /etc/" + testFile) + status, output = qemu.run_serial("diff /etc/" + testFile + " /data/overlay-etc/lower/" + testFile) + line = getline_qemu(output, "Modified in upper") + self.assertTrue(line, msg=output) + line = getline_qemu(output, "Original file") + self.assertTrue(line, msg=output) + + status, output = qemu.run_serial("touch /data/overlay-etc/lower/ro-test.txt") + line = getline_qemu(output, "Read-only file system") + self.assertTrue(line, msg=output) + + def get_working_config(self): + return """ DISTRO_FEATURES:append = " systemd" # Use systemd as init manager @@ -403,34 +480,3 @@ OVERLAYFS_ETC_FSTYPE = "ext4" OVERLAYFS_ETC_DEVICE = "/dev/sda3" OVERLAYFS_ETC_USE_ORIG_INIT_NAME = "{OVERLAYFS_ETC_USE_ORIG_INIT_NAME}" """ - - args = { - 'OVERLAYFS_INIT_OPTION': "" if origInit else "init=/sbin/preinit", - 'OVERLAYFS_ETC_USE_ORIG_INIT_NAME': int(origInit == True) - } - - self.write_config(config.format(**args)) - - bitbake('core-image-minimal') - testFile = "/etc/my-test-data" - - with runqemu('core-image-minimal', image_fstype='wic', discard_writes=False) as qemu: - status, output = qemu.run_serial("/bin/mount") - - line = getline_qemu(output, "/dev/sda3") - self.assertTrue("/data" in output, msg=output) - - line = getline_qemu(output, "upperdir=/data/overlay-etc/upper") - self.assertTrue(line and line.startswith("/data/overlay-etc/upper on /etc type overlay"), msg=output) - - status, output = qemu.run_serial("touch " + testFile) - status, output = qemu.run_serial("sync") - status, output = qemu.run_serial("ls -1 " + testFile) - line = getline_qemu(output, testFile) - self.assertTrue(line and line.startswith(testFile), msg=output) - - # Check that file exists in /etc after reboot - with runqemu('core-image-minimal', image_fstype='wic') as qemu: - status, output = qemu.run_serial("ls -1 " + testFile) - line = getline_qemu(output, testFile) - self.assertTrue(line and line.startswith(testFile), msg=output)