diff options
author | Vyacheslav Yurkov <uvv.mail@gmail.com> | 2021-10-17 10:08:55 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-10-30 22:31:49 +0100 |
commit | b38e194db0c6825f28c56123cf88af94d3f52beb (patch) | |
tree | 0dc7ed458e3b927caf07d044e91afc7d70c3cdd6 | |
parent | bc5209aa5f07cea00416852532b90aba044defd5 (diff) | |
download | openembedded-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.bbclass | 36 | ||||
-rw-r--r-- | meta/lib/oe/overlayfs.py | 5 |
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 |