[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#994388: tech-ctte: More specific advice regarding merged-/usr and implications of #978636



I'm calling for votes on the following resolution as formal advice from
the Technical Committee (Constitution §6.1.5). There are no non-accepted
amendments, so the options to vote on are "yes" or "further discussion".

~~~~ begin text to be voted on ~~~~

Summary
=======

There are currently Debian 11 installations with both the merged-/usr and
non-merged-/usr filesystem layouts. All of these installations should
successfully upgrade via normal upgrade paths to a merged-/usr Debian 12.
Only after the release of Debian 12 can packages assume that all
installations will be merged-/usr.

Main points:

- We have recommended merged-/usr for Debian 12.
- Moving individual files is not merged-/usr.
- "Symlink farms" are not merged-/usr.
- Upgrading a non-merged-/usr system to Debian 12 needs to work.
- Upgrading a merged-/usr system to Debian 12 needs to work.
- Packages cannot assume all systems are merged-/usr until the Debian 13
  development cycle begins.
- Upgrading via apt in the usual way should work.
- Testing and QA systems should be able to avoid this transition, but if
  they do, they cannot be upgraded beyond Debian 12.
- A package building incorrectly on a non-merged-/usr system is a bug.
- A package building incorrectly on a merged-/usr system is a bug.
- Please stop moving individual packages' files from the root filesystem
  into /usr, at least for now.

Definitions and current status
==============================

libQUAL refers to the directories described in FHS 3.0 section 3.10 [1],
such as lib64 on the amd64 architecture.

Merged /usr is the filesystem layout in which /bin, /sbin, /lib and each
/libQUAL that exists are symbolic links to the corresponding directories
below /usr. This results in aliasing between /bin and /usr/bin, and
so on.

In the merged-/usr layout, files whose canonical logical location is
in one of the affected directories on the root filesystem, such as
/bin/bash, /sbin/fsck and /lib/ld-linux.so.2, are physically located at
the corresponding path below /usr, such as /usr/bin/bash. Each file in
one of the affected directories is accessible via two paths: its canonical
logical location (such as /bin/bash or /usr/bin/env), and the other path
implied by the aliasing (such as /usr/bin/bash or /bin/env).

There are two supported categories of Debian 11 installation, which are
currently considered equally-supported:

- Merged-/usr installations. These were installed with debian-installer
  from Debian 10 or later, or installed with debootstrap --merged-usr,
  or converted from the non-merged-/usr layout by installing the usrmerge
  package, or installed or converted by any similar procedure. They have
  the merged-/usr layout.

- Non-merged-/usr installations. These were installed with debian-installer
  from Debian 9 or earlier and subsequently upgraded without converting
  to merged-/usr, or installed with debootstrap --no-merged-usr, or
  converted from the merged-/usr layout with dpkg's "dpkg-fsys-usrunmess"
  utility or any similar procedure. They have the traditional,
  non-merged-/usr layout in which /bin/bash and /usr/bin/env have exactly
  those physical paths, and /usr/bin/bash and /bin/env do not exist.

Merged-/usr is not the only filesystem layout that has been proposed for
unifying the root filesystem with /usr. For avoidance of doubt, we do not
consider other filesystem layouts to be implementations of merged-/usr.
In particular, we do not consider these to be implementations of merged-/usr:

- all affected files physically located in /bin, /sbin, /lib and /libQUAL,
  with /usr/bin as a symlink to /bin, etc. (this is the reverse of
  merged-/usr, and was historically used in the hurd-i386 port)

- a "symlink farm" in each of /bin, /sbin, /lib, /libQUAL with individual
  symbolic links such as /bin/bash -> /usr/bin/bash for only those files that
  historically had their canonical logical location on the root filesystem

- a "symlink farm" in each of /bin, /sbin, /lib, /libQUAL with individual
  symbolic links such as /bin/env -> /usr/bin/env for all files in the
  affected directories, regardless of whether they historically had
  their canonical logical location on the root filesystem

[1]: https://www.debian.org/doc/packaging-manuals/fhs/fhs-3.0.html#libltqualgtAlternateFormatEssential

Upgrade path from Debian 11 to Debian 12
========================================

The technical committee resolved in #978636 [2] that Debian 12 'bookworm'
should only support the merged-/usr layout. This resolution describes
the implications of that decision in more detail.

Debian installations have traditionally had a straightforward upgrade
path between consecutive releases, and the technical committee expects
maintainers to continue this. In the case of #978636, the upgrades we
are interested in are:

- Upgrading from Debian 11 (stable release) to Debian 12 (stable release)

- Upgrading from Debian 11 (stable release) to testing/unstable during the
  development cycle that will lead to Debian 12, and subsequently upgrading
  from testing/unstable to Debian 12 (stable release)

What we understand this to imply is as follows:

- Because Debian 11 installations with the merged-/usr layout already
  exist, and because Debian 12 should only support the merged-/usr layout,
  all packages in Debian 12 should be installable onto a merged-/usr system
  along with their dependencies, and work correctly on the resulting system.

- Because Debian 11 installations with the non-merged-/usr layout already
  exist, all packages in Debian 12 should be installable onto a non-merged-/usr
  system along with their dependencies, and work correctly on the resulting
  system.

    + The key reason for this is that apt is not required to perform the
      upgrade between stable releases in any particular order, so long
      as package dependency relationships are respected; therefore the
      upgrade can happen in whatever order apt chooses, which can vary
      between machines. Debian has not traditionally required use of a
      special upgrade tool similar to Ubuntu's do-release-upgrade(8) and
      we believe the upgrade to Debian 12 should be no different (see
      below for more details on this topic).

    + Another reason for this is that during the development of Debian 12,
      testing/unstable systems undergo a series of partial upgrades, which
      similarly will happen in an undefined order.

    + We do not require that the resulting system remains non-merged-/usr:
      if the packages involved in this installation transaction are part of
      the implementation of a transition to merged-/usr, then installing them
      might result in the system becoming merged-/usr.

- The same expectations apply to packages uploaded to testing/unstable
  during the development cycle that will lead to Debian 12.

- Debian contributors who are interested in merged-/usr are invited to
  implement a straightforward migration path from non-merged-/usr to
  merged-/usr. The Technical Committee will not design this migration path
  in detail. If disputes arise related to this migration path, or if
  advice on this migration path is requested, we will resolve those by
  following our usual procedures.

    + One example of a migration path that might be used is for an Essential
      package to add a dependency on the usrmerge package, so that it will
      be installed automatically during upgrades. We do not require this to
      be the migration path that is chosen; it is presented here merely to
      demonstrate that such a migration path can exist.

- After Debian 12 is released, the transition to merged-/usr is considered
  to be complete. Because we do not support "skipping a release" when
  upgrading systems, new packages uploaded to testing/unstable during the
  development cycle that will lead to Debian 13 may assume and require
  that the system onto which they are installed is merged-/usr.

If a suitable transition mechanism is not available by the time the
Debian 12 freeze is reached, the Technical Committee will rescind our
advice in #978636 and modify our advice in this resolution to reflect
the situation that has been reached. We hope that this will not be necessary.

[2] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=978636

Use of a special upgrade path
=============================

Some developers have argued that we should deploy merged /usr by means of
a special upgrade path, with all other upgrade paths being declared to be
unsupported. Some examples of special upgrade paths that might be proposed:

- upgrading dpkg before carrying out the rest of the upgrade

- installing the usrmerge package before carrying out the upgrade

- using a special tool similar to Ubuntu's do-release-upgrade(8) which
  encapsulates whatever steps are necessary

This would imply that upgrade paths other than the recommended one are not
expected to work.

We are aware that many Debian users do not read the release notes before
upgrading from oldstable to stable, and will expect to be able to upgrade
via whatever apt commands they are used to using, regardless of whether
the release notes recommend something different. Given that there are
alternatives available, we do not think that merged-/usr is sufficiently
good cause to interfere with this.

During the Debian 12 development cycle, users of testing/unstable will also
need an upgrade path from Debian 11 to testing/unstable, or from older to
newer snapshots of testing/unstable. In general this will be done using
apt, and it needs to continue to work if at all possible, even before a
special upgrade tool has been prepared; introducing a "flag day" at which
all testing/unstable users are expected to carry out additional
non-automatic upgrade steps would be disruptive, and in practice many
testing/unstable users are likely to skip those steps.

For these reasons, we make the simple, conservative recommendation that a
special upgrade path should not be required, and upgrading via apt in
approximately the same way as previous Debian releases should continue to work
in general.

Testing and QA
==============

We anticipate that during the development cycle that will lead to Debian 12,
it is likely to be useful for testing and QA infrastructure (such as
autopkgtest, piuparts and/or reproducible-builds) to be able to produce
an installation of Debian testing/unstable that is not merged-/usr,
in order to be able to verify that packages targeted for inclusion in
Debian 12 can still be installed and/or built successfully in a
non-merged-/usr environment during partial upgrades.

As a result, we recommend that if there is an automatic migration from
non-merged-/usr to merged-/usr, it should be possible to prevent that
migration. However, systems where that migration has been prevented are
not required to be fully-supported, and in particular, upgrading them
to Debian 13 or to the state of testing/unstable during development of
Debian 13 should be considered unsupported.

Building packages
=================

In #914897 [3] the Technical Committee resolved that for Debian 11, packages
can validly be built in either a merged-/usr or non-merged-/usr environment.
We understand this to imply that packages built in either a merged-/usr or
non-merged-/usr environment should work as intended in either a merged-/usr
or non-merged-/usr environment.

There is a class of bugs in which a package embeds the absolute path to
some executable or other file, in such a way that if it is built in an
environment with a unified /usr (either via merged-/usr or symlink farms),
this can result in embedding a non-canonical path such as /usr/bin/sh or
/bin/env which will not work correctly in a non-merged-/usr environment.
The Technical Committee reminds maintainers that packages in Debian
12 are expected to work correctly in a non-merged-/usr environment,
and therefore this class of bugs needs to be resolved. As a result, we
recommend that these bugs should generally be treated as release-critical
for Debian 12 by maintainers and the release team.

The Reproducible Builds effort tracks this class of bugs as
"paths_vary_due_to_usrmerge" [4] and many bugs in this class are
tracked with the usertag "usrmerge" [5]. In Autotools-based
build systems, they can often be avoided by passing arguments such as
`SED=/bin/sed` to the configure script.

Note that although the name of the usertag mentions usrmerge, this class
of bugs is not specific to the usrmerge package, and not completely specific
to merged-/usr; many of these bugs would also manifest if unified /usr was
achieved via symlink farms, or if a local executable such as
/usr/local/bin/sed existed on the build system.

#993675 [6] is a typical example of this class of bugs.

[3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=914897
[4]: https://tests.reproducible-builds.org/debian/issues/unstable/paths_vary_due_to_usrmerge_issue.html
[5]: https://udd.debian.org/cgi-bin/bts-usertags.cgi?user=reproducible-builds%40lists.alioth.debian.org&tag=usrmerge
[6]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=993675

Moratorium on moving files' logical locations into /usr
=======================================================

In the past, some package maintainers have taken advantage of the
fact that /usr is now required to be mounted during early boot
(since Debian 9) to move individual files from the root filesystem
to /usr. Examples of this being done during previous development cycles
include the libglib-2.0.so.0 and libgcrypt.so.20 shared libraries,
and the command-line utilities in the iptables package.

The Technical Committee recommends that during the Debian 12 development
cycle, the maintainers of individual packages should not proactively move
files from the root filesystem to the corresponding locations in /usr in
the data.tar.* of packages. Files that were in /usr in the Debian 11
release should remain in /usr, while files that were in /bin, /lib* or
/sbin in the Debian 11 release should remain in those directories.
If files were moved from /bin, /lib* or /sbin into /usr since the
Debian 11 release, they should be moved back to their Debian 11
locations.

Similarly, during the Debian 12 development cycle, we recommend that
maintainers of tools such as debhelper should not move files from the
root filesystem into /usr.

For example, debhelper 13.4 started moving systemd units from /lib/systemd
into /usr/lib/systemd, but this was subsequently reverted in 13.5.2. We
consider the revert that was done in 13.5.2 to have been an appropriate
course of action.

We issue this recommendation for several reasons:

- The transition to merged-/usr will make the logical locations of these
  files irrelevant to their physical locations.

- The transitional mechanisms necessary to prevent such moves from breaking
  other packages that hard-code specific paths are error-prone, and can
  themselves interfere with the transition to merged-/usr.

- After the transition to merged-/usr has completed, during the Debian 13
  development cycle, we expect that maintainers will be able to move these
  files without needing transitional mechanisms.

- On merged-/usr systems, there is a possible failure mode involving files
  being moved between packages (with Replaces) during the same release
  cycle that their logical location is changed from the root filesystem
  to the corresponding aliased directory in /usr, which can result in
  the affected file disappearing. This can be avoided by not changing
  the file's logical location until the beginning of the Debian 13
  development cycle, after the transition to merged-/usr is complete.

- On non-merged-/usr systems, a failure mode has been observed in which
  older shared libraries in /lib/MULTIARCH are not always deleted as
  intended, and interfere with correct loading of the newer shared
  library in /usr/lib/MULTIARCH. This can be avoided by not changing
  the file's logical location until the beginning of the Debian 13
  development cycle, after the transition to merged-/usr is complete,
  at which point ldconfig(8) will choose the newer library even if
  this occurs.

This recommendation applies until Debian 12 is released, or until
a subsequent Technical Committee resolution rescinds it, whichever
is sooner. We intend to rescind this recommendation if mechanisms are
developed to avoid the undesired side-effects of moving files from the
root filesystem into /usr.

~~~~ end text to be voted on ~~~~

Attachment: signature.asc
Description: PGP signature


Reply to: