Johannes Schauer Marin Rodrigues
337cc7237d
- implements the same as debootstrap in https://salsa.debian.org/installer-team/debootstrap/-/merge_requests/71 - builds a temporary usr-is-merged package and upgrades to the real one - create merged-/usr chroots for unstable and testing (which will become Debian 12 Bookworm) - add a dedicated merged-/usr section to the manual page
111 lines
4.3 KiB
Bash
Executable file
111 lines
4.3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# mmdebstrap does have a --merged-usr option but only as a no-op for
|
|
# debootstrap compatibility
|
|
#
|
|
# Using this hook script, you can emulate what debootstrap does to set up
|
|
# merged /usr via directory symlinks, even using the exact same shell function
|
|
# that debootstrap uses by running mmdebstrap with:
|
|
#
|
|
# --setup-hook=/usr/share/mmdebstrap/hooks/merged-usr/setup00.sh
|
|
#
|
|
# Alternatively, you can setup merged-/usr by installing the usrmerge package:
|
|
#
|
|
# --include=usrmerge
|
|
#
|
|
# mmdebstrap will not include this functionality via a --merged-usr option
|
|
# because there are many reasons against implementing merged-/usr that way:
|
|
#
|
|
# https://wiki.debian.org/Teams/Dpkg/MergedUsr
|
|
# https://wiki.debian.org/Teams/Dpkg/FAQ#Q:_Does_dpkg_support_merged-.2Fusr-via-aliased-dirs.3F
|
|
# https://lists.debian.org/20190219044924.GB21901@gaara.hadrons.org
|
|
# https://lists.debian.org/YAkLOMIocggdprSQ@thunder.hadrons.org
|
|
# https://lists.debian.org/20181223030614.GA8788@gaara.hadrons.org
|
|
#
|
|
# In addition, the merged-/usr-via-aliased-dirs approach violates an important
|
|
# principle of component based software engineering one of the core design
|
|
# ideas/goals of mmdebstrap: All the information to create a chroot of a Debian
|
|
# based distribution should be included in its packages and their metadata.
|
|
# Using directory symlinks as used by debootstrap contradicts this principle.
|
|
# The information whether a distribution uses this approach to merged-/usr or
|
|
# not is not anymore contained in its packages but in a tool from the outside.
|
|
#
|
|
# Example real world problem: I'm using debbisect to bisect Debian unstable
|
|
# between 2015 and today. For which snapshot.d.o timestamp should a merged-/usr
|
|
# chroot be created and for which ones not?
|
|
#
|
|
# The problem is not the idea of merged-/usr but the problem is the way how it
|
|
# got implemented in debootstrap via directory symlinks. That way of rolling
|
|
# out merged-/usr is bad from the dpkg point-of-view and completely opposite of
|
|
# the vision with which in mind I wrote mmdebstrap.
|
|
|
|
set -eu
|
|
|
|
if [ "$MMDEBSTRAP_VERBOSITY" -ge 3 ]; then
|
|
set -x
|
|
fi
|
|
|
|
TARGET="$1"
|
|
|
|
ARCH=$(dpkg --print-architecture)
|
|
eval "$(APT_CONFIG="$MMDEBSTRAP_APT_CONFIG" apt-config shell ARCH Apt::Architecture)"
|
|
|
|
if [ -e /usr/share/debootstrap/functions ]; then
|
|
. /usr/share/debootstrap/functions
|
|
doing_variant () { [ $1 != "buildd" ]; }
|
|
MERGED_USR="yes"
|
|
setup_merged_usr
|
|
else
|
|
link_dir=""
|
|
case $ARCH in
|
|
hurd-*) exit 0;;
|
|
amd64) link_dir="lib32 lib64 libx32" ;;
|
|
i386) link_dir="lib64 libx32" ;;
|
|
mips|mipsel) link_dir="lib32 lib64" ;;
|
|
mips64*|mipsn32*) link_dir="lib32 lib64 libo32" ;;
|
|
powerpc) link_dir="lib64" ;;
|
|
ppc64) link_dir="lib32 lib64" ;;
|
|
ppc64el) link_dir="lib64" ;;
|
|
s390x) link_dir="lib32" ;;
|
|
sparc) link_dir="lib64" ;;
|
|
sparc64) link_dir="lib32 lib64" ;;
|
|
x32) link_dir="lib32 lib64 libx32" ;;
|
|
esac
|
|
link_dir="bin sbin lib $link_dir"
|
|
|
|
for dir in $link_dir; do
|
|
ln -s usr/"$dir" "$TARGET/$dir"
|
|
mkdir -p "$TARGET/usr/$dir"
|
|
done
|
|
fi
|
|
|
|
# now install an empty "usr-is-merged" package to avoid installing the
|
|
# usrmerge package on this system even after init-system-helpers starts
|
|
# depending on "usrmerge | usr-is-merged".
|
|
#
|
|
# This package will not end up in the final chroot because the essential
|
|
# hook replaces it with the actual usr-is-merged package from src:usrmerge.
|
|
|
|
tmpdir=$(mktemp --directory --tmpdir="$TARGET/tmp")
|
|
mkdir -p "$tmpdir/usr-is-merged/DEBIAN"
|
|
|
|
cat << END > "$tmpdir/usr-is-merged/DEBIAN/control"
|
|
Package: usr-is-merged
|
|
Priority: optional
|
|
Section: oldlibs
|
|
Maintainer: Johannes Schauer Marin Rodrigues <josch@debian.org>
|
|
Architecture: all
|
|
Multi-Arch: foreign
|
|
Source: mmdebstrap-dummy-usr-is-merged
|
|
Version: 1
|
|
Description: dummy package created by mmdebstrap merged-usr setup hook
|
|
This package was generated and installed by the mmdebstrap merged-usr
|
|
setup hook at /usr/share/mmdebstrap/hooks/merged-usr.
|
|
.
|
|
If this package is installed in the final chroot, then this is a bug
|
|
in mmdebstrap. Please report: https://gitlab.mister-muffin.de/josch/mmdebstrap
|
|
END
|
|
dpkg-deb --build "$tmpdir/usr-is-merged" "$tmpdir/usr-is-merged.deb"
|
|
dpkg --root="$TARGET" --log="$TARGET/var/log/dpkg.log" --install "$tmpdir/usr-is-merged.deb"
|
|
rm "$tmpdir/usr-is-merged.deb" "$tmpdir/usr-is-merged/DEBIAN/control"
|
|
rmdir "$tmpdir/usr-is-merged/DEBIAN" "$tmpdir/usr-is-merged" "$tmpdir"
|