buildroot.buildroot.org archive mirror
 help / color / mirror / Atom feed
* [Buildroot] [PATCH 01/17 v2] system: reword merged-usr prompt
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 02/17 v2] system: drop superfluous negative condition for default PATH Yann E. MORIN via buildroot
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle

The current prompt is overly verbose, and departs from the usual
terminology used to refer to merged /usr, which, 10 years later [0],
makes it a little bit difficult to find or understand.

Furthermore, we're going to add another similar prompt for merged
/usr/sbin, and there's no way we want to introduce as similarly
convoluted prompt then.

Reword the prompt for the merged /usr option to the explicit "merged
/usr" everyone expects and understands.

[0] see commit c5bd8af65e50 (system: add options for /bin /sbin and
/lib to be symlinks into /usr)

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Acked-by: Arnout Vandecappelle <arnout@mind.be>

---
Changes v1 -> v2:
  - typos
---
 system/Config.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/system/Config.in b/system/Config.in
index da9e20a35c..1bc8b61f11 100644
--- a/system/Config.in
+++ b/system/Config.in
@@ -337,7 +337,7 @@ config BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES
 	  Support extended attributes handling in device tables
 
 config BR2_ROOTFS_MERGED_USR
-	bool "Use symlinks to /usr for /bin, /sbin and /lib"
+	bool "Merged /usr"
 	help
 	  If you say 'n' here, then /bin, /sbin and /lib and their
 	  counterparts in /usr will be separate directories. This
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 02/17 v2] system: drop superfluous negative condition for default PATH
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 01/17 v2] system: reword merged-usr prompt Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 03/17 v2] package/systemd: select merged-usr from package, not init Yann E. MORIN via buildroot
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle

Kconfig applies the default values in the order they are defined, and
stops at the first which condition is met. In this case, the two
conditions are mutually exclusive, so we can drop the second one. This
also makes it obvious there actually is a default value.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Acked-by: Arnout Vandecappelle <arnout@mind.be>
---
 system/Config.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/system/Config.in b/system/Config.in
index 1bc8b61f11..b24004c533 100644
--- a/system/Config.in
+++ b/system/Config.in
@@ -535,7 +535,7 @@ endif # BR2_ROOTFS_SKELETON_DEFAULT
 config BR2_SYSTEM_DEFAULT_PATH
 	string "Set the system's default PATH"
 	default "/usr/bin:/usr/sbin" if BR2_ROOTFS_MERGED_USR
-	default "/bin:/sbin:/usr/bin:/usr/sbin" if !BR2_ROOTFS_MERGED_USR
+	default "/bin:/sbin:/usr/bin:/usr/sbin"
 	help
 	  Sets the system's default PATH. It is being used in
 	  /etc/profile in the skeleton-init-common package and by some
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 03/17 v2] package/systemd: select merged-usr from package, not init
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 01/17 v2] system: reword merged-usr prompt Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 02/17 v2] system: drop superfluous negative condition for default PATH Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 04/17 v2] support/scripts: comonalise checking merged status Yann E. MORIN via buildroot
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot
  Cc: Yann E. MORIN, Norbert Lange, Sen Hastings, Arnout Vandecappelle

Since version 255, systemd no longer supports split-usr [0].

Move the select from the init system to the package, to explicitly
expose that fact.

Drop our comment about our design decision, as it no longer applies.

[0] https://github.com/systemd/systemd/blob/v255/NEWS#L7

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Norbert Lange <nolange79@gmail.com>
Cc: Sen Hastings <sen@hastings.org>
Acked-by: Arnout Vandecappelle <arnout@mind.be>

---
Changes v1 -> v2:
  - typo
---
 package/systemd/Config.in | 1 +
 system/Config.in          | 5 -----
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/package/systemd/Config.in b/package/systemd/Config.in
index 320d416203..0cb10ea3d8 100644
--- a/package/systemd/Config.in
+++ b/package/systemd/Config.in
@@ -24,6 +24,7 @@ menuconfig BR2_PACKAGE_SYSTEMD
 	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_15
 	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_8
 	depends on BR2_HOST_GCC_AT_LEAST_8 # host-systemd
+	select BR2_ROOTFS_MERGED_USR
 	select BR2_PACKAGE_HAS_UDEV
 	select BR2_PACKAGE_DBUS if !BR2_PACKAGE_DBUS_BROKER # runtime
 	select BR2_PACKAGE_LIBCAP
diff --git a/system/Config.in b/system/Config.in
index b24004c533..32462241a5 100644
--- a/system/Config.in
+++ b/system/Config.in
@@ -115,10 +115,6 @@ comment "openrc needs a glibc or musl toolchain w/ dynamic library"
 	depends on BR2_USE_MMU
 	depends on BR2_STATIC_LIBS && BR2_TOOLCHAIN_USES_UCLIBC
 
-# In Buildroot, we decided not to support a split-usr when systemd is
-# used as an init system. This is a design decision, not a systemd
-# issue. Thus the select is with BR2_INIT_SYSTEMD (below) rather than
-# with BR2_PACKAGE_SYSTEMD.
 config BR2_INIT_SYSTEMD
 	bool "systemd"
 	depends on BR2_PACKAGE_SYSTEMD_ARCH_SUPPORTS
@@ -130,7 +126,6 @@ config BR2_INIT_SYSTEMD
 	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_15
 	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_8
 	depends on BR2_HOST_GCC_AT_LEAST_8
-	select BR2_ROOTFS_MERGED_USR
 	select BR2_PACKAGE_SYSTEMD
 	select BR2_PACKAGE_SKELETON_INIT_SYSTEMD if BR2_ROOTFS_SKELETON_DEFAULT
 
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 04/17 v2] support/scripts: comonalise checking merged status
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (2 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 03/17 v2] package/systemd: select merged-usr from package, not init Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 05/17 v2] support/scripts: prepare for a more complex check for merged directories Yann E. MORIN via buildroot
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle

Rather than repeat the same canned sequence over and over again, move it
to a function that we can reuse as many times as needed. This will come
handy when we later need to check merged-bin.

Switch to using bash as it allows for nicer functions (local variables),
but we anyway require it globally already so that's not an additional
dependency.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Acked-by: Arnout Vandecappelle <arnout@mind.be>
---
 support/scripts/check-merged-usr.sh | 46 ++++++++++++++++-------------
 1 file changed, 26 insertions(+), 20 deletions(-)

diff --git a/support/scripts/check-merged-usr.sh b/support/scripts/check-merged-usr.sh
index 433857cd8c..ed0c58e9b7 100755
--- a/support/scripts/check-merged-usr.sh
+++ b/support/scripts/check-merged-usr.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
 #
 # Check if a given custom skeleton or overlay complies to the merged /usr
 # requirements:
@@ -10,30 +10,36 @@
 # /usr/lib/
 # /usr/sbin/
 #
-# Output: the list of non-compliant paths (empty if compliant).
+# Input:
+#   $1:     the root directory (skeleton, overlay) to check
+# Output:
+#   stdout: the list of non-compliant paths (empty if compliant).
 #
 
+# The directory to check for merged-usr
+root="${1}"
+
 # Extract the inode numbers for all of those directories. In case any is
 # a symlink, we want to get the inode of the pointed-to directory, so we
 # append '/.' to be sure we get the target directory. Since the symlinks
 # can be anyway (/bin -> /usr/bin or /usr/bin -> /bin), we do that for
-# all of them.
+# each of them.
 #
-lib_inode=$(stat -c '%i' "${1}/lib/." 2>/dev/null)
-bin_inode=$(stat -c '%i' "${1}/bin/." 2>/dev/null)
-sbin_inode=$(stat -c '%i' "${1}/sbin/." 2>/dev/null)
-usr_lib_inode=$(stat -c '%i' "${1}/usr/lib/." 2>/dev/null)
-usr_bin_inode=$(stat -c '%i' "${1}/usr/bin/." 2>/dev/null)
-usr_sbin_inode=$(stat -c '%i' "${1}/usr/sbin/." 2>/dev/null)
 
