summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVyacheslav Yurkov <uvv.mail@gmail.com>2021-10-17 10:08:55 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-10-30 22:31:49 +0100
commitb38e194db0c6825f28c56123cf88af94d3f52beb (patch)
tree0dc7ed458e3b927caf07d044e91afc7d70c3cdd6
parentbc5209aa5f07cea00416852532b90aba044defd5 (diff)
downloadopenembedded-core-contrib-b38e194db0c6825f28c56123cf88af94d3f52beb.tar.gz
overlayfs: all overlays unit
Application can depend on several overlayfs mount points. Provide a systemd unit application can depend on to make sure all overlays are mounted before it is started to avoid any race conditions Signed-off-by: Bruno Knittel <Bruno.Knittel@bruker.com> Signed-off-by: Vyacheslav Yurkov <uvv.mail@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/overlayfs.bbclass36
-rw-r--r--meta/lib/oe/overlayfs.py5
2 files changed, 39 insertions, 2 deletions
diff --git a/meta/classes/overlayfs.bbclass b/meta/classes/overlayfs.bbclass
index 8d9b59c9bf..9397ab44f9 100644
--- a/meta/classes/overlayfs.bbclass
+++ b/meta/classes/overlayfs.bbclass
@@ -37,6 +37,8 @@ REQUIRED_DISTRO_FEATURES += "systemd overlayfs"
inherit systemd features_check
python do_create_overlayfs_units() {
+ from oe.overlayfs import mountUnitName
+
CreateDirsUnitTemplate = """[Unit]
Description=Overlayfs directories setup
Requires={DATA_MOUNT_UNIT}
@@ -66,9 +68,22 @@ Options=lowerdir={LOWERDIR},upperdir={DATA_MOUNT_POINT}/upper{LOWERDIR},workdir=
[Install]
WantedBy=multi-user.target
"""
+ AllOverlaysTemplate = """[Unit]
+Description=Groups all overlays required by {PN} in one unit
+After={ALL_OVERLAYFS_UNITS}
+Requires={ALL_OVERLAYFS_UNITS}
+
+[Service]
+Type=oneshot
+ExecStart=/bin/true
+RemainAfterExit=true
+
+[Install]
+WantedBy=local-fs.target
+"""
def prepareUnits(data, lower):
- from oe.overlayfs import mountUnitName, helperUnitName
+ from oe.overlayfs import helperUnitName
args = {
'DATA_MOUNT_POINT': data,
@@ -83,10 +98,27 @@ WantedBy=multi-user.target
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 = {
+ 'ALL_OVERLAYFS_UNITS': " ".join(dependentUnits),
+ 'PN': d.getVar('PN')
+ }
+
+ with open(os.path.join(d.getVar('WORKDIR'), allOverlaysUnitName(d)), 'w') as f:
+ f.write(AllOverlaysTemplate.format(**args))
+
+ mountUnitList = []
overlayMountPoints = d.getVarFlags("OVERLAYFS_MOUNT_POINT")
for mountPoint in overlayMountPoints:
for lower in d.getVarFlag('OVERLAYFS_WRITABLE_PATHS', mountPoint).split():
prepareUnits(d.getVarFlag('OVERLAYFS_MOUNT_POINT', mountPoint), lower)
+ mountUnitList.append(mountUnitName(lower))
+
+ # set up one unit, which depends on all mount units, so users can set
+ # only one dependency in their units to make sure software starts
+ # when all overlays are mounted
+ prepareGlobalUnit(mountUnitList)
}
# we need to generate file names early during parsing stage
@@ -95,7 +127,7 @@ python () {
unitList = unitFileList(d)
for unit in unitList:
- d.appendVar('SYSTEMD_SERVICE:' + d.getVar('PN'), ' ' + unit);
+ d.appendVar('SYSTEMD_SERVICE:' + d.getVar('PN'), ' ' + unit)
d.appendVar('FILES:' + d.getVar('PN'), ' ' + strForBash(unit))
d.setVar('OVERLAYFS_UNIT_LIST', ' '.join([strForBash(s) for s in unitList]))
diff --git a/meta/lib/oe/overlayfs.py b/meta/lib/oe/overlayfs.py
index 21ef710509..b5d5e88e80 100644
--- a/meta/lib/oe/overlayfs.py
+++ b/meta/lib/oe/overlayfs.py
@@ -15,6 +15,9 @@ def escapeSystemdUnitName(path):
def strForBash(s):
return s.replace('\\', '\\\\')
+def allOverlaysUnitName(d):
+ return d.getVar('PN') + '-overlays.service'
+
def mountUnitName(unit):
return escapeSystemdUnitName(unit) + '.mount'
@@ -39,5 +42,7 @@ def unitFileList(d):
fileList.append(mountUnitName(path))
fileList.append(helperUnitName(path))
+ fileList.append(allOverlaysUnitName(d))
+
return fileList