Skip to content

Commit

Permalink
systemd: create preset files instead of installing in image
Browse files Browse the repository at this point in the history
At first boot, systemd will create the /etc/systemd/system directory
from service preset files.  As such, for a normal, writable /etc
(writable rootfs), there is no need to set up this directory at image
creation time.

This patch changes the systemd machinery to create preset files and to
rely on systemd to do the service enablement.

This breaks the read-only-rootfs case; there's a fix for this in a
follow-up patch.

Signed-off-by: Jonas Bonn <[email protected]>
Signed-off-by: Alex Kiernan <[email protected]>
Signed-off-by: Richard Purdie <[email protected]>
  • Loading branch information
Jonas Bonn authored and rpurdie committed May 2, 2019
1 parent 3150253 commit 154abbc
Showing 1 changed file with 19 additions and 22 deletions.
41 changes: 19 additions & 22 deletions meta/classes/systemd.bbclass
Original file line number Diff line number Diff line change
Expand Up @@ -16,45 +16,30 @@ python __anonymous() {
# from doing any work so that pure-systemd images don't have redundant init
# files.
if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d):
d.appendVar("DEPENDS", " systemd-systemctl-native")
d.appendVar("PACKAGE_WRITE_DEPS", " systemd-systemctl-native")
if not bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d):
d.setVar("INHIBIT_UPDATERCD_BBCLASS", "1")
}

systemd_postinst() {
OPTS=""

if [ -n "$D" ]; then
OPTS="--root=$D"
fi

if type systemctl >/dev/null 2>/dev/null; then
if [ -z "$D" ]; then
systemctl daemon-reload
fi

systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE_ESCAPED}
systemctl preset "${SYSTEMD_SERVICE_ESCAPED}"

if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
systemctl --no-block restart ${SYSTEMD_SERVICE_ESCAPED}
if [ "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
systemctl --no-block restart "${SYSTEMD_SERVICE_ESCAPED}"
fi
fi
fi
}

systemd_prerm() {
OPTS=""

if [ -n "$D" ]; then
OPTS="--root=$D"
fi

if type systemctl >/dev/null 2>/dev/null; then
if [ -z "$D" ]; then
systemctl stop ${SYSTEMD_SERVICE_ESCAPED}
fi
systemctl stop "${SYSTEMD_SERVICE_ESCAPED}"

systemctl $OPTS disable ${SYSTEMD_SERVICE_ESCAPED}
systemctl disable "${SYSTEMD_SERVICE_ESCAPED}"
fi
fi
}

Expand Down Expand Up @@ -177,12 +162,24 @@ python systemd_populate_packages() {
else:
bb.fatal("SYSTEMD_SERVICE_%s value %s does not exist" % (pkg_systemd, service))

def systemd_create_presets(pkg):
action = get_package_var(d, 'SYSTEMD_AUTO_ENABLE', pkg)
if action not in ("enable", "disable"):
bb.fatal("SYSTEMD_AUTO_ENABLE_%s '%s' is not 'enable' or 'disable'" % (pkg, action))
presetf = oe.path.join(d.getVar("PKGD"), d.getVar("systemd_unitdir"), "system-preset/98-%s.preset" % pkg)
bb.utils.mkdirhier(os.path.dirname(presetf))
with open(presetf, 'a') as fd:
for service in d.getVar('SYSTEMD_SERVICE_%s' % pkg).split():
fd.write("%s %s\n" % (action,service))
d.appendVar("FILES_%s" % pkg, ' ' + oe.path.join(d.getVar("systemd_unitdir"), "system-preset/98-%s.preset" % pkg))

# Run all modifications once when creating package
if os.path.exists(d.getVar("D")):
for pkg in d.getVar('SYSTEMD_PACKAGES').split():
systemd_check_package(pkg)
if d.getVar('SYSTEMD_SERVICE_' + pkg):
systemd_generate_package_scripts(pkg)
systemd_create_presets(pkg)
systemd_check_services()
}

Expand Down

0 comments on commit 154abbc

Please sign in to comment.