-not_merged_dirs=""
-test -z "$lib_inode" || \
-	test "$lib_inode" = "$usr_lib_inode" || \
-		not_merged_dirs="/lib"
-test -z "$bin_inode" || \
-	test "$bin_inode" = "$usr_bin_inode" || \
-		not_merged_dirs="$not_merged_dirs /bin"
-test -z "$sbin_inode" || \
-	test "$sbin_inode" = "$usr_sbin_inode" || \
-		not_merged_dirs="$not_merged_dirs /sbin"
-echo "${not_merged_dirs# }"
+test_merged() {
+	local root="${1}"
+	local dir1="${2}"
+	local dir2="${3}"
+	local inode1 inode2
+
+	inode1="$(stat -c '%i' "${root}${dir1}/." 2>/dev/null)"
+	inode2="$(stat -c '%i' "${root}${dir2}/." 2>/dev/null)"
+
+	test -z "${inode1}" || \
+		test "${inode1}" = "${inode2}" || \
+			printf '%s\n' "${dir1}"
+}
+
+test_merged "${root}" "/lib" "/usr/lib"
+test_merged "${root}" "/bin" "/usr/bin"
+test_merged "${root}" "/sbin" "/usr/sbin"
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 05/17 v2] support/scripts: prepare for a more complex check for merged directories
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (3 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 04/17 v2] support/scripts: comonalise checking merged status Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 06/17 v2] support/scripts: also exit in error on improperly merged-usr Yann E. MORIN via buildroot
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
 support/scripts/check-merged-usr.sh | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/support/scripts/check-merged-usr.sh b/support/scripts/check-merged-usr.sh
index ed0c58e9b7..ac676185dd 100755
--- a/support/scripts/check-merged-usr.sh
+++ b/support/scripts/check-merged-usr.sh
@@ -26,7 +26,7 @@ root="${1}"
 # each of them.
 #
 
-test_merged() {
+is_valid_merged() {
 	local root="${1}"
 	local dir1="${2}"
 	local dir2="${3}"
@@ -35,9 +35,17 @@ test_merged() {
 	inode1="$(stat -c '%i' "${root}${dir1}/." 2>/dev/null)"
 	inode2="$(stat -c '%i' "${root}${dir2}/." 2>/dev/null)"
 
-	test -z "${inode1}" || \
-		test "${inode1}" = "${inode2}" || \
-			printf '%s\n' "${dir1}"
+	test -z "${inode1}" || test "${inode1}" = "${inode2}"
+}
+
+test_merged() {
+	local root="${1}"
+	local dir1="${2}"
+	local dir2="${3}"
+
+	if ! is_valid_merged "${root}" "${dir1}" "${dir2}"; then
+		printf '%s\n' "${dir1}"
+	fi
 }
 
 test_merged "${root}" "/lib" "/usr/lib"
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 06/17 v2] support/scripts: also exit in error on improperly merged-usr
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (4 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 05/17 v2] support/scripts: prepare for a more complex check for merged directories Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 07/17 v2] support/scripts: move merged-usr errors message into check-merged-usr.sh Yann E. MORIN via buildroot
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
 support/scripts/check-merged-usr.sh | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/support/scripts/check-merged-usr.sh b/support/scripts/check-merged-usr.sh
index ac676185dd..6d31c81c21 100755
--- a/support/scripts/check-merged-usr.sh
+++ b/support/scripts/check-merged-usr.sh
@@ -14,6 +14,9 @@
 #   $1:     the root directory (skeleton, overlay) to check
 # Output:
 #   stdout: the list of non-compliant paths (empty if compliant).
+# Exit code:
+#   0:      in case of success (stdout will be empty)
+#   !0:     if any path is improperly merged
 #
 
 # The directory to check for merged-usr
@@ -45,9 +48,13 @@ test_merged() {
 
 	if ! is_valid_merged "${root}" "${dir1}" "${dir2}"; then
 		printf '%s\n' "${dir1}"
+		is_success=false
 	fi
 }
 
+is_success=true
 test_merged "${root}" "/lib" "/usr/lib"
 test_merged "${root}" "/bin" "/usr/bin"
 test_merged "${root}" "/sbin" "/usr/sbin"
+
+${is_success}
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 07/17 v2] support/scripts: move merged-usr errors message into check-merged-usr.sh
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (5 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 06/17 v2] support/scripts: also exit in error on improperly merged-usr Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 08/17 v2] support/scripts: fix and restrict conditions to accept merged dirs Yann E. MORIN via buildroot
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle (Essensium/Mind)

By moving the loop over the overlays into the script, we can generate
better error messages about how and why a skeleton or a specific overlay
is improperly setup for merged-usr.

We can also now rely on its exit code to decicde whether the skeleton or
the overlays are properly setup, rather than stash the stdout/stderr to
a Makefile variable and test the emptiness thereof.

Introduce a --type option to pass the type of root to verify, for better
error reporting. This will incidentally be usefull in a future commit,
when we need to take different actions based on whether the root is a
skeleton or an overlay.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 Makefile                                   | 15 ++---
 package/skeleton-custom/skeleton-custom.mk | 21 +++----
 support/scripts/check-merged-usr.sh        | 65 +++++++++++++++++-----
 3 files changed, 64 insertions(+), 37 deletions(-)

diff --git a/Makefile b/Makefile
index c581067320..fd5fe575e7 100644
--- a/Makefile
+++ b/Makefile
@@ -782,17 +782,10 @@ endif
 # For a merged /usr, ensure that /lib, /bin and /sbin and their /usr
 # counterparts are appropriately setup as symlinks ones to the others.
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
-
-	$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
-		@$(call MESSAGE,"Sanity check in overlay $(d)")$(sep) \
-		$(Q)not_merged_dirs="$$(support/scripts/check-merged-usr.sh $(d))"; \
-		test -n "$$not_merged_dirs" && { \
-			echo "ERROR: The overlay in $(d) is not" \
-				"using a merged /usr for the following directories:" \
-				$$not_merged_dirs; \
-			exit 1; \
-		} || true$(sep))
-
+	@$(call MESSAGE,"Sanity check in overlays $(call qstrip,$(BR2_ROOTFS_OVERLAY))")
+	support/scripts/check-merged-usr.sh \
+		--type overlay \
+		$(call qstrip,$(BR2_ROOTFS_OVERLAY))
 endif # merged /usr
 
 	$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
diff --git a/package/skeleton-custom/skeleton-custom.mk b/package/skeleton-custom/skeleton-custom.mk
index b05c834b94..c194108307 100644
--- a/package/skeleton-custom/skeleton-custom.mk
+++ b/package/skeleton-custom/skeleton-custom.mk
@@ -26,17 +26,16 @@ endif
 # For a merged /usr, ensure that /lib, /bin and /sbin and their /usr
 # counterparts are appropriately setup as symlinks ones to the others.
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
-SKELETON_CUSTOM_NOT_MERGED_USR_DIRS = \
-	$(shell support/scripts/check-merged-usr.sh $(SKELETON_CUSTOM_PATH))
+define SKELETON_CUSTOM_NOT_MERGED_USR_DIRS
+	support/scripts/check-merged-usr.sh \
+		--type skeleton \
+		$(SKELETON_CUSTOM_PATH)
+endef
 endif # merged /usr
 
-ifeq ($(BR2_PACKAGE_SKELETON_CUSTOM)$(BR_BUILDING),yy)
-ifneq ($(SKELETON_CUSTOM_NOT_MERGED_USR_DIRS),)
-$(error The custom skeleton in $(SKELETON_CUSTOM_PATH) is not \
-	using a merged /usr for the following directories: \
-	$(SKELETON_CUSTOM_NOT_MERGED_USR_DIRS))
-endif
-endif
+define SKELETON_CUSTOM_CONFIGURE_CMDS
+	$(SKELETON_CUSTOM_NOT_MERGED_USR_DIRS)
+endef
 
 # The target-dir-warning file and the lib{32,64} symlinks are the only
 # things we customise in the custom skeleton.
@@ -49,9 +48,7 @@ define SKELETON_CUSTOM_INSTALL_TARGET_CMDS
 endef
 
 # For the staging dir, we don't really care what we install, but we
-# need the /lib and /usr/lib appropriately setup. Since we ensure,
-# above, that they are correct in the skeleton, we can simply copy the
-# skeleton to staging.
+# need the /lib and /usr/lib appropriately setup.
 define SKELETON_CUSTOM_INSTALL_STAGING_CMDS
 	$(call SYSTEM_RSYNC,$(SKELETON_CUSTOM_PATH),$(STAGING_DIR))
 	$(call SYSTEM_USR_SYMLINKS_OR_DIRS,$(STAGING_DIR))
diff --git a/support/scripts/check-merged-usr.sh b/support/scripts/check-merged-usr.sh
index 6d31c81c21..c3b5c6419a 100755
--- a/support/scripts/check-merged-usr.sh
+++ b/support/scripts/check-merged-usr.sh
@@ -11,16 +11,48 @@
 # /usr/sbin/
 #
 # Input:
