Skip to contentSkip to conversation

system: add options for /bin /sbin and /lib to be symlinks into /usr

PATCH Superseded Yann E. MORIN 4 participants 8 messages Sep 4, 2015 – Oct 14, 2015

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

systemd is increasingly expecting things to live in /usr/bin, /usr/sbin or /usr/lib nad not in /bin, /sbin or /lib. It has inherited those expectations from a Fedora change:
https://fedoraproject.org/wiki/Features/UsrMove

Note however, that systemd does support /usr being on a separate filesystem; it just expects an initramfs to mount it before the final switchroot over to the actual rootfs.

But the traditional use-case for Buildroot is not to boot with an initramfs; although that is totally feasible, that's probably not what is commonly done in the vast majority of cases.

However, a lot of packages still install stuff directly into /bin, /sbin or /lib, which systemd may need early-on in the boot process, even before it may have a chance to mount /usr. Even though we can tell systemd, at configure-time, where it should expect programs to be at runtime, it does not make sense to go head-first against an upstream wa^Hill.

Add an option so that /bin, /sbin and /lib be symlinks to /usr/bin and /usr/sbin. That option is forcibly enabled when the init system is systemd.

Note: we need not handle /lib32 or /lib64, as they already are symlinks to /lib, which means they will automatically be redirected to /usr/lib, as /usr/lib32 and /usr/lib64 already are.

Furthermore, this means we're no longer supporting a split-usr setup, so the corresponding configure options have been removed as well for systemd and, when using a merged /usr, for eudev as well.

In Buildroot, we decided (with this patch) 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 rather than with BR2_PACKAGE_SYSTEMD.

Cc Thomas Petazzoni <[email protected]>
Cc Arnout Vandecappelle <[email protected]>
Cc Mike Williams <[email protected]>
Cc Vicente Olivert Riera <[email protected]>
Cc Baruch Siach <[email protected]>

---
Changes v2 -> v3:
- only conditionally drop the split-usr options for eudev (Vicente)
- add this missing history log (Vicente)
- add a rationale on why this is the init system that selects merged-usr, not the package (Arnout).

Changes v1 -> v2:
- in skeleton.mk, use a single variable for both cases (Arnout)
- add reference to the Fedora merged-usr manifesto (Arnout)
- add note about /lib32 and /lib64 (Arnout)
- rename the kconfig option (Arnout)
- slightly reword the help text (Arnout)
- drop the split-usr and related options from systemd (Mike, Vicente) and eudev (but only when using merged-usr)
- typoes (Arnout, Baruch)

---
 package/eudev/eudev.mk       |  6 ++++--
 package/skeleton/skeleton.mk | 20 +++++++++++++++++---
 package/systemd/systemd.mk   |  2 --
 system/Config.in             | 17 +++++++++++++++++
 system/skeleton/bin/.empty   |  0
 system/skeleton/lib/.empty   |  0
 system/skeleton/sbin/.empty  |  0
 7 files changed, 38 insertions(+), 7 deletions(-)
 delete mode 100644 system/skeleton/bin/.empty
 delete mode 100644 system/skeleton/lib/.empty
 delete mode 100644 system/skeleton/sbin/.empty
package/eudev/eudev.mk +4 -2
index 1aa74b3..a005f45 100644
@@ -22,16 +22,18 @@ EUDEV_CONF_ENV += LIBS=-lrt
 EUDEV_CONF_OPTS =		\
 	--disable-manpages	\
 	--sbindir=/sbin		\
-	--with-rootlibdir=/lib	\
 	--libexecdir=/lib	\
 	--with-firmware-path=/lib/firmware	\
 	--disable-introspection			\
-	--enable-split-usr			\
 	--enable-libkmod
 
 EUDEV_DEPENDENCIES = host-gperf host-pkgconf util-linux kmod
 EUDEV_PROVIDES = udev
 
+ifeq ($(BR2_ROOTFS_MERGED_USR),)
+EUDEV_CONF_OPTS += --with-rootlibdir=/lib --enable-split-usr
+endif
+
 ifeq ($(BR2_PACKAGE_EUDEV_RULES_GEN),y)
 EUDEV_CONF_OPTS += --enable-rule_generator
 endif
package/skeleton/skeleton.mk +17 -3
index 48e7085..920d3b4 100644
@@ -19,15 +19,29 @@ else
 SKELETON_PATH = system/skeleton
 endif
 
