[OE-core] [PATCH v2 3/5] systemd: create preset files instead of installing in image

Peter Kjellerstedt peter.kjellerstedt at axis.com
Mon Jan 7 16:43:13 UTC 2019


> -----Original Message-----
> From: openembedded-core-bounces at lists.openembedded.org <openembedded-
> core-bounces at lists.openembedded.org> On Behalf Of Jonas Bonn
> Sent: den 2 januari 2019 17:12
> To: openembedded-core at lists.openembedded.org
> Subject: [OE-core] [PATCH v2 3/5] systemd: create preset files instead
> of installing in image
> 
> 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 <jonas at norrbonn.se>
> ---
>  meta/classes/systemd.bbclass | 33 ++++++++++++++++-----------------
>  1 file changed, 16 insertions(+), 17 deletions(-)
> 
> diff --git a/meta/classes/systemd.bbclass
> b/meta/classes/systemd.bbclass
> index c7b784dea8..cf3b5de4a1 100644
> --- a/meta/classes/systemd.bbclass
> +++ b/meta/classes/systemd.bbclass
> @@ -16,43 +16,32 @@ 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"
> +	exit 0
>  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 daemon-reload
> +	systemctl preset ${SYSTEMD_SERVICE_ESCAPED}
> 
> -	if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
> +	if [ "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
>  		systemctl --no-block restart ${SYSTEMD_SERVICE_ESCAPED}
>  	fi
>  fi
>  }
> 
>  systemd_prerm() {
> -OPTS=""
> -
>  if [ -n "$D" ]; then
> -    OPTS="--root=$D"
> +	exit 0
>  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}
>  fi
> @@ -177,12 +166,22 @@ 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)
> +        presetf = oe.path.join(d.getVar("PKGD"), "/lib/systemd/system-preset/98-%s.preset" % pkg)

Using "/lib" above does not take into account the usrmerge distro 
feature. My suggestion is to use ${nonarch_base_libdir} instead of 
/lib, or maybe even better is to use ${systemd_unitdir} instead of 
/lib/systemd, i.e.:

        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, " /lib/systemd/system-preset/98-%s.preset" % pkg)

Same here. Use "${systemd_unitdir}" instead of "/lib/systemd".

> +
>      # 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()
>  }
> 
> --
> 2.19.1

//Peter



More information about the Openembedded-core mailing list