-#   $1:     the root directory (skeleton, overlay) to check
+#   --type TYPE     the type of root to check: 'skeleton' or 'overlay'
+#   $*:             the root directories (skeleton, overlays) to check
 # Output:
-#   stdout: the list of non-compliant paths (empty if compliant).
+#   stdout:         the list of non-compliant paths (empty if compliant).
 # Exit code:
-#   0:      in case of success (stdout will be empty)
-#   !0:     if any path is improperly merged
+#   0:              in case of success (stdout will be empty)
+#   !0:             if any path is improperly merged
 #
 
-# The directory to check for merged-usr
-root="${1}"
+opts="type:"
+ARGS="$(getopt -n check-merged -o "" -l "${opts}" -- "${@}")" || exit 1
+eval set -- "${ARGS}"
+
+type=
+while :; do
+	case "${1}" in
+	(--type)
+		type="${2}"
+		shift 2
+		;;
+	(--)
+		shift
+		break
+		;;
+	esac
+done
+
+report_error() {
+	local type="${1}"
+	local root="${2}"
+	local fmt="${3}"
+	shift 3
+
+	if ${first}; then
+		printf "The %s in %s is not properly setup:\n" \
+			"${type}" "${root}"
+	fi
+	first=false
+	# shellcheck disable=SC2059  # fmt *is* a format string
+	printf "  - ${fmt}" "${@}"
+	is_success=false
+}
 
 # Extract the inode numbers for all of those directories. In case any is
 # a symlink, we want to get the inode of the pointed-to directory, so we
@@ -42,19 +74,24 @@ is_valid_merged() {
 }
 
 test_merged() {
-	local root="${1}"
-	local dir1="${2}"
-	local dir2="${3}"
+	local type="${1}"
+	local root="${2}"
+	local dir1="${3}"
+	local dir2="${4}"
 
 	if ! is_valid_merged "${root}" "${dir1}" "${dir2}"; then
-		printf '%s\n' "${dir1}"
-		is_success=false
+		report_error "${type}" "${root}" \
+			'%s should be missing, or be a relative symlink to %s\n' \
+			"${dir1}" "${dir2}"
 	fi
 }
 
 is_success=true
-test_merged "${root}" "/lib" "/usr/lib"
-test_merged "${root}" "/bin" "/usr/bin"
-test_merged "${root}" "/sbin" "/usr/sbin"
+for root; do
+	first=true
+	test_merged "${type}" "${root}" "/lib" "/usr/lib"
+	test_merged "${type}" "${root}" "/bin" "/usr/bin"
+	test_merged "${type}" "${root}" "/sbin" "/usr/sbin"
+done
 
 ${is_success}
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 08/17 v2] support/scripts: fix and restrict conditions to accept merged dirs
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (6 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 07/17 v2] support/scripts: move merged-usr errors message into check-merged-usr.sh Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 09/17 v2] support/scripts: rename check-merged-usr.sh Yann E. MORIN via buildroot
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Currently, we accept that the merged usr is backward, i.e. that the
/usr/bin, /usr/sbin, and /usr/lib entries be symlinks to, resp., /bin,
/sbin, and /lib. We also allow either entries to be symlinks to other
parts of the root. Both are accepted despite the comment at the top of
the script explaining what should be accepted.

However, a properly merged usr is the other way around: /bin, /sbin, and
/lib are the symlinks to resp. /usr/bin, /usr/sbin, and /usr/lib, which
are actual directories.

Fix the check-merged-usr script accordingly: implement the test as we
mean it, by testing the conditions rather than resorting to a convoluted
and incorrect use of stat(1).

Even though the split between test_dir() and test_merged() seems
superfluous, it'll come useful when we introduce support for merged-bin
in a later patch.

For skeletons, we require that the directories do exist, while we allow
them to be missing for overlays; indeed, it is perfectly legit to
provide an overlay that only contains totally unrelated directories
(e.g. /var/www to populate a webroot for example).

Extend the heading-comment to be more explicit (and drop '/' as there is
nothing to say about it).

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>

---
Changes v1 -> v2;
  - complete rewrite of the test
  - slight rephrase of commit log
  - typoes
---
 support/scripts/check-merged-usr.sh | 87 +++++++++++++++++------------
 1 file changed, 51 insertions(+), 36 deletions(-)

diff --git a/support/scripts/check-merged-usr.sh b/support/scripts/check-merged-usr.sh
index c3b5c6419a..34e726b4fb 100755
--- a/support/scripts/check-merged-usr.sh
+++ b/support/scripts/check-merged-usr.sh
@@ -2,13 +2,14 @@
 #
 # Check if a given custom skeleton or overlay complies to the merged /usr
 # requirements:
-# /
-# /bin -> usr/bin
-# /lib -> usr/lib
-# /sbin -> usr/sbin
-# /usr/bin/
-# /usr/lib/
-# /usr/sbin/
+#   /bin            missing, or a relative symlink to usr/bin
+#   /lib            missing, or a relative symlink to usr/lib
+#   /sbin           missing, or a relative symlink to usr/sbin
+#   /usr/bin/       missing*, or an existing directory; not a symlink
+#   /usr/lib/       missing*, or an existing directory; not a symlink
+#   /usr/sbin/      missing*, or an existing directory; not a symlink
+#
+# *: must be present for skeletons, can be missing for overlays
 #
 # Input:
 #   --type TYPE     the type of root to check: 'skeleton' or 'overlay'
@@ -17,7 +18,7 @@
 #   stdout:         the list of non-compliant paths (empty if compliant).
 # Exit code:
 #   0:              in case of success (stdout will be empty)
-#   !0:             if any path is improperly merged
+#   !0:             if any directory to check is improperly merged
 #
 
 opts="type:"
@@ -38,6 +39,12 @@ while :; do
 	esac
 done
 
+if [ "${type}" = "skeleton" ]; then
+	strict=true
+else
+	strict=false
+fi
+
 report_error() {
 	local type="${1}"
 	local root="${2}"
@@ -54,44 +61,52 @@ report_error() {
 	is_success=false
 }
 
-# Extract the inode numbers for all of those directories. In case any is
-# a symlink, we want to get the inode of the pointed-to directory, so we
-# append '/.' to be sure we get the target directory. Since the symlinks
-# can be anyway (/bin -> /usr/bin or /usr/bin -> /bin), we do that for
-# each of them.
-#
-
-is_valid_merged() {
-	local root="${1}"
-	local dir1="${2}"
-	local dir2="${3}"
-	local inode1 inode2
-
-	inode1="$(stat -c '%i' "${root}${dir1}/." 2>/dev/null)"
-	inode2="$(stat -c '%i' "${root}${dir2}/." 2>/dev/null)"
-
-	test -z "${inode1}" || test "${inode1}" = "${inode2}"
-}
-
 test_merged() {
 	local type="${1}"
 	local root="${2}"
-	local dir1="${3}"
-	local dir2="${4}"
+	local base="${3}"
+	local dir1="${4}"
+	local dir2="${5}"
 
-	if ! is_valid_merged "${root}" "${dir1}" "${dir2}"; then
-		report_error "${type}" "${root}" \
-			'%s should be missing, or be a relative symlink to %s\n' \
-			"${dir1}" "${dir2}"
+	if ! test -e "${root}${base}${dir1}"; then
+		return 0
+	elif [ "$(readlink "${root}${base}${dir1}")" = "${dir2}" ]; then
+		return 0
 	fi
+
+	# Otherwise, this directory is not merged
+	report_error "${type}" "${root}" \
+		'%s%s should be missing, or be a relative symlink to %s\n' \
+		"${base}" "${dir1}" "${dir2}"
+}
+
+test_dir() {
+	local type="${1}"
+	local root="${2}"
+	local base="${3}"
+	local dir="${4}"
+
+	if ! test -e "${root}${base}${dir}" && ! ${strict}; then
+		return 0
+	elif test -d "${root}${base}${dir}" && ! test -L "${root}${base}${dir}"; then
+		return 0
+	fi
+
+	# Otherwise, this entry is not a proper directory
+	report_error "${type}" "${root}" \
+		"%s%s should exist, be a directory, and not be a symlink\n" \
+		"${base}" "${dir}"
 }
 
 is_success=true
 for root; do
 	first=true
-	test_merged "${type}" "${root}" "/lib" "/usr/lib"
-	test_merged "${type}" "${root}" "/bin" "/usr/bin"
-	test_merged "${type}" "${root}" "/sbin" "/usr/sbin"
+	test_dir "${type}" "${root}" "/" "usr/bin"
+	test_dir "${type}" "${root}" "/" "usr/lib"
+	test_dir "${type}" "${root}" "/" "usr/sbin"
+	test_merged "${type}" "${root}" "/" "bin" "usr/bin"
+	test_merged "${type}" "${root}" "/" "lib" "usr/lib"
+	test_merged "${type}" "${root}" "/" "sbin" "usr/sbin"
 done
 
 ${is_success}
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 09/17 v2] support/scripts: rename check-merged-usr.sh
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (7 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 08/17 v2] support/scripts: fix and restrict conditions to accept merged dirs Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 10/17 v2] support/scripts; teach check-merged what to check Yann E. MORIN via buildroot
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle

We're going to need it to check merged-bin, so the naming would be
misleading as it would no longer be just about merged-usr.

Also drop the extension, it's useless.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Acked-by: Arnout Vandecappelle <arnout@mind.be>
---
 Makefile                                              | 2 +-
 package/skeleton-custom/skeleton-custom.mk            | 2 +-
 support/scripts/{check-merged-usr.sh => check-merged} | 0
 3 files changed, 2 insertions(+), 2 deletions(-)
 rename support/scripts/{check-merged-usr.sh => check-merged} (100%)

diff --git a/Makefile b/Makefile
index fd5fe575e7..56266a8feb 100644
--- a/Makefile
+++ b/Makefile
@@ -783,7 +783,7 @@ endif
 # counterparts are appropriately setup as symlinks ones to the others.
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
 	@$(call MESSAGE,"Sanity check in overlays $(call qstrip,$(BR2_ROOTFS_OVERLAY))")
-	support/scripts/check-merged-usr.sh \
+	support/scripts/check-merged \
 		--type overlay \
 		$(call qstrip,$(BR2_ROOTFS_OVERLAY))
 endif # merged /usr
diff --git a/package/skeleton-custom/skeleton-custom.mk b/package/skeleton-custom/skeleton-custom.mk
index c194108307..82e1506156 100644
--- a/package/skeleton-custom/skeleton-custom.mk
+++ b/package/skeleton-custom/skeleton-custom.mk
@@ -27,7 +27,7 @@ endif
 # counterparts are appropriately setup as symlinks ones to the others.
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
 define SKELETON_CUSTOM_NOT_MERGED_USR_DIRS
-	support/scripts/check-merged-usr.sh \
+	support/scripts/check-merged \
 		--type skeleton \
 		$(SKELETON_CUSTOM_PATH)
 endef
diff --git a/support/scripts/check-merged-usr.sh b/support/scripts/check-merged
similarity index 100%
rename from support/scripts/check-merged-usr.sh
rename to support/scripts/check-merged
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 10/17 v2] support/scripts; teach check-merged what to check
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (8 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 09/17 v2] support/scripts: rename check-merged-usr.sh Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 11/17 v2] system: add support for merged /usr/sbin (aka merged-bin) Yann E. MORIN via buildroot
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle (Essensium/Mind)

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 Makefile                                   |  3 +--
 package/skeleton-custom/skeleton-custom.mk | 11 ++---------
 support/scripts/check-merged               | 22 +++++++++++++++-------
 3 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/Makefile b/Makefile
index 56266a8feb..2f5c43e1b3 100644
--- a/Makefile
+++ b/Makefile
@@ -781,12 +781,11 @@ endif
 
 # For a merged /usr, ensure that /lib, /bin and /sbin and their /usr
 # counterparts are appropriately setup as symlinks ones to the others.
-ifeq ($(BR2_ROOTFS_MERGED_USR),y)
 	@$(call MESSAGE,"Sanity check in overlays $(call qstrip,$(BR2_ROOTFS_OVERLAY))")
 	support/scripts/check-merged \
 		--type overlay \
+		$(if $(BR2_ROOTFS_MERGED_USR),--merged-usr) \
 		$(call qstrip,$(BR2_ROOTFS_OVERLAY))
-endif # merged /usr
 
 	$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
 		@$(call MESSAGE,"Copying overlay $(d)")$(sep) \
diff --git a/package/skeleton-custom/skeleton-custom.mk b/package/skeleton-custom/skeleton-custom.mk
index 82e1506156..5d65b95ecf 100644
--- a/package/skeleton-custom/skeleton-custom.mk
+++ b/package/skeleton-custom/skeleton-custom.mk
@@ -23,19 +23,12 @@ $(error No path specified for the custom skeleton)
 endif
 endif
 
-# For a merged /usr, ensure that /lib, /bin and /sbin and their /usr
-# counterparts are appropriately setup as symlinks ones to the others.
-ifeq ($(BR2_ROOTFS_MERGED_USR),y)
-define SKELETON_CUSTOM_NOT_MERGED_USR_DIRS
+define SKELETON_CUSTOM_CONFIGURE_CMDS
 	support/scripts/check-merged \
 		--type skeleton \
+		$(if $(BR2_ROOTFS_MERGED_USR),--merged-usr) \
 		$(SKELETON_CUSTOM_PATH)
 endef
-endif # merged /usr
-
-define SKELETON_CUSTOM_CONFIGURE_CMDS
-	$(SKELETON_CUSTOM_NOT_MERGED_USR_DIRS)
-endef
 
 # The target-dir-warning file and the lib{32,64} symlinks are the only
 # things we customise in the custom skeleton.
diff --git a/support/scripts/check-merged b/support/scripts/check-merged
index 34e726b4fb..3cccd68dd7 100755
--- a/support/scripts/check-merged
+++ b/support/scripts/check-merged
@@ -13,6 +13,7 @@
 #
 # Input:
 #   --type TYPE     the type of root to check: 'skeleton' or 'overlay'
+#   --merged-usr    check for merged /usr
 #   $*:             the root directories (skeleton, overlays) to check
 # Output:
 #   stdout:         the list of non-compliant paths (empty if compliant).
@@ -21,17 +22,22 @@
 #   !0:             if any directory to check is improperly merged
 #
 
-opts="type:"
+opts="type:,merged-usr"
 ARGS="$(getopt -n check-merged -o "" -l "${opts}" -- "${@}")" || exit 1
 eval set -- "${ARGS}"
 
 type=
+merged_usr=false
 while :; do
 	case "${1}" in
 	(--type)
 		type="${2}"
 		shift 2
 		;;
+	(--merged-usr)
+		merged_usr=true
+		shift
+		;;
 	(--)
 		shift
 		break
@@ -101,12 +107,14 @@ test_dir() {
 is_success=true
 for root; do
 	first=true
-	test_dir "${type}" "${root}" "/" "usr/bin"
-	test_dir "${type}" "${root}" "/" "usr/lib"
-	test_dir "${type}" "${root}" "/" "usr/sbin"
-	test_merged "${type}" "${root}" "/" "bin" "usr/bin"
-	test_merged "${type}" "${root}" "/" "lib" "usr/lib"
-	test_merged "${type}" "${root}" "/" "sbin" "usr/sbin"
+	if ${merged_usr}; then
+		test_dir "${type}" "${root}" "/" "usr/bin"
+		test_dir "${type}" "${root}" "/" "usr/lib"
+		test_dir "${type}" "${root}" "/" "usr/sbin"
+		test_merged "${type}" "${root}" "/" "bin" "usr/bin"
+		test_merged "${type}" "${root}" "/" "lib" "usr/lib"
+		test_merged "${type}" "${root}" "/" "sbin" "usr/sbin"
+	fi
 done
 
 ${is_success}
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 11/17 v2] system: add support for merged /usr/sbin (aka merged-bin)
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (9 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 10/17 v2] support/scripts; teach check-merged what to check Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-23 13:11   ` TIAN Yuanhao
  2025-07-10 20:22 ` [Buildroot] [PATCH 12/17 v2] support/scripts: reject skeletons or overlays that are unexpectedly merged Yann E. MORIN via buildroot
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Arnout Vandecappelle, Edgar Bonet

Starting with version 256 [0], systemd warns when /usr/bin and
/usr/sbin are different directories; in the future, it may even
refuse to boot in such a situation.

Add support for merged-bin, not unlike the support we have for
merged-usr; we also make merged-bin a sub-case of merged-usr
(i.e. it is not possible to do merged-bin without merged-usr).

[0] https://github.com/systemd/systemd/blob/v256/NEWS#L265

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Acked-by: Arnout Vandecappelle <arnout@mind.be>
Cc: Edgar Bonet <bonet@grenoble.cnrs.fr>

