system: add options for /bin /sbin and /lib to be symlinks into /usr
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.
---
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
@@ -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
@@ -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
@@ -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
@@ -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
system/skeleton/lib/.empty deleted +0 -0
system/skeleton/sbin/.empty deleted +0 -0
Signature · 1 line
1.9.1
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@@ -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 endifpackage/skeleton/skeleton.mk +0
-0
[snip]
package/skeleton/skeleton.mk else · line 29
Quoted 9 lines
define
SKELETON_INSTALL_TARGET_CMDSpackage/skeleton/skeleton.mk +1
-3rsync -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
-0ln -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
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 +endifIt 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
PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr
In reply to Arnout VandecappelleArnout, 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@@ -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
-0EUDEV_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 +endifIt 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
-0ifeq ($(BR2_PACKAGE_EUDEV_RULES_GEN),y) EUDEV_CONF_OPTS += --enable-rule_generator endifpackage/skeleton/skeleton.mk +0
-0[snip]
Quoted 11 lines
package/skeleton/skeleton.mk else · line 29
Quoted 9 lines
define
SKELETON_INSTALL_TARGET_CMDSpackage/skeleton/skeleton.mk +1
-3rsync -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)/usrHuh, 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
-0ln -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. | '------------------------------^-------^------------------^--------------------'
PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr
In reply to Yann E. MORINYann,
Quoted 4 lines · Yann E. MORIN
systemd is increasingly expecting things to live in
/usr/bin,/usr/sbinor/usr/libnad 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
PATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr
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
Tested-by Mike Williams <[email protected]>
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. | '------------------------------^-------^------------------^--------------------'
Thomas Petazzoni
AppliedPATCH v3 1/1 system: add options for /bin /sbin and /lib to be symlinks into /usr
In reply to Yann E. MORINDear Yann E. MORIN,
Quoted 44 lines · Yann E. MORIN
systemd is increasingly expecting things to live in
/usr/bin,/usr/sbinor/usr/libnad not in /bin, /sbin or /lib. It has inherited those expectations from a Fedora change:
https://fedoraproject.org/wiki/Features/UsrMoveNote 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/binand/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/lib32and/usr/lib64already 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_SYSTEMDrather than withBR2_PACKAGE_SYSTEMD.Signed-off-by "Yann E. MORIN" <[email protected]>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