Package: base-files Version: 13 Tags: patch moreinfo X-Debbugs-Cc: juli...@debian.org
Do not upload this patch to unstable yet! Hi, We are about to finalize the /usr-merge transition by moving all files to their physical location. In the process, we want to move the actual aliasing symbolic links from debootstrap/usrmerge into an actual data.tar. The ideal package for this seems to be base-files. I've prepared a patch for doing this. I'll explain some of the choices made in the patch now as they may be non-obvious. * We're installing the aliasing symlinks as relative links despite lintian complaining about this. The links that usrmerge and debootstrap install are also relative and relative links make working with chroots more convenient. * base-files will "Provides: usr-is-merged". Future installations will contain neither usrmerge nor a physical usr-is-merged package. * base-files will install multilib directories when the dynamic loader needs them. For instance on amd64, the dynamic loader path is /lib64/ld-linux-x86-64.so.2. Therefore base-files:amd64 will include /lib64. All other multilib directories will not be installed to data.tar. * For all non-essential multilib directoires, base-files declares a trigger interest in the physical location and adds/removes the aliasing symlink as-needed. This way, we do not have all of lib32, lib64, libo32 and libx32 on every Debian installation. * The patch proposed to glibc relies on these triggers to create these multilib links for their multilib packages. If we change this aspect, we must also change the glibc patch #1061248. * base-files.preinst will now validate the aliasing symlinks as usr-is-merged did. In a bootstrap setting, base-files is unpacked before base-files.preinst and in an upgrade scenario we should be merged already. This patch needs to be uploaded concurrently with bash, dash, glibc and util-linux failing to do so will break bootstrapping tools. I intend to NMU this patch at an appropriate and coordinated time. I'm happy to receive feedback on it already. This mail is interesting to Julian, because he'll do the same changes to Ubuntu just earlier than Debian. We're in the glad position that Ubuntu will test this for us. Helmut
--- a/debian/base-files.dirs +++ b/debian/base-files.dirs @@ -1,4 +1,3 @@ -bin boot dev etc @@ -8,19 +7,14 @@ etc/skel etc/update-motd.d home -lib proc root run -sbin sys tmp usr -usr/bin usr/games usr/include -usr/lib -usr/sbin usr/share usr/share/base-files usr/share/common-licenses --- a/debian/base-files.lintian-overrides +++ b/debian/base-files.lintian-overrides base-files: extra-license-file [usr/share/common-licenses/LGPL-2] base-files: extra-license-file [usr/share/common-licenses/LGPL-2.1] base-files: extra-license-file [usr/share/common-licenses/LGPL-3] + +# Yes, these links really should be relative +base-files: relative-symlink usr/bin [bin] +base-files: relative-symlink usr/lib [lib] +base-files: relative-symlink usr/lib64 [lib64] +base-files: relative-symlink usr/libx32 [libx32] +base-files: relative-symlink usr/sbin [sbin] --- a/debian/clean +++ b/debian/clean @@ -1 +1,2 @@ debian/postinst +debian/triggers --- a/debian/control +++ b/debian/control @@ -7,7 +7,7 @@ Rules-Requires-Root: binary-targets Package: base-files -Provides: base +Provides: base, usr-is-merged Architecture: any Pre-Depends: awk Depends: ${misc:Depends} --- a/debian/postinst.in +++ b/debian/postinst.in @@ -106,3 +106,15 @@ install_directory mnt 755 root fi fi + +if [ "$1" = triggered ]; then + for d in lib32 lib64 libo32 libx32; do + if test -d "$DPKG_ROOT/usr/$d"; then + test -h "$DPKG_ROOT/$d" && continue + ln -s "usr/$d" "$DPKG_ROOT/$d" + else + test -h "$DPKG_ROOT/$d" || continue + rm "$DPKG_ROOT/$d" + fi + done +fi --- a/debian/postrm +++ b/debian/postrm @@ -0,0 +1,13 @@ +#!/bin/sh +set -e + +USR_MERGE="bin lib lib32 lib64 libo32 lib64 sbin" + +if [ "$1" = remove ]; then + for d in $USR_MERGE; do + # Remove DEP17 M4 protective diversions + dpkg-divert --quiet --package base-files --remove --no-rename --divert /$d.usr-is-merged /$d + done +fi + +#DEBHELPER# --- a/debian/preinst +++ b/debian/preinst @@ -0,0 +1,34 @@ +#!/bin/sh +set -e + +USR_MERGE="bin lib lib32 lib64 libo32 lib64 sbin" + +if [ "$1" = install ] || [ "$1" = upgrade ]; then + for d in $USR_MERGE; do + if [ -d "$DPKG_ROOT/$d" ] && ! [ -h "$DPKG_ROOT/$d" ]; then + cat <<EOF + + +****************************************************************************** +* +* The base-files package cannot be installed because this system has a +* split /usr. +* +* Please install the usrmerge package to convert this system to merged-/usr. +* +* For more information please read https://wiki.debian.org/UsrMerge. +* +****************************************************************************** + + +EOF + exit 1 + fi + done + for d in $USR_MERGE; do + # Install DEP17 M4 protective diversions + dpkg-divert --quiet --package base-files --add --no-rename --divert /$d.usr-is-merged /$d + done +fi + +#DEBHELPER# --- a/debian/rules +++ b/debian/rules @@ -1,5 +1,7 @@ #!/usr/bin/make -f +include /usr/share/dpkg/architecture.mk + OSNAME = "GNU/`uname | sed -e 's/GNU\///'`" ifeq ($(DEB_HOST_GNU_SYSTEM),linux) OSNAME=GNU/Linux @@ -11,12 +13,28 @@ VENDORFILE = debian DESTDIR = debian/base-files +USR_MERGE = bin lib sbin +ifneq (,$(filter $(DEB_HOST_ARCH),amd64 loong64 mips64el ppc64 ppc64el sparc64)) +USR_MERGE += lib64 +else ifneq (,$(filter $(DEB_HOST_ARCH),x32)) +USR_MERGE += libx32 +endif + %: dh $@ override_dh_auto_build: sh debian/check-md5sum-etc profile sed -e "s/#VENDORFILE#/$(VENDORFILE)/g" debian/postinst.in > debian/postinst + set -e; { \ + echo "# Triggers for creating multilib aliasing symlinks on demand"; \ + for d in $(foreach d,lib32 lib64 libo32 libx32,$(if $(filter $(d),$(USR_MERGE)),,$(d))); do \ + echo "interest-noawait $$d"; \ + done; \ + } > debian/triggers + +execute_after_dh_installdirs: + dh_installdirs $(foreach d,$(USR_MERGE),usr/$(d)) override_dh_auto_install: install -p -m 644 etc/* $(DESTDIR)/etc @@ -40,6 +58,8 @@ override_dh_link: dh_link -X os-release + # We want these links to be relative, so we cannot use dh_link. + $(foreach d,$(USR_MERGE),ln -s usr/$(d) debian/base-files/$(d) &&) : override_dh_compress: dh_compress -X README