---
Changes v1 -> v2:
  - fix typo  (Edgar)
---
 Makefile                                   |  1 +
 package/skeleton-custom/skeleton-custom.mk |  1 +
 support/scripts/check-merged               | 22 +++++++++++++++++++---
 system/Config.in                           | 11 +++++++++++
 system/skeleton/usr/sbin/.empty            |  0
 system/system.mk                           | 14 +++++++++++++-
 6 files changed, 45 insertions(+), 4 deletions(-)
 delete mode 100644 system/skeleton/usr/sbin/.empty

diff --git a/Makefile b/Makefile
index 2f5c43e1b3..2b81406b7e 100644
--- a/Makefile
+++ b/Makefile
@@ -785,6 +785,7 @@ endif
 	support/scripts/check-merged \
 		--type overlay \
 		$(if $(BR2_ROOTFS_MERGED_USR),--merged-usr) \
+		$(if $(BR2_ROOTFS_MERGED_BIN),--merged-bin) \
 		$(call qstrip,$(BR2_ROOTFS_OVERLAY))
 
 	$(foreach d, $(call qstrip,$(BR2_ROOTFS_OVERLAY)), \
diff --git a/package/skeleton-custom/skeleton-custom.mk b/package/skeleton-custom/skeleton-custom.mk
index 5d65b95ecf..7c79500046 100644
--- a/package/skeleton-custom/skeleton-custom.mk
+++ b/package/skeleton-custom/skeleton-custom.mk
@@ -27,6 +27,7 @@ define SKELETON_CUSTOM_CONFIGURE_CMDS
 	support/scripts/check-merged \
 		--type skeleton \
 		$(if $(BR2_ROOTFS_MERGED_USR),--merged-usr) \
+		$(if $(BR2_ROOTFS_MERGED_BIN),--merged-bin) \
 		$(SKELETON_CUSTOM_PATH)
 endef
 
diff --git a/support/scripts/check-merged b/support/scripts/check-merged
index 3cccd68dd7..fbda49f1c0 100755
--- a/support/scripts/check-merged
+++ b/support/scripts/check-merged
@@ -1,7 +1,9 @@
 #!/usr/bin/env bash
 #
-# Check if a given custom skeleton or overlay complies to the merged /usr
+# Check if a given custom skeleton or overlay complies to the merged
 # requirements:
+#
+# - for merged-usr:
 #   /bin            missing, or a relative symlink to usr/bin
 #   /lib            missing, or a relative symlink to usr/lib
 #   /sbin           missing, or a relative symlink to usr/sbin
@@ -11,9 +13,14 @@
 #
 # *: must be present for skeletons, can be missing for overlays
 #
+# - for merged-bin: all of the above, except:
+#   /usr/sbin       missing, or a relative symlink to bin (thus points
+#                   to /usr/bin)
+#
 # Input:
 #   --type TYPE     the type of root to check: 'skeleton' or 'overlay'
 #   --merged-usr    check for merged /usr
+#   --merged-bin    check for merged /usr/bin
 #   $*:             the root directories (skeleton, overlays) to check
 # Output:
 #   stdout:         the list of non-compliant paths (empty if compliant).
@@ -22,12 +29,13 @@
 #   !0:             if any directory to check is improperly merged
 #
 
-opts="type:,merged-usr"
+opts="type:,merged-usr,merged-bin"
 ARGS="$(getopt -n check-merged -o "" -l "${opts}" -- "${@}")" || exit 1
 eval set -- "${ARGS}"
 
 type=
 merged_usr=false
+merged_bin=false
 while :; do
 	case "${1}" in
 	(--type)
@@ -38,6 +46,10 @@ while :; do
 		merged_usr=true
 		shift
 		;;
+	(--merged-bin)
+		merged_bin=true
+		shift
+		;;
 	(--)
 		shift
 		break
@@ -110,10 +122,14 @@ for root; do
 	if ${merged_usr}; then
 		test_dir "${type}" "${root}" "/" "usr/bin"
 		test_dir "${type}" "${root}" "/" "usr/lib"
-		test_dir "${type}" "${root}" "/" "usr/sbin"
 		test_merged "${type}" "${root}" "/" "bin" "usr/bin"
 		test_merged "${type}" "${root}" "/" "lib" "usr/lib"
 		test_merged "${type}" "${root}" "/" "sbin" "usr/sbin"
+		if ${merged_bin}; then
+			test_merged "${type}" "${root}" "/usr/" "sbin" "bin"
+		else
+			test_dir "${type}" "${root}" "/" "usr/sbin"
+		fi
 	fi
 done
 
diff --git a/system/Config.in b/system/Config.in
index 32462241a5..0652b94a3b 100644
--- a/system/Config.in
+++ b/system/Config.in
@@ -343,6 +343,16 @@ config BR2_ROOTFS_MERGED_USR
 	  symlinks to their counterparts in /usr. In this case, /usr can
 	  not be a separate filesystem.
 
+config BR2_ROOTFS_MERGED_BIN
+	bool "Merged /usr/bin"
+	depends on BR2_ROOTFS_MERGED_USR
+	help
+	  If you say 'n' here, then /usr/bin and /usr/sbin will be
+	  separate directories; this is the historical UNIX way.
+
+	  If you say 'y' here, then /usr/sbin will be a relative
+	  symlink to /usr/bin.
+
 if BR2_ROOTFS_SKELETON_DEFAULT
 
 config BR2_TARGET_ENABLE_ROOT_LOGIN
@@ -529,6 +539,7 @@ endif # BR2_ROOTFS_SKELETON_DEFAULT
 
 config BR2_SYSTEM_DEFAULT_PATH
 	string "Set the system's default PATH"
+	default "/usr/bin" if BR2_ROOTFS_MERGED_BIN
 	default "/usr/bin:/usr/sbin" if BR2_ROOTFS_MERGED_USR
 	default "/bin:/sbin:/usr/bin:/usr/sbin"
 	help
diff --git a/system/skeleton/usr/sbin/.empty b/system/skeleton/usr/sbin/.empty
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/system/system.mk b/system/system.mk
index 8fe2c138b0..52e810868a 100644
--- a/system/system.mk
+++ b/system/system.mk
@@ -32,18 +32,30 @@
 #   set inittab to remount root read-write or read-only
 #
 
-# This function handles the merged or non-merged /usr cases
+# This function handles the merged or non-merged /usr, and merged or
+# non-merged /usr/bin cases
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
+ifeq ($(BR2_ROOTFS_MERGED_BIN),y)
+define SYSTEM_SBIN_SYMLINKS_OR_DIRS
+	ln -snf bin $(1)/usr/sbin
+endef
+else
+define SYSTEM_SBIN_SYMLINKS_OR_DIRS
+	$(INSTALL) -d -m 0755 $(1)/usr/sbin
+endef
+endif
 define SYSTEM_USR_SYMLINKS_OR_DIRS
 	ln -snf usr/bin $(1)/bin
 	ln -snf usr/sbin $(1)/sbin
 	ln -snf usr/lib $(1)/lib
+	$(SYSTEM_SBIN_SYMLINKS_OR_DIRS)
 endef
 else
 define SYSTEM_USR_SYMLINKS_OR_DIRS
 	$(INSTALL) -d -m 0755 $(1)/bin
 	$(INSTALL) -d -m 0755 $(1)/sbin
 	$(INSTALL) -d -m 0755 $(1)/lib
+	$(INSTALL) -d -m 0755 $(1)/usr/sbin
 endef
 endif
 
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 12/17 v2] support/scripts: reject skeletons or overlays that are unexpectedly merged
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (10 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 11/17 v2] system: add support for merged /usr/sbin (aka merged-bin) Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 13/17 v2] package/coreutils: no need for chroot workaround with merged-bin Yann E. MORIN via buildroot
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Currently, we partially accept that a skeleton or a rootfs overlay be
merged:
  - for unmerged, we accept all kind of situations: unmerged, partially
    merged, badly merged, merged-usr or merged-bin, arbitrary relative
    or absolute symlinks, and whatnots;
  - for merged-usr, we strictly require a properly set up merged-usr,
    and we refuse a merged-bin;
  - for merged-bin, we stricty require a properly set up merged-bin.

The unmerged case is inconsistent with the other cases, especially it
allows for arbitrary symlinks that may point to arbitrary locations that
may even not belong to $(TARGET_DIR) at all...

