system: add options for /bin /sbin and /lib to be symlinks into /usr
authorYann E. MORIN <yann.morin.1998@free.fr>
Fri, 4 Sep 2015 20:17:32 +0000 (22:17 +0200)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Wed, 14 Oct 2015 20:50:03 +0000 (22:50 +0200)
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.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Mike Williams <mike@mikebwilliams.com>
Cc: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
Cc: Baruch Siach <baruch@tkos.co.il>
Tested-by: Mike Williams <mike@mikebwilliams.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/eudev/eudev.mk
package/skeleton/skeleton.mk
package/systemd/systemd.mk
system/Config.in
system/skeleton/bin/.empty [deleted file]
system/skeleton/lib/.empty [deleted file]
system/skeleton/sbin/.empty [deleted file]

index 1aa74b37381cd5dd8e1240d77213ba9238b85499..a005f45de54a15dc3c14ede8ab59003f3508d0b3 100644 (file)
@@ -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
index 48e708515d669a7eba266e5b1a7a2876b6584abf..920d3b42d3eaaeb905883bd5e3bedce391a0569a 100644 (file)
@@ -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))
index 6b9ce3fe2defd1b692aafea41f79be2d53363eef..2e974fa3b3d29c0c847f947344b089cfd8aed72c 100644 (file)
@@ -27,7 +27,6 @@ endif
 
 SYSTEMD_CONF_OPTS += \
        --with-rootprefix= \
-       --with-rootlibdir=/lib \
        --enable-static=no \
        --disable-manpages \
        --disable-selinux \
@@ -36,7 +35,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 \
index 6afe8962da37ffba1b8557f2046c0b5a8dded5cc..4d070103fd91cf90a78d32fb78ce24baad499881 100644 (file)
@@ -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 (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
diff --git a/system/skeleton/bin/.empty b/system/skeleton/bin/.empty
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/system/skeleton/lib/.empty b/system/skeleton/lib/.empty
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/system/skeleton/sbin/.empty b/system/skeleton/sbin/.empty
deleted file mode 100644 (file)
index e69de29..0000000