diff mbox series

systemd: fix unmerged-bin tainted message

Message ID 20260408195024.1874335-2-rs@ti.com
State Changes Requested
Headers show
Series systemd: fix unmerged-bin tainted message | expand

Commit Message

Randolph Sapp April 8, 2026, 7:50 p.m. UTC
From: Randolph Sapp <rs@ti.com>

Systemd prefers both /bin and /sbin to link to /usr/bin. If this is not
the case it reports that the system is tainted in systemctl status.

Add a link from /usr/sbin to /usr/bin to prevent anything from being
excluded from the merged bin directory. This mimics the current merged
bin directory structure of Arch Linux [1].

Update the systemd recipe to prevent creating a duplicate link when
sbinmerge is enabled.

This check was added to systemd back in 2024 [2].

[1] https://gitlab.archlinux.org/archlinux/packaging/packages/filesystem/-/blob/main/PKGBUILD
[2] https://github.com/systemd/systemd/commit/844863c61e7b501097da84a1e4d1e4a6aa6d9f0d

Signed-off-by: Randolph Sapp <rs@ti.com>
---

I feel like this is overloading the "usrmerge" distro feature somewhat. On the
other hand, this parameter was added for systemd support, and systemd considers
all of this to result in an unmerged-bin warning. I figure it's kind of fine.

Open to opinions here, as we could also just add a "sbinmerge" distro feature.
Then again, what would be the expected behavior when usrmerge is disabled? Would
/usr/sbin just point to /usr/bin and /sbin to /bin then?

 meta/classes-recipe/populate_sdk_base.bbclass | 5 +++--
 meta/conf/bitbake.conf                        | 2 +-
 meta/recipes-core/systemd/systemd_259.5.bb    | 8 ++++++--
 3 files changed, 10 insertions(+), 5 deletions(-)

Comments

Richard Purdie April 8, 2026, 9:58 p.m. UTC | #1
On Wed, 2026-04-08 at 14:50 -0500, Randolph Sapp via lists.openembedded.org wrote:
> From: Randolph Sapp <rs@ti.com>
> 
> Systemd prefers both /bin and /sbin to link to /usr/bin. If this is not
> the case it reports that the system is tainted in systemctl status.
> 
> Add a link from /usr/sbin to /usr/bin to prevent anything from being
> excluded from the merged bin directory. This mimics the current merged
> bin directory structure of Arch Linux [1].
> 
> Update the systemd recipe to prevent creating a duplicate link when
> sbinmerge is enabled.
> 
> This check was added to systemd back in 2024 [2].
> 
> [1] https://gitlab.archlinux.org/archlinux/packaging/packages/filesystem/-/blob/main/PKGBUILD
> [2] https://github.com/systemd/systemd/commit/844863c61e7b501097da84a1e4d1e4a6aa6d9f0d
> 
> Signed-off-by: Randolph Sapp <rs@ti.com>
> ---
> 
> I feel like this is overloading the "usrmerge" distro feature somewhat. On the
> other hand, this parameter was added for systemd support, and systemd considers
> all of this to result in an unmerged-bin warning. I figure it's kind of fine.
> 
> Open to opinions here, as we could also just add a "sbinmerge" distro feature.
> Then again, what would be the expected behavior when usrmerge is disabled? Would
> /usr/sbin just point to /usr/bin and /sbin to /bin then?

These are good questions. It feels like systemd is basically dictating
how the system should be laid out at this point and we may as well put
all this on the systemd distro feature as it is getting to the point
you can't use it without doing that :/.

It feels a bit like we should drop usrmerge too and just use systemd
there too since it doesn't have any seperate policy, it is just "do
what systemd says".

Cheers,