We fix that by ensuring that the skeleton and overlays strictly adhere
to the merge-level of the configuration; i.e. for an unmerged config, we
require that the skeleton and overlays be strictly unmerged, that is,
/bin, /lib, and /sbin, and their counterparts in /usr, are actual
directories.

Thus, for all three types of merge level, the skeleton and overlays must
match the configured merge level.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
 support/scripts/check-merged | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/support/scripts/check-merged b/support/scripts/check-merged
index fbda49f1c0..bff6ae2b7b 100755
--- a/support/scripts/check-merged
+++ b/support/scripts/check-merged
@@ -3,16 +3,21 @@
 # Check if a given custom skeleton or overlay complies to the merged
 # requirements:
 #
-# - for merged-usr:
-#   /bin            missing, or a relative symlink to usr/bin
-#   /lib            missing, or a relative symlink to usr/lib
-#   /sbin           missing, or a relative symlink to usr/sbin
+# - for unmerged:
+#   /bin            missing*, or an existing directory; not a symlink
+#   /lib            missing*, or an existing directory; not a symlink
+#   /sbin           missing*, or an existing directory; not a symlink
 #   /usr/bin/       missing*, or an existing directory; not a symlink
 #   /usr/lib/       missing*, or an existing directory; not a symlink
 #   /usr/sbin/      missing*, or an existing directory; not a symlink
 #
 # *: must be present for skeletons, can be missing for overlays
 #
+# - for merged-usr: all of the above, except:
+#   /bin            missing, or a relative symlink to usr/bin
+#   /lib            missing, or a relative symlink to usr/lib
+#   /sbin           missing, or a relative symlink to usr/sbin
+#
 # - for merged-bin: all of the above, except:
 #   /usr/sbin       missing, or a relative symlink to bin (thus points
 #                   to /usr/bin)
@@ -119,9 +124,9 @@ test_dir() {
 is_success=true
 for root; do
 	first=true
+	test_dir "${type}" "${root}" "/" "usr/bin"
+	test_dir "${type}" "${root}" "/" "usr/lib"
 	if ${merged_usr}; then
-		test_dir "${type}" "${root}" "/" "usr/bin"
-		test_dir "${type}" "${root}" "/" "usr/lib"
 		test_merged "${type}" "${root}" "/" "bin" "usr/bin"
 		test_merged "${type}" "${root}" "/" "lib" "usr/lib"
 		test_merged "${type}" "${root}" "/" "sbin" "usr/sbin"
@@ -130,6 +135,11 @@ for root; do
 		else
 			test_dir "${type}" "${root}" "/" "usr/sbin"
 		fi
+	else
+		test_dir "${type}" "${root}" "/" "bin"
+		test_dir "${type}" "${root}" "/" "lib"
+		test_dir "${type}" "${root}" "/" "sbin"
+		test_dir "${type}" "${root}" "/" "usr/sbin"
 	fi
 done
 
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 13/17 v2] package/coreutils: no need for chroot workaround with merged-bin
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (11 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 12/17 v2] support/scripts: reject skeletons or overlays that are unexpectedly merged Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 14/17 v2] package/kmod: adjust paths for merged-bin Yann E. MORIN via buildroot
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
 package/coreutils/coreutils.mk | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/package/coreutils/coreutils.mk b/package/coreutils/coreutils.mk
index a6d193b49e..60772c9e7b 100644
--- a/package/coreutils/coreutils.mk
+++ b/package/coreutils/coreutils.mk
@@ -125,6 +125,7 @@ define COREUTILS_CREATE_TEST_SYMLINK
 endef
 COREUTILS_POST_INSTALL_TARGET_HOOKS += COREUTILS_CREATE_TEST_SYMLINK
 
+ifeq ($(BR2_ROOTFS_MERGED_BIN),)
 # gnu thinks chroot is in bin, debian thinks it's in sbin
 ifeq ($(BR2_PACKAGE_COREUTILS_INDIVIDUAL_BINARIES),y)
 define COREUTILS_FIX_CHROOT_LOCATION
@@ -137,6 +138,7 @@ define COREUTILS_FIX_CHROOT_LOCATION
 endef
 endif
 COREUTILS_POST_INSTALL_TARGET_HOOKS += COREUTILS_FIX_CHROOT_LOCATION
+endif
 
 # Explicitly install ln and realpath, which we *are* insterested in.
 # A lot of other programs still get installed, however, but disabling
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 14/17 v2] package/kmod: adjust paths for merged-bin
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (12 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 13/17 v2] package/coreutils: no need for chroot workaround with merged-bin Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 15/17 v2] package/util-linux: " Yann E. MORIN via buildroot
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Yegor Yefremov <yegorslists@googlemail.com>
---
 package/kmod/kmod.mk | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/package/kmod/kmod.mk b/package/kmod/kmod.mk
index dfdd17b955..cbf89bca9d 100644
--- a/package/kmod/kmod.mk
+++ b/package/kmod/kmod.mk
@@ -68,16 +68,24 @@ ifeq ($(BR2_PACKAGE_KMOD_TOOLS),y)
 KMOD_LICENSE += , GPL-2.0+ (tools)
 KMOD_LICENSE_FILES += COPYING
 
-# /sbin is really /usr/sbin with merged /usr, so adjust relative symlink
+# /sbin is really /usr/sbin with merged /usr, and /usr/sbin is
+# really /usr/bin with merged-bin, so adjust relative symlink
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
+ifeq ($(BR2_ROOTFS_MERGED_BIN),y)
+KMOD_BIN_PATH = kmod
+KMOD_SBIN_DIR = bin
+else
 KMOD_BIN_PATH = ../bin/kmod
+KMOD_SBIN_DIR = sbin
+endif
 else
 KMOD_BIN_PATH = ../usr/bin/kmod
+KMOD_SBIN_DIR = sbin
 endif
 
 define KMOD_INSTALL_TOOLS
 	for i in depmod insmod lsmod modinfo modprobe rmmod; do \
