All of lore.kernel.org
 help / color / mirror / Atom feed
From: Trevor Woerner <twoerner@gmail.com>
To: yocto-patches@lists.yoctoproject.org
Subject: [meta-rockchip][PATCH v2 1/2] provide a filesystem overlay example
Date: Fri, 12 Dec 2025 13:24:19 -0500	[thread overview]
Message-ID: <20251212182420.24920-1-twoerner@gmail.com> (raw)

Most implementations that use an A/B, full-partition update mechanism
(such as RAUC configured for this scenario) need some way of preserving
system configurations in a location that survives updates. The RAUC demo
provided in this layer is an example of a full-partition update,
therefore provide an example of using a filesystem overlay to preserve
the /etc and /home locations.

This example is gated by a configuration knob:

	RK_OVERLAY_DEMO

Signed-off-by: Trevor Woerner <twoerner@gmail.com>
---
changes since v1:
- the commit message was updated to identify the locations that the demo
  will overlay (/etc and /home)
- the README blurb was updated:
  - to also indicate which locations will have an overlay in the demo
  - to indicate the kernel config requirement
  - to explain options on how to include the root's home directory in
    the overlay
- use the standard bitbake variable to place the unit files in the
  standard systemd system unit file location (/usr/lib/systemd)
- use RequiresMountsFor as the overlay mount unit's dependency mechanism
---
 README                                        | 50 +++++++++++++++++++
 conf/machine/include/rockchip-rauc.inc        |  1 +
 .../systemd/data-partition-overlay_1.0.bb     | 22 ++++++++
 .../recipes-core/systemd/files/etc.mount      | 12 +++++
 .../recipes-core/systemd/files/home.mount     | 12 +++++
 5 files changed, 97 insertions(+)
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/data-partition-overlay_1.0.bb
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/etc.mount
 create mode 100644 dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/home.mount

diff --git a/README b/README
index 6a13428d488d..c1d5d4ca1645 100644
--- a/README
+++ b/README
@@ -140,6 +140,56 @@ Notes:
 	this layer, perform the same steps as above except for the step enabling
 	RK_RAUC_DEMO.
 
+  /data overlay with RAUC
+	When using RAUC for whole-partition rootfs updates, you will need some
+	way of preserving some pieces of data between updates; this is why the
+	DEMO scheme provided in this layer also includes a /data partition.
+	Now that you have a /data partition that is not updated, you need some
+	way of storing your important data there and making it available,
+	seamlessly, into your system regardless of which slot is running.
+
+	One way of accomplishing this is to move your important files into
+	/data and providing symlinks back into each running bundle. But that
+	requires you to know ahead of time which files will be touched... which
+	quickly can become a game of whack-a-mole. A better alternative is to
+	use a filesystem overlay. With a filesystem overlay, multiple paths are
+	overlaid on top of each other behind the scenes so what you see is one
+	directory containing the aggregation of all layers. Filesystem overlays
+	have a concept of "bottom layers" and "upper layers", if you write a new
+	file into an overlay, the file will be written into the uppermost
+	layer, leaving the lower layers intact. If a file is modified, the
+	modifications are stored in the upper layer, occluding the lower layer.
+	Therefore, creating an overlay using locations in the /data partition
+	as the uppermost layer allows changes to persist across RAUC updates.
+
+	This layer includes a simple overlay scheme to demonstrate one way of
+	making use of this mechanism. To enable the demo included in this layer
+	RAUC must be enabled, then also enable:
+
+		RK_OVERLAY_DEMO
+
+	This demo includes overlays for both the /etc and /home directories.
+	With these overlays in place, you can change a user's password, or add
+	new users, and those changes will be available in subsequent updates.
+	By default bitbake places the root user's home directory in /home/root,
+	but systemd moves this to /root. The location of the root user's home
+	directory is stored in the
+
+		ROOT_HOME
+
+	variable. If you would like to use the overlay example provided in this
+	layer and also overlay the root user's home directory, simply define
+	this variable in your build to place the root user's home directory
+	under /home.
+
+	This feature requires overlay support to be enabled in the Linux
+	kernel. Specifically the following kernel config option must be either
+	=m or =y. By default this layer will use the in-kernel defconfig as a
+	base, which includes this option as a module, and kernel modules are
+	installed by default.
+
+		CONFIG_OVERLAY_FS
+
   HW video decoding with gstreamer
 
 	Most Rockchip SoCs have some integrated VPU, either Hantro, RKVDEC or