Richard
Jörg Sommer April 9, 2026, 4:30 a.m. UTC | #2
Randolph Sapp via lists.openembedded.org schrieb am Mi 08. Apr, 14:50 (-0500):
> diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
> index 84450386d9..29301534d2 100644
> --- a/meta/conf/bitbake.conf
> +++ b/meta/conf/bitbake.conf
> @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${exec_prefi
>  
>  # Base paths
>  export base_bindir = "${root_prefix}/bin"
> -export base_sbindir = "${root_prefix}/sbin"
> +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${root_prefix}/bin', '${root_prefix}/sbin', d)}"

Maybe:

export base_sbindir = "${root_prefix}/${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', 'bin', 'sbin', d)}"

or

export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${base_bindir}', '${root_prefix}/sbin', d)}"

>  export base_libdir = "${root_prefix}/${baselib}"
>  export nonarch_base_libdir = "${root_prefix}/lib"


Jörg
Peter Kjellerstedt April 9, 2026, 7:49 a.m. UTC | #3
> -----Original Message-----
> From: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org> On Behalf Of Jörg Sommer via lists.openembedded.org
> Sent: den 9 april 2026 06:31
> To: rs@ti.com
> Cc: richard.purdie@linuxfoundation.org; ross.burton@arm.com; mathieu.dubois-briand@bootlin.com; openembedded-core@lists.openembedded.org
> Subject: Re: [oe-core][PATCH] systemd: fix unmerged-bin tainted message
> 
> Randolph Sapp via lists.openembedded.org schrieb am Mi 08. Apr, 14:50 (-0500):
> > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
> > index 84450386d9..29301534d2 100644
> > --- a/meta/conf/bitbake.conf
> > +++ b/meta/conf/bitbake.conf
> > @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${exec_prefi
> >
> >  # Base paths
> >  export base_bindir = "${root_prefix}/bin"
> > -export base_sbindir = "${root_prefix}/sbin"
> > +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${root_prefix}/bin', '${root_prefix}/sbin', d)}"
> 
> Maybe:
> 
> export base_sbindir = "${root_prefix}/${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', 'bin', 'sbin', d)}"
> 
> or
> 
> export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${base_bindir}', '${root_prefix}/sbin', d)}"

This one. For the unlikely case that someone modifies base_bindir.

> >  export base_libdir = "${root_prefix}/${baselib}"
> >  export nonarch_base_libdir = "${root_prefix}/lib"
> 
> 
> Jörg

//Peter
Randolph Sapp April 9, 2026, 6:18 p.m. UTC | #4
On Thu Apr 9, 2026 at 2:49 AM CDT, Peter Kjellerstedt wrote:
>> -----Original Message-----
>> From: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org> On Behalf Of Jörg Sommer via lists.openembedded.org
>> Sent: den 9 april 2026 06:31
>> To: rs@ti.com
>> Cc: richard.purdie@linuxfoundation.org; ross.burton@arm.com; mathieu.dubois-briand@bootlin.com; openembedded-core@lists.openembedded.org
>> Subject: Re: [oe-core][PATCH] systemd: fix unmerged-bin tainted message
>> 
>> Randolph Sapp via lists.openembedded.org schrieb am Mi 08. Apr, 14:50 (-0500):
>> > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
>> > index 84450386d9..29301534d2 100644
>> > --- a/meta/conf/bitbake.conf
>> > +++ b/meta/conf/bitbake.conf
>> > @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${exec_prefi
>> >
>> >  # Base paths
>> >  export base_bindir = "${root_prefix}/bin"
>> > -export base_sbindir = "${root_prefix}/sbin"
>> > +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${root_prefix}/bin', '${root_prefix}/sbin', d)}"
>> 
>> Maybe:
>> 
>> export base_sbindir = "${root_prefix}/${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', 'bin', 'sbin', d)}"
>> 
>> or
>> 
>> export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${base_bindir}', '${root_prefix}/sbin', d)}"
>
> This one. For the unlikely case that someone modifies base_bindir.
>

Fair enough. Any other comments about Richards proposal to remove the usrmerge
distro feature and merge that into the systemd distro feature?

I personally think that a non-systemd environment could still benefit from
mimicking a filesystem structure most distros currently ship, but that's just
me.
Randolph Sapp April 9, 2026, 6:43 p.m. UTC | #5
On Thu Apr 9, 2026 at 1:18 PM CDT, Randolph Sapp via lists.openembedded.org wrote:
> On Thu Apr 9, 2026 at 2:49 AM CDT, Peter Kjellerstedt wrote:
>>> -----Original Message-----
>>> From: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org> On Behalf Of Jörg Sommer via lists.openembedded.org
>>> Sent: den 9 april 2026 06:31
>>> To: rs@ti.com
>>> Cc: richard.purdie@linuxfoundation.org; ross.burton@arm.com; mathieu.dubois-briand@bootlin.com; openembedded-core@lists.openembedded.org
>>> Subject: Re: [oe-core][PATCH] systemd: fix unmerged-bin tainted message
>>> 
>>> Randolph Sapp via lists.openembedded.org schrieb am Mi 08. Apr, 14:50 (-0500):
>>> > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
>>> > index 84450386d9..29301534d2 100644
>>> > --- a/meta/conf/bitbake.conf
>>> > +++ b/meta/conf/bitbake.conf
>>> > @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${exec_prefi
>>> >
>>> >  # Base paths
>>> >  export base_bindir = "${root_prefix}/bin"
>>> > -export base_sbindir = "${root_prefix}/sbin"
>>> > +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${root_prefix}/bin', '${root_prefix}/sbin', d)}"
>>> 
>>> Maybe:
>>> 
>>> export base_sbindir = "${root_prefix}/${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', 'bin', 'sbin', d)}"
>>> 
>>> or
>>> 
>>> export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${base_bindir}', '${root_prefix}/sbin', d)}"
>>
>> This one. For the unlikely case that someone modifies base_bindir.
>>
>
> Fair enough. Any other comments about Richards proposal to remove the usrmerge
> distro feature and merge that into the systemd distro feature?
>
> I personally think that a non-systemd environment could still benefit from
> mimicking a filesystem structure most distros currently ship, but that's just
> me.

Also suppose I should apply this to all sbin related variables in this file to
keep everything consistent between the SDKs and the actual rootfs images.
diff mbox series

Patch

diff --git a/meta/classes-recipe/populate_sdk_base.bbclass b/meta/classes-recipe/populate_sdk_base.bbclass
index b427ff2761..15f393a3bb 100644
--- a/meta/classes-recipe/populate_sdk_base.bbclass
+++ b/meta/classes-recipe/populate_sdk_base.bbclass
@@ -186,9 +186,10 @@  POPULATE_SDK_POST_HOST_COMMAND:append:task-populate-sdk = " write_host_sdk_manif
 # Prepare the root links to point to the /usr counterparts.
 create_merged_usr_symlinks() {
     root="$1"
-    install -d $root${base_bindir} $root${base_sbindir} $root${base_libdir}
+    install -d $root${base_bindir} $root${base_libdir}
     ln -rs $root${base_bindir} $root/bin
-    ln -rs $root${base_sbindir} $root/sbin
+    ln -rs $root${base_bindir} $root/sbin
+    ln -rs $root${base_bindir} $root/usr/sbin
     ln -rs $root${base_libdir} $root/${baselib}
 
     if [ "${nonarch_base_libdir}" != "${base_libdir}" ]; then
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
index 84450386d9..29301534d2 100644
--- a/meta/conf/bitbake.conf
+++ b/meta/conf/bitbake.conf
@@ -22,7 +22,7 @@  root_prefix = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${exec_prefi
 
 # Base paths
 export base_bindir = "${root_prefix}/bin"
-export base_sbindir = "${root_prefix}/sbin"
+export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${root_prefix}/bin', '${root_prefix}/sbin', d)}"
 export base_libdir = "${root_prefix}/${baselib}"
 export nonarch_base_libdir = "${root_prefix}/lib"
 
diff --git a/meta/recipes-core/systemd/systemd_259.5.bb b/meta/recipes-core/systemd/systemd_259.5.bb
index c3cb605b4d..d84e38d7cd 100644
--- a/meta/recipes-core/systemd/systemd_259.5.bb
+++ b/meta/recipes-core/systemd/systemd_259.5.bb
@@ -69,6 +69,7 @@  PACKAGECONFIG ??= " \
     quotacheck \
     randomseed \
     resolved \
+    sbinmerge \
     serial-getty-generator \
     set-time-epoch \
     sysusers \
@@ -339,8 +340,11 @@  do_install() {
 		install -m 0644 ${UNPACKDIR}/org.freedesktop.hostname1_no_polkit.conf ${D}${datadir}/dbus-1/system.d/
 	fi
 
-	# create link for existing udev rules
-	ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
+	# create link for existing udev rules if sbinmerge is not enabled
+	if ${@bb.utils.contains('PACKAGECONFIG', 'sbinmerge', 'false', 'true', d)}
+	then
+		ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
+	fi
 
 	# install default policy for presets
 	# https://www.freedesktop.org/wiki/Software/systemd/Preset/#howto