+ifeq ($(BR2_ROOTFS_MERGED_USR),y)
+define SKELETON_USR_SYMLINKS_OR_DIRS
+	ln -snf usr/bin $(TARGET_DIR)/bin
+	ln -snf usr/sbin $(TARGET_DIR)/sbin
+	ln -snf usr/lib $(TARGET_DIR)/lib
+endef
+else
+define SKELETON_USR_SYMLINKS_OR_DIRS
+	$(INSTALL) -d -m 0755 $(TARGET_DIR)/bin
+	$(INSTALL) -d -m 0755 $(TARGET_DIR)/sbin
+	$(INSTALL) -d -m 0755 $(TARGET_DIR)/lib
+endef
+endif
+
 define SKELETON_INSTALL_TARGET_CMDS
 	rsync -a --ignore-times $(SYNC_VCS_EXCLUSIONS) \
 		--chmod=u=rwX,go=rX --exclude .empty --exclude '*~' \
 		$(SKELETON_PATH)/ $(TARGET_DIR)/
-	$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
-		$(TARGET_DIR_WARNING_FILE)
+	$(SKELETON_USR_SYMLINKS_OR_DIRS)
 	ln -snf lib $(TARGET_DIR)/$(LIB_SYMLINK)
-	mkdir -p $(TARGET_DIR)/usr
 	ln -snf lib $(TARGET_DIR)/usr/$(LIB_SYMLINK)
+	$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
+		$(TARGET_DIR_WARNING_FILE)
 endef
 
 SKELETON_TARGET_GENERIC_HOSTNAME = $(call qstrip,$(BR2_TARGET_GENERIC_HOSTNAME))
package/systemd/systemd.mk +0 -2
index b62fc08..59ab103 100644
@@ -28,7 +28,6 @@ endif
 
 SYSTEMD_CONF_OPTS += \
 	--with-rootprefix= \
-	--with-rootlibdir=/lib \
 	--enable-static=no \
 	--disable-manpages \
 	--disable-selinux \
@@ -37,7 +36,6 @@ SYSTEMD_CONF_OPTS += \
 	--with-dbuspolicydir=/etc/dbus-1/system.d \
 	--with-dbussessionservicedir=/usr/share/dbus-1/services \
 	--with-dbussystemservicedir=/usr/share/dbus-1/system-services \
-	--enable-split-usr \
 	--disable-efi \
 	--disable-gnuefi \
 	--disable-tests \
system/Config.in +17 -0
index fad829d..7d73e27 100644
@@ -78,6 +78,10 @@ config BR2_INIT_SYSV
 	select BR2_PACKAGE_INITSCRIPTS
 	select BR2_PACKAGE_SYSVINIT
 
+# 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
@@ -88,6 +92,7 @@ config BR2_INIT_SYSTEMD
 	depends on BR2_USE_MMU
 	depends on !BR2_STATIC_LIBS
 	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_10
+	select BR2_ROOTFS_MERGED_USR
 	select BR2_PACKAGE_SYSTEMD
 
 comment 'systemd needs an (e)glibc toolchain, headers >= 3.10'
@@ -178,6 +183,18 @@ endif
 
 if BR2_ROOTFS_SKELETON_DEFAULT
 
+config BR2_ROOTFS_MERGED_USR
+	bool "Use symlinks to /usr for /bin, /sbin and /lib"
+	help
+	  If you say 'n' here, then /bin, /sbin and /lib and their
+	  counterparts in /usr will be separate directories. This
+	  is the historical UNIX way. In this case, /usr can be a
+	  filesystem on a partition separate from / .
+
+	  If you say 'y' here, then /bin, /sbin and /lib will be symlinks
+	  to their counterparts in /usr. In this case, /usr can not be a
+	  separate filesystem.
+
 config BR2_TARGET_ENABLE_ROOT_LOGIN
 	bool "Enable root login with password"
 	default y
system/skeleton/bin/.empty deleted +0 -0
deleted file mode 100644
index e69de29..0000000
system/skeleton/lib/.empty deleted +0 -0
deleted file mode 100644
index e69de29..0000000
system/skeleton/sbin/.empty deleted +0 -0
deleted file mode 100644
index e69de29..0000000
Signature · 1 line
1.9.1
#1 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

On 04-09-15 22:17, Yann E. MORIN wrote:
[snip]

Quoted 11 lines
package/eudev/eudev.mk +0 -1
index 1aa74b3..a005f45 100644
@@ -22,16 +22,18 @@ EUDEV_CONF_ENV += LIBS=-lrt
 EUDEV_CONF_OPTS =		\
 	--disable-manpages	\
 	--sbindir=/sbin		\
-	--with-rootlibdir=/lib	\
 	--libexecdir=/lib	\
 	--with-firmware-path=/lib/firmware	\

package/eudev/eudev.mk EUDEV_CONF_ENV += LIBS=-lrt · line 35

Quoted 10 lines
package/eudev/eudev.mk +3 -1
 	--disable-introspection			\