diff --git a/conf/machine/include/rockchip-rauc.inc b/conf/machine/include/rockchip-rauc.inc
index a6f79503076b..3ea95298fed6 100644
--- a/conf/machine/include/rockchip-rauc.inc
+++ b/conf/machine/include/rockchip-rauc.inc
@@ -2,3 +2,4 @@
 # rauc demo configuration from this layer
 OVERRIDES .= "${@ ':rk-rauc-demo' if bb.utils.to_boolean(d.getVar('RK_RAUC_DEMO'), False) else ''}"
 IMAGE_INSTALL:append:rk-rauc-demo = " abd-partition"
+IMAGE_INSTALL:append:rk-rauc-demo = " ${@ 'data-partition-overlay' if bb.utils.to_boolean(d.getVar('RK_OVERLAY_DEMO'), False) else ''}"
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/data-partition-overlay_1.0.bb b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/data-partition-overlay_1.0.bb
new file mode 100644
index 000000000000..9b5a58328345
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/data-partition-overlay_1.0.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Overlay Logic onto the /data partition"
+LICENSE = "OSL-3.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/OSL-3.0;md5=438ec6d864bbb958a49df939a56511cf"
+
+inherit rk-rauc-demo-features-check systemd
+
+SYSTEMD_SERVICE:${PN} = "etc.mount home.mount"
+
+S = "${UNPACKDIR}"
+
+SRC_URI = " \
+        file://etc.mount \
+        file://home.mount \
+	"
+
+do_install() {
+	install -d ${D}${systemd_system_unitdir}
+	install -m 0644 ${UNPACKDIR}/etc.mount ${D}${systemd_system_unitdir}
+	install -m 0644 ${UNPACKDIR}/home.mount ${D}${systemd_system_unitdir}
+}
+
+RDEPENDS:${PN} += "abd-partition"
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/etc.mount b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/etc.mount
new file mode 100644
index 000000000000..c006bd729060
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/etc.mount
@@ -0,0 +1,12 @@
+[Unit]
+Description=OverlayFS mount for /etc to /data/overlay/etc
+RequiresMountsFor=/data
+
+[Mount]
+What=overlay
+Where=/etc
+Type=overlay
+Options=lowerdir=/etc,upperdir=/data/overlay/etc,workdir=/data/overlay-workdir/etc
+
+[Install]
+WantedBy=multi-user.target
diff --git a/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/home.mount b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/home.mount
new file mode 100644
index 000000000000..e0f0a89109ca
--- /dev/null
+++ b/dynamic-layers/rk-rauc-demo/recipes-core/systemd/files/home.mount
@@ -0,0 +1,12 @@
+[Unit]
+Description=OverlayFS mount for /home to /data/overlay/home
+RequiresMountsFor=/data
+
+[Mount]
+What=overlay
+Where=/home
+Type=overlay
+Options=lowerdir=/home,upperdir=/data/overlay/home,workdir=/data/overlay-workdir/home
+
+[Install]
+WantedBy=multi-user.target
-- 
2.51.0.193.g4975ec3473b4



             reply	other threads:[~2025-12-12 18:24 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-12 18:24 Trevor Woerner [this message]
2025-12-12 18:24 ` [meta-rockchip][PATCH v2 2/2] abd-partition: place unit file in system location Trevor Woerner
2025-12-13  7:11   ` Trevor Woerner
2025-12-12 19:11 ` [yocto-patches] [meta-rockchip][PATCH v2 1/2] provide a filesystem overlay example Quentin Schulz
2025-12-13  7:10 ` Trevor Woerner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251212182420.24920-1-twoerner@gmail.com \
    --to=twoerner@gmail.com \
    --cc=yocto-patches@lists.yoctoproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.