-		ln -sf $(KMOD_BIN_PATH) $(TARGET_DIR)/sbin/$$i; \
+		ln -sf $(KMOD_BIN_PATH) $(TARGET_DIR)/$(KMOD_SBIN_DIR)/$$i; \
 	done
 endef
 
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin)
@ 2025-07-10 20:22 Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 01/17 v2] system: reword merged-usr prompt Yann E. MORIN via buildroot
                   ` (17 more replies)
  0 siblings, 18 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot
  Cc: Edgar Bonet, Sen Hastings, Yann E . MORIN, Thomas Petazzoni,
	Romain Naour, Arnout Vandecappelle, Giulio Benetti, Norbert Lange

Hello All!

This series introduces support for so-called merged-bin, where /usr/sbin
is merged with /sur/bin, as an extra step after merged-usr, now just
requested, but in a relatively close future required, by systemd.

The series is organised in a few steps:

 1. patches 1-3 are cleanups in the Kconfig menu, related to the
    merged-usr prompt, to the defaults for PATH, and to the rationale
    for selecting merged-usr with systemd; those can be applied without
    considering the rest of the series;

 2. then patches 4-9 prepare support/scripts/check-merged-usr.sh to
    check for more than merged-usr: a good cleanup, and better check the
    merged state; those patch can also be applied without considering
    the rest of the series;

 3. with patches 9-12, support for merged-bin is added, and the merge
    level of skeleton and overlays properly enforced to match the
    configured merge setup; those require the two set of patches above
    to be applied first;

 4. then, patches 13-16 introduce workarounds for a few packages to
    properly support merged-bin. For ease of review, those are separate
    patches, but that means the series _may_ break if the merged-bin
    support is applied but not the per-package workarounds; those
    require that all patches above be applied first, of course;

 5. the last patch makes merged-bin mandatory for systemd and extend the
    systemd runtime test to catch future tainted flag; again, that
    requires that everything before is applied, too.

The series was tested with a large set of packages and a large set of
toolchains, and although it is a critical change, it is still pretty
well confined to just a few spots.

Changes v1 -> v2:
  - add Arnout's Acked-by tag where appropriate
  - totally rewrite the test for merged status
  - reject unexpectedly merged skeletons or overlays
  - add runtime test to catch systemd tainted flags
  - typos

Regards,
Yann E. MORIN.


----------------------------------------------------------------
Yann E. MORIN (17):
      system: reword merged-usr prompt
      system: drop superfluous negative condition for default PATH
      package/systemd: select merged-usr from package, not init
      support/scripts: comonalise checking merged status
      support/scripts: prepare for a more complex check for merged directories
      support/scripts: also exit in error on improperly merged-usr
      support/scripts: move merged-usr errors message into check-merged-usr.sh
      support/scripts: fix and restrict conditions to accept merged dirs
      support/scripts: rename check-merged-usr.sh
      support/scripts; teach check-merged what to check
      system: add support for merged /usr/sbin (aka merged-bin)
      support/scripts: reject skeletons or overlays that are unexpectedly merged
      package/coreutils: no need for chroot workaround with merged-bin
      package/kmod: adjust paths for merged-bin
      package/util-linux: adjust paths for merged-bin
      toolchain/external: support merged-bin
      package/systemd: require merged-bin

 Makefile                                   |  19 ++--
 package/coreutils/coreutils.mk             |   2 +
 package/kmod/kmod.mk                       |  12 ++-
 package/skeleton-custom/skeleton-custom.mk |  25 ++---
 package/systemd/Config.in                  |   2 +
 package/util-linux/util-linux.mk           |   8 +-
 support/scripts/check-merged               | 146 +++++++++++++++++++++++++++++
 support/scripts/check-merged-usr.sh        |  39 --------
 support/testing/tests/init/test_systemd.py |  19 ++++
 system/Config.in                           |  20 ++--
 system/skeleton/usr/sbin/.empty            |   0
 system/system.mk                           |  14 ++-
 toolchain/helpers.mk                       |   8 +-
 13 files changed, 232 insertions(+), 82 deletions(-)
 create mode 100755 support/scripts/check-merged
 delete mode 100755 support/scripts/check-merged-usr.sh
 delete mode 100644 system/skeleton/usr/sbin/.empty

--
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 15/17 v2] package/util-linux: adjust paths for merged-bin
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (13 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 14/17 v2] package/kmod: adjust paths for merged-bin Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 16/17 v2] toolchain/external: support merged-bin Yann E. MORIN via buildroot
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
 package/util-linux/util-linux.mk | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/package/util-linux/util-linux.mk b/package/util-linux/util-linux.mk
index 3098a81a72..d1abdbdc9e 100644
--- a/package/util-linux/util-linux.mk
+++ b/package/util-linux/util-linux.mk
@@ -75,7 +75,13 @@ endif
 # ${usrlib_execdir} (/usr/lib) to ${libdir} (/lib), since both paths are
 # the same when merged usr is in use.
 ifeq ($(BR2_ROOTFS_MERGED_USR),y)
-UTIL_LINUX_CONF_OPTS += --bindir=/usr/bin --sbindir=/usr/sbin --libdir=/usr/lib
+UTIL_LINUX_CONF_OPTS += --bindir=/usr/bin --libdir=/usr/lib
+# Ditto for /usr/sbin and /usr/bin when merge sbin is in use
+ifeq ($(BR2_ROOTFS_MERGED_BIN),y)
+UTIL_LINUX_CONF_OPTS += --sbindir=/usr/bin
+else
+UTIL_LINUX_CONF_OPTS += --sbindir=/usr/sbin
+endif
 endif
 
 ifeq ($(BR2_PACKAGE_SYSTEMD),y)
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 16/17 v2] toolchain/external: support merged-bin
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (14 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 15/17 v2] package/util-linux: " Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-07-10 20:22 ` [Buildroot] [PATCH 17/17 v2] package/systemd: require merged-bin Yann E. MORIN via buildroot
  2025-08-31 14:45 ` [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot; +Cc: Yann E. MORIN, Giulio Benetti, Romain Naour, Thomas Petazzoni

When an external toolchain does not have a merged-bin, we can end up
with a situation where the toolchain installs an staging/usr/sbin/
directory, overriding the sbin symlink with an actual directory. When
not using PPD, this does not cause any harm.

However, with PPD, the build fails when preparing the staging (the
host/) for packages when the skeleton is eventually rsynced, e.g.:

    $ cat defconfig
    BR2_aarch64=y
    BR2_TOOLCHAIN_EXTERNAL=y
    BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y
    BR2_PER_PACKAGE_DIRECTORIES=y
    BR2_INIT_NONE=y
    BR2_ROOTFS_MERGED_USR=y
    BR2_ROOTFS_MERGED_SBIN=y
    # BR2_PACKAGE_BUSYBOX is not set
    BR2_PACKAGE_ZLIB=y
    # BR2_TARGET_ROOTFS_TAR is not set

    $ make zlib
    [...]
    >>> zlib  Configuring
    mkdir -p [...]/per-package/zlib/host
    rsync -a --hard-links --link-dest=[...]/per-package/host-skeleton/host/ [...]/per-package/host-skeleton/host/ [...]/per-package/zlib/host
    rsync -a --hard-links --link-dest=[...]/per-package/libzlib/host/ [...]/per-package/libzlib/host/ [...]/per-package/zlib/host
    rsync -a --hard-links --link-dest=[...]/per-package/skeleton/host/ [...]/per-package/skeleton/host/ [...]/per-package/zlib/host
    could not make way for new symlink: aarch64-buildroot-linux-gnu/sysroot/usr/sbin
    cannot delete non-empty directory: aarch64-buildroot-linux-gnu/sysroot/usr/sbin
    rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.3.0]
    make[1]: *** [package/pkg-generic.mk:256: [...]/build/zlib/.stamp_configured] Error 23
    make: *** [Makefile:23: _all] Error 2

The root cause is that, in the skeleton, we end up with
[staging]/usr/sbin as a synlink to bin, but when the external toolchain
gets installed, the symlinbk is replaced by a directory. Later, when we
aggregate the PPD before configuring a package, it often happens that a
dependant package be rsynced before the toolchain and the skeleton, as
seen above, in which case the sbin directory from the toolchain, by way
of the dependency to a package, is already present when rsync wants to
create a symlink as rsynced from the skeleton.

In the example above, this plays in this order:

 1. skeleton gets installed, provides a symlink
 2. toolchain-external-bootlin rsyncs from skeleton, gets a symlink
 3. toolchain-external-bootlin gets installed, replaces symlink with a
    directory
 4. libzlib rsyncs from skeleton, gets a symlink, then rsyncs from
    toolchain-e-b, gets a directory
 5. zlib rsyncs from libzlib first (because alphabetical ordering), gets
    a directory, then rsyncs from skeleton, which rsyncs from a symlink,
    but the destination is a non-empty directory, so rsync fails.

It is perfectly legit that an external toolchain does not use a
merged-bin setup, so we must accept that as input. We do so by treating
the /usr/sbin entry specially, like we already do for a few others, of
which /sbin itself for example.

Note that the merged-usr setup has no issue, because we already handle
the lib*/ directories specially too.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Giulio Benetti <giulio.benetti@benettiengineering.com>
Cc: Romain Naour <romain.naour@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
 toolchain/helpers.mk | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
index f3fdaaec07..21c710d0fb 100644
--- a/toolchain/helpers.mk
+++ b/toolchain/helpers.mk
@@ -96,6 +96,10 @@ copy_toolchain_lib_root = \
 # Note that the 'locale' directories are not copied. They are huge
 # (400+MB) in CodeSourcery toolchains, and they are not really useful.
 #
+# usr/sbin may be a directory in the source toolchain, but a symlink
+# in the destination sysroot, when we are using a merged-bin. Account
+# for that.
+#
 # $1: main sysroot directory of the toolchain
 # $2: arch specific sysroot directory of the toolchain
 # $3: arch specific subdirectory in the sysroot
@@ -109,13 +113,13 @@ copy_toolchain_sysroot = \
 	ARCH_SUBDIR="$(strip $3)"; \
 	ARCH_LIB_DIR="$(strip $4)" ; \
 	SUPPORT_LIB_DIR="$(strip $5)" ; \
-	for i in etc $${ARCH_LIB_DIR} sbin usr usr/$${ARCH_LIB_DIR}; do \
+	for i in etc $${ARCH_LIB_DIR} sbin usr usr/$${ARCH_LIB_DIR} usr/sbin; do \
 		if [ ! -d $${ARCH_SYSROOT_DIR}/$$i ] ; then \
 			continue ; \
 		fi ; \
 		if [ "$$i" = "usr" ]; then \
 			rsync -au --chmod=u=rwX,go=rX --exclude 'locale/' \
-				--include '/libexec*/' --exclude '/lib*/' \
+				--include '/libexec*/' --exclude '/lib*/' --exclude '/sbin' \
 				$${ARCH_SYSROOT_DIR}/$$i/ $(STAGING_DIR)/$$i/ ; \
 		else \
 			rsync -au --chmod=u=rwX,go=rX --exclude 'locale/' \
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Buildroot] [PATCH 17/17 v2] package/systemd: require merged-bin
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (15 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 16/17 v2] toolchain/external: support merged-bin Yann E. MORIN via buildroot
@ 2025-07-10 20:22 ` Yann E. MORIN via buildroot
  2025-08-31 14:45 ` [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
  17 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-07-10 20:22 UTC (permalink / raw)
  To: buildroot
  Cc: Yann E. MORIN, Arnout Vandecappelle, Norbert Lange, Sen Hastings

Since version 256, systemd will taint the system if /usr/bin and
/usr/sbin are not merged, known as merged-bin:

    # systemctl --no-pager status
    ● buildroot
        State: running
        Units: 166 loaded (incl. loaded aliases)
         Jobs: 0 queued
       Failed: 0 units
        Since: Mon 2025-07-07 19:48:05 UTC; 19s ago
      systemd: 257.7
      Tainted: unmerged-bin
       CGroup: /
               ├─init.scope
               [...]

Although this is not yet an error, it will be in the future.

To be as ready as we can be when that happens, forcibly enable
merged-bin, like we did when we initially added merged-usr (except
this time we carry the select from systemd, even though it is not
yet strictly required, rather than from the init entry).

Extend the runtime test to catch any tainted flag.

Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Norbert Lange <nolange79@gmail.com>
Cc: Sen Hastings <sen@hastings.org>

---
Changes v1 -> v2:
  - add the runtime test
    => do not add the Acked-by Arnout gave on v1, since the runtime
    test was not reviewed then.
---
 package/systemd/Config.in                  |  1 +
 support/testing/tests/init/test_systemd.py | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/package/systemd/Config.in b/package/systemd/Config.in
index 0cb10ea3d8..931134911a 100644
--- a/package/systemd/Config.in
+++ b/package/systemd/Config.in
@@ -25,6 +25,7 @@ menuconfig BR2_PACKAGE_SYSTEMD
 	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_8
 	depends on BR2_HOST_GCC_AT_LEAST_8 # host-systemd
 	select BR2_ROOTFS_MERGED_USR
+	select BR2_ROOTFS_MERGED_BIN
 	select BR2_PACKAGE_HAS_UDEV
 	select BR2_PACKAGE_DBUS if !BR2_PACKAGE_DBUS_BROKER # runtime
 	select BR2_PACKAGE_LIBCAP
diff --git a/support/testing/tests/init/test_systemd.py b/support/testing/tests/init/test_systemd.py
index 05a65223b3..7fdd5d1798 100644
--- a/support/testing/tests/init/test_systemd.py
+++ b/support/testing/tests/init/test_systemd.py
@@ -31,6 +31,25 @@ class InitSystemSystemdBase(InitSystemBase):
             self.start_emulator(fs)
         self.check_init("/lib/systemd/systemd")
 
+        # Test there is no tainted flag.
+        output, ret = self.emulator.run("systemctl --no-pager status")
+        self.assertEqual(ret, 0, f"'systemctl status' failed with exit code {ret}, with:\n{output}")
+        try:
+            # 'support-ended' tainted flag is only set based on the
+            # SUPPORT_END variable in /etc/os-release; as we don't set
+            # it in Buildroot, we can't get that flag in the runtime
+            # tests, even on our maintenance branches, so we don't need
+            # to filter it out.
+            tainted_flags = [
+                "".join(line.split(":")[1:]).strip()
+                for line in output
+                if line.strip().startswith("Tainted: ")
+            ][0]
+            raise RuntimeError(f"Tainted flags: {tainted_flags}")
+        except IndexError:
+            # No tainted flag \o/
+            pass
+
         # Test all units are OK
         output, _ = self.emulator.run("systemctl --no-pager --failed --no-legend")
         self.assertEqual(len(output), 0)
-- 
2.47.0

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [Buildroot] [PATCH 11/17 v2] system: add support for merged /usr/sbin (aka merged-bin)
  2025-07-10 20:22 ` [Buildroot] [PATCH 11/17 v2] system: add support for merged /usr/sbin (aka merged-bin) Yann E. MORIN via buildroot