-	--enable-split-usr			\
 	--enable-libkmod
 
 EUDEV_DEPENDENCIES = host-gperf host-pkgconf util-linux kmod
 EUDEV_PROVIDES = udev
 
+ifeq ($(BR2_ROOTFS_MERGED_USR),)
+EUDEV_CONF_OPTS += --with-rootlibdir=/lib --enable-split-usr
+endif

It would be nice if someone could do a runtime test with eudev, both the merged
and the split case.

Quoted 5 lines
package/eudev/eudev.mk +1 -0
+
 ifeq ($(BR2_PACKAGE_EUDEV_RULES_GEN),y)
 EUDEV_CONF_OPTS += --enable-rule_generator
 endif
package/skeleton/skeleton.mk +0 -0

[snip]

package/skeleton/skeleton.mk else · line 29

Quoted 9 lines

define SKELETON_INSTALL_TARGET_CMDS

package/skeleton/skeleton.mk +1 -3
 	rsync -a --ignore-times $(SYNC_VCS_EXCLUSIONS) \
 		--chmod=u=rwX,go=rX --exclude .empty --exclude '*~' \
 		$(SKELETON_PATH)/ $(TARGET_DIR)/
-	$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
-		$(TARGET_DIR_WARNING_FILE)
+	$(SKELETON_USR_SYMLINKS_OR_DIRS)
 	ln -snf lib $(TARGET_DIR)/$(LIB_SYMLINK)
-	mkdir -p $(TARGET_DIR)/usr

Huh, where did the mkdir go? Did you remove it because /usr is already in the
skeleton?

package/skeleton/skeleton.mk else · line 44

Quoted 3 lines
package/skeleton/skeleton.mk +2 -0
 	ln -snf lib $(TARGET_DIR)/usr/$(LIB_SYMLINK)
+	$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
+		$(TARGET_DIR_WARNING_FILE)

And why did you move this one around?

Regards,
Arnout

Quoted 3 lines

endef

SKELETON_TARGET_GENERIC_HOSTNAME = $(call qstrip,$(BR2_TARGET_GENERIC_HOSTNAME))

[snip]

Signature · 6 lines
Arnout Vandecappelle                          arnout at mind be
Senior Embedded Software Architect            +32-16-286500
Essensium/Mind                                http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
#2 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

Hello,

Quoted 6 lines · Arnout Vandecappelle

package/eudev/eudev.mk EUDEV_CONF_ENV += LIBS=-lrt · line 35

Quoted 3 lines
package/eudev/eudev.mk +3 -0
+ifeq ($(BR2_ROOTFS_MERGED_USR),)
+EUDEV_CONF_OPTS += --with-rootlibdir=/lib --enable-split-usr
+endif

It would be nice if someone could do a runtime test with eudev, both the merged
and the split case.

I can add some test cases in my testing infrastructure, to test the eudev merged and split cases, and the systemd case. It makes it a lot easier than doing manual testing over and over again when you want to test new iterations of the patches.

Let me know if there is some interest :)

Thanks,

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
#3 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

In reply to Arnout Vandecappelle

Arnout, All,

On 2015-09-05 11:21 +0200, Arnout Vandecappelle spake thusly:

Quoted 17 lines · Yann E. MORIN

[snip]

Quoted 15 lines
package/eudev/eudev.mk +0 -2
index 1aa74b3..a005f45 100644
@@ -22,16 +22,18 @@ EUDEV_CONF_ENV += LIBS=-lrt
 EUDEV_CONF_OPTS =		\
 	--disable-manpages	\
 	--sbindir=/sbin		\
-	--with-rootlibdir=/lib	\
 	--libexecdir=/lib	\
 	--with-firmware-path=/lib/firmware	\
 	--disable-introspection			\
-	--enable-split-usr			\
 	--enable-libkmod
 
Quoted 8 lines

package/eudev/eudev.mk EUDEV_CONF_ENV += LIBS=-lrt · line 35

Quoted 6 lines
package/eudev/eudev.mk +3 -0
 EUDEV_DEPENDENCIES = host-gperf host-pkgconf util-linux kmod
 EUDEV_PROVIDES = udev
 
+ifeq ($(BR2_ROOTFS_MERGED_USR),)
+EUDEV_CONF_OPTS += --with-rootlibdir=/lib --enable-split-usr
+endif

It would be nice if someone could do a runtime test with eudev, both the merged
and the split case.

I did.

