Hi,

* Johannes Schauer Marin Rodrigues [Wed Jun 14, 2023 at 07:09:35PM +0200]:
> Quoting Michael Prokop (2023-06-14 17:19:37)
> > since version 1.20.0, dpkg no longer creates /var/lib/dpkg/available (see
> > #647911).
> 
> I see that the bug talks about 1.20.0 but I've had code creating
> /var/lib/dpkg/available in mmdebstrap for a while and determined that it 
> wasn't
> necessary anymore since dpkg 1.17.11. Did you do practical tests or are you
> only basing your analysis on that bug?

This showed up in an actual environment, where we automatically
deploy systems on a daily base. The deployment of a buster based
system failed as soon as we upgraded the host system (a Grml based
live system) to bookworm, which provides dpkg v1.21.22 and
mmdebstrap v1.3.5-7. (Deploying bullseye where dpkg v1.20.12 exists
works fine, FTR)

> I'm quite certain about the version requirement because I did tests using
> debbisect and using the suggestion below I'm able to create chroots for all of
> unstable since 2006-08-10.

mmdebstrap itself does *not* fail, but the installation of e.g. the
`nullmailer` package inside the target buster environment then fails:

| Error: Execution of '/usr/bin/apt-get -q -y -o 
DPkg::Options::=--force-confold install nullmailer' returned 100: Reading 
package lists...
| Building dependency tree...
| Reading state information...
| The following packages were automatically installed and are no longer 
required:
|   libevent-2.1-6 libgnutls-dane0 libunbound8
| Use 'apt autoremove' to remove them.
| The following packages will be REMOVED:
|   exim4-base exim4-config exim4-daemon-light
| The following NEW packages will be installed:
|   nullmailer
| 0 upgraded, 1 newly installed, 3 to remove and 0 not upgraded.
| Need to get 109 kB of archives.
| After this operation, 3560 kB disk space will be freed.
| [...]
| [master dbda30d] saving uncommitted changes in /etc prior to apt run
|  6 files changed, 115 insertions(+), 575 deletions(-)
|  rewrite locale.gen (99%)
|  create mode 100644 needrestart/conf.d/ignore.conf
| debconf: delaying package configuration, since apt-utils is not installed
| dpkg: error: failed to open package info file '/var/lib/dpkg/available' for 
reading: No such file or directory
| Fetched 109 kB in 0s (542 kB/s)
| E: Sub-process dpkg --set-selections returned an error code (2)
| E: Couldn't record the approved state changes as dpkg selection states[0m

(FTR, this is part of an automated puppet run)

I can manually reproduce the problem with:

| # mmdebstrap buster /tmp/buster
| [...]
| # chroot /tmp/buster apt update
| [...]
| # chroot /tmp/buster apt install nullmailer
| [...]
| # chroot /tmp/buster apt purge nullmailer
| [...]
| perl: warning: Falling back to the standard locale ("C").
| locale: Cannot set LC_CTYPE to default locale: No such file or directory
| locale: Cannot set LC_MESSAGES to default locale: No such file or directory
| locale: Cannot set LC_ALL to default locale: No such file or directory
| dpkg: error: failed to open package info file '/var/lib/dpkg/available' for 
reading: No such file or directory
| E: Sub-process dpkg --set-selections returned an error code (2)
| E: Couldn't record the approved state changes as dpkg selection states

> > But on Debian releases until and including buster, dpkg fails to operate 
> > with
> > e.g. `dpkg --set-selections`, if /var/lib/dpkg/available doesn't exist:
> > 
> > | The following NEW packages will be installed:
> > | [...]
> > | debconf: delaying package configuration, since apt-utils is not installed
> > | dpkg: error: failed to open package info file '/var/lib/dpkg/available' 
> > for reading: No such file or directory
> > 
> > My workaround to work around this is to run:
> > 
> >   chroot "${TARGET}" /usr/lib/dpkg/methods/apt/update /var/lib/dpkg
> > 
> > As mmdebstrap seems to rely on dpkg of the host system, it would be
> > nice if mmdebstrap could ensure to create an environment where apt/dpkg of
> > the installed system doesn't stumble upon. :)
> 
> this already exists as a hook. :)
> 
> Try running mmdebstrap with
> 
>     --hook-dir=/usr/share/mmdebstrap/hooks/jessie-or-older
> 
> which will unconditionally do certain things only necessary for old releases.

This indeed solves the problem, /var/lib/dpkg/available exists in
the target system then (as empty file, FTR).

> If you instead use
> 
>     --hook-dir=/usr/share/mmdebstrap/hooks/maybe-jessie-or-older
> 
> some detection code will only run the hook if necessary (in case you do not
> know upfront which release you are creating a chroot for).

This does *not* help/work, though, FYI.

(FTR, we already have a local workaround, I just thought that it
would make sense to have a decent and nice out-of-the-box experience
also for other users. :))

Thanks! :)

regards
-mika-

Attachment: signature.asc
Description: PGP signature

Reply via email to