@ 2025-07-23 13:11   ` TIAN Yuanhao
  0 siblings, 0 replies; 21+ messages in thread
From: TIAN Yuanhao @ 2025-07-23 13:11 UTC (permalink / raw)
  To: yann.morin.1998; +Cc: buildroot, arnout, bonet


[-- Attachment #1.1: Type: text/plain, Size: 106 bytes --]

Acked-by: TIAN Yuanhao <tianyuanhao3@163.com>



| |
tianyuanhao3@163.com
|
|
邮箱:tianyuanhao3@163.com
|

[-- Attachment #1.2: Type: text/html, Size: 2046 bytes --]

[-- Attachment #2: Type: text/plain, Size: 150 bytes --]

_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin)
  2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
                   ` (16 preceding siblings ...)
  2025-07-10 20:22 ` [Buildroot] [PATCH 17/17 v2] package/systemd: require merged-bin Yann E. MORIN via buildroot
@ 2025-08-31 14:45 ` Yann E. MORIN via buildroot
  2025-08-31 17:18   ` Yann E. MORIN via buildroot
  17 siblings, 1 reply; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-08-31 14:45 UTC (permalink / raw)
  To: buildroot
  Cc: Edgar Bonet, Sen Hastings, Thomas Petazzoni, Romain Naour,
	Arnout Vandecappelle, Giulio Benetti, Norbert Lange

Hello All,

On 2025-07-10 22:22 +0200, Yann E. MORIN spake thusly:
> This series introduces support for so-called merged-bin, where /usr/sbin
> is merged with /sur/bin, as an extra step after merged-usr, now just
> requested, but in a relatively close future required, by systemd.

Ping, any further feedback on this series?

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin)
  2025-08-31 14:45 ` [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
@ 2025-08-31 17:18   ` Yann E. MORIN via buildroot
  0 siblings, 0 replies; 21+ messages in thread
From: Yann E. MORIN via buildroot @ 2025-08-31 17:18 UTC (permalink / raw)
  To: buildroot
  Cc: Edgar Bonet, Sen Hastings, Thomas Petazzoni, Romain Naour,
	Arnout Vandecappelle, Giulio Benetti, Norbert Lange

All,

On 2025-08-31 16:45 +0200, Yann E. MORIN spake thusly:
> On 2025-07-10 22:22 +0200, Yann E. MORIN spake thusly:
> > This series introduces support for so-called merged-bin, where /usr/sbin
> > is merged with /sur/bin, as an extra step after merged-usr, now just
> > requested, but in a relatively close future required, by systemd.
> Ping, any further feedback on this series?

Yes, some more feedback: while doing some targeted-random testing, I
stumbled on an instance of a bin-sbin conflict in net-tools that I
previously missed. I'll fix that and respin later...

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2025-08-31 17:18 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-10 20:22 [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 01/17 v2] system: reword merged-usr prompt Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 02/17 v2] system: drop superfluous negative condition for default PATH Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 03/17 v2] package/systemd: select merged-usr from package, not init Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 04/17 v2] support/scripts: comonalise checking merged status Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 05/17 v2] support/scripts: prepare for a more complex check for merged directories Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 06/17 v2] support/scripts: also exit in error on improperly merged-usr Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 07/17 v2] support/scripts: move merged-usr errors message into check-merged-usr.sh Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 08/17 v2] support/scripts: fix and restrict conditions to accept merged dirs Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 09/17 v2] support/scripts: rename check-merged-usr.sh Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 10/17 v2] support/scripts; teach check-merged what to check Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 11/17 v2] system: add support for merged /usr/sbin (aka merged-bin) Yann E. MORIN via buildroot
2025-07-23 13:11   ` TIAN Yuanhao
2025-07-10 20:22 ` [Buildroot] [PATCH 12/17 v2] support/scripts: reject skeletons or overlays that are unexpectedly merged Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 13/17 v2] package/coreutils: no need for chroot workaround with merged-bin Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 14/17 v2] package/kmod: adjust paths for merged-bin Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 15/17 v2] package/util-linux: " Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 16/17 v2] toolchain/external: support merged-bin Yann E. MORIN via buildroot
2025-07-10 20:22 ` [Buildroot] [PATCH 17/17 v2] package/systemd: require merged-bin Yann E. MORIN via buildroot
2025-08-31 14:45 ` [Buildroot] [PATCH 00/17 v2] system: add support for merged-bin (branch yem/merged-bin) Yann E. MORIN via buildroot
2025-08-31 17:18   ` Yann E. MORIN via buildroot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).