The split-usr case is what we have had until now, and it works (I'm using it daily with Kodi).

The merged-usr case I build-tested and slightly runtime-tested in the same conditions (Kodi), and could see no difference in behaviour with the split-usr case.

It's the systemd case that I did not runtime-test (only build-tested).

Quoted 5 lines
Quoted 4 lines
package/eudev/eudev.mk +0 -0
 ifeq ($(BR2_PACKAGE_EUDEV_RULES_GEN),y)
 EUDEV_CONF_OPTS += --enable-rule_generator
 endif
package/skeleton/skeleton.mk +0 -0

[snip]

Quoted 11 lines

package/skeleton/skeleton.mk else · line 29

Quoted 9 lines

define SKELETON_INSTALL_TARGET_CMDS

package/skeleton/skeleton.mk +1 -3
 	rsync -a --ignore-times $(SYNC_VCS_EXCLUSIONS) \
 		--chmod=u=rwX,go=rX --exclude .empty --exclude '*~' \
 		$(SKELETON_PATH)/ $(TARGET_DIR)/
-	$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
-		$(TARGET_DIR_WARNING_FILE)
+	$(SKELETON_USR_SYMLINKS_OR_DIRS)
 	ln -snf lib $(TARGET_DIR)/$(LIB_SYMLINK)
-	mkdir -p $(TARGET_DIR)/usr

Huh, where did the mkdir go? Did you remove it because /usr is already in the
skeleton?

Yes, it's not needed because we indeed already have it in the skeleton. I should probably have said so in the commit log, indeed.

Quoted 4 lines

package/skeleton/skeleton.mk else · line 44

Quoted 3 lines
package/skeleton/skeleton.mk +2 -0
 	ln -snf lib $(TARGET_DIR)/usr/$(LIB_SYMLINK)
+	$(INSTALL) -m 0644 support/misc/target-dir-warning.txt \
+		$(TARGET_DIR_WARNING_FILE)

And why did you move this one around?

IMHO, it makes more sense to add it last, after the skeleton has been entirely constructed. Granted, it's mostly eye-candy, still I find it much nicer to look at this code now than as it was before.

Regards,
Yann E. MORIN.

Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#4 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

In reply to Yann E. MORIN

Yann,

Quoted 4 lines · Yann E. MORIN

systemd is increasingly expecting things to live in /usr/bin, /usr/sbin or /usr/lib nad not in /bin, /sbin or /lib. It has inherited those expectations from a Fedora change:
https://fedoraproject.org/wiki/Features/UsrMove

I'm out on vacation, but I'll be back at work on Monday and will test the latest revision then.

Thanks,
Mike

#6 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

Mike, All,

On 2015-09-14 14:02 -0400, Mike Williams spake thusly:

Quoted 1 line

Works for me, feel free to add my:

Your tested-by tag will be picked up automatically when a maintainer applies the patch.

Quoted 1 line

Thanks for testing! :-)

Regards,
Yann E. MORIN.

Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#7 lore raw

PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr

In reply to Yann E. MORIN

Dear Yann E. MORIN,

Quoted 44 lines · Yann E. MORIN

systemd is increasingly expecting things to live in /usr/bin, /usr/sbin or /usr/lib nad not in /bin, /sbin or /lib. It has inherited those expectations from a Fedora change:
https://fedoraproject.org/wiki/Features/UsrMove

Note however, that systemd does support /usr being on a separate filesystem; it just expects an initramfs to mount it before the final switchroot over to the actual rootfs.

But the traditional use-case for Buildroot is not to boot with an initramfs; although that is totally feasible, that's probably not what is commonly done in the vast majority of cases.

However, a lot of packages still install stuff directly into /bin, /sbin or /lib, which systemd may need early-on in the boot process, even before it may have a chance to mount /usr. Even though we can tell systemd, at configure-time, where it should expect programs to be at runtime, it does not make sense to go head-first against an upstream wa^Hill.

Add an option so that /bin, /sbin and /lib be symlinks to /usr/bin and /usr/sbin. That option is forcibly enabled when the init system is systemd.

Note: we need not handle /lib32 or /lib64, as they already are symlinks to /lib, which means they will automatically be redirected to /usr/lib, as /usr/lib32 and /usr/lib64 already are.

Furthermore, this means we're no longer supporting a split-usr setup, so the corresponding configure options have been removed as well for systemd and, when using a merged /usr, for eudev as well.

In Buildroot, we decided (with this patch) 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 rather than with BR2_PACKAGE_SYSTEMD.

Cc Thomas Petazzoni <[email protected]>
Cc Arnout Vandecappelle <[email protected]>
Cc Mike Williams <[email protected]>
Cc Vicente Olivert Riera <[email protected]>
Cc Baruch Siach <[email protected]>
Quoted 6 lines

---
Changes v2 -> v3:
- only conditionally drop the split-usr options for eudev (Vicente)
- add this missing history log (Vicente)
- add a rationale on why this is the init system that selects merged-usr, not the package (Arnout).

Applied, thanks.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com