Our marathon hasn’t kept pace with Debian. During this writing, Debian Bullseye had been moved from OldStable to OldOldStable, while Trixie has been officially released. It is a marathon, after all. Not a speedrun. Today we step into 2021 and later explore a new, as of Bullseye, tool for dodging the sunsetting of 32-bit that begins as of Trixie.
Once the basis of SteamOS, Debian was displaced in favor of Arch. This was also the year that saw the introduction of Valve’s first successful “steam machines” in the form of the Steam Deck. By 2021, the once mighty Intel had rightfully begun to lose its 1vAll hegemony with the likes of Apple taking up their own silicon design, while AMD’s last decade of stategy began to payout. More than ever, an operating system with as wide a breadth of architectural support was poised to ride out the waves of change.
dpkg --audit
pointed to some transitional dummy packages that I’d long been ignoring.
We finally get off of the archive repositories and update sources.list with the new debian security archive format, changing from */updates to *-security.
deb https://deb.debian.org/debian/ bullseye main contrib non-free
deb https://security.debian.org/debian-security/ bullseye-security main contrib non-free
apt update
✔
We unceremoniously initiate the upgrade.
apt upgrade --without-new-pkgs
“Configuration file /etc/sudoers has been modified by you.”
‘I’, Install package maintainer’s version.
“PAM profiles to enable:”
All default.
apt full-upgrade
“Please specify the workgroup for this system.”
Default “WORKGROUP”.
“Modify smb.conf to use WINS settings from DHCP?”
No (default).
Ending without much issue, it cleanly rebooted into the newer Gnome 3.38 environment.
I apt autoremove
’d 338 packages and upgraded 12 packages held back during the full-upgrade.
w3m was held back which I upgraded manually as well as removing several python2 packages.
There really is not much of note. Bullseye was perhaps the most mundane release in terms of changes and transitions (in a good way!).
Maybe impressions is the wrong term to be using, as this falls within recent memory. There it is, systemd integrated Gnome in all its visually minimalistic fancy. I should mention that I haven’t had to worry at all about display stack issues since around Buster. For all its naysayers, wayland is the the one that works effortlessly while x11 was continuously broken without any user intervention throughout the former half of this marathon.
The sort of thing that might even lead one to believe that wayland is better.
Not to pollute this experiment too much with games, but Minetest (now Luanti) runs better than expected on this old APU.
Bullseye released with SuperTuxKart 1.2, the last in Stable before 1.4 at which it still sits today.
The initial launch had Firefox ESR 78 where it languished due to dependency issues preventing the adoption of then-current Firefox ESR 91. As OldOldStable, Bullseye still receives updates, including for Firefox which got upgraded to 128.14 before uploading this article. It is a bit odd to see contemporary software that I use on my daily driver still available through such an old release. Is anybody still rocking Bullseye today?
Bullseye was the first release to include a new tool designed to orchestrate conversion to CPU architectures foreign to the host. This was already possible for those daring to leverage multiarch and convert packages carefully by hand. But crossgrader introduced a semi-formalized way to handle this while minimizing the possibility of breakage.
It effectively enables Debian installations to move laterally across the supported architectures. Upgrade-Journey is at last jumping over to the x86_64 side of things.
At console terminal, apt remove '~o'
cleared many packages left over from as far back as Sarge.
Here, I ran into an issue with libreadline4 causing a dpkg failure “No dir file specified”. Thanks to the helpful account at stackexchange, I was able to comment out the ‘install-info’ line at /var/lib/dpkg/info/libreadline4.prerm and proceed with the obsolete package removal.
This had also left systemd relying on outdated binaries still being run, so we reboot.
apt autoremove
to clear out old Python 2.7 packages. And I also checked that all packages were indeed the most recent available for Bullseye.
The crossgrade procedure wants to make sure we have binutils, curl and wget. dpkg reports binutils and wget already installed so we just need to apt install curl
.
With that, the environment should be all set to begin the crossgrade.
dpkg --print-architecture; dpkg --print-foreign-architectures
tells us that only i386 is currently available.
Per the notes at the Debian Wiki, we add the amd64 build of the kernel ahead of the actual crossgrade:
dpkg --add-architecture amd64
Which now shows up when checking with –print-foreign-architectures.
apt update
to pull in the new amd64 package lists.
apt install linux-image-amd64:amd64
With it installs the requisite dependencies for things like gcc and apparmor.
I rebooted and selected kernel 5.10.0-35-amd64 from GRUB.
uname -r
does report 5.10.0-35-amd64 is indeed in use. I’m really surprised as I would have thought a bunch more of the system would have to already be migrated to 64 bit packages before functionally booting. gdm3 even loaded up ready to log into a desktop session without any complaints!
I installed the crossgrader package before running once (with elevated privileges):
sudo crossgrade-package-check
And, from here on, we make a point not to touch apt or dpkg directly!
sudo crossgrader --dry-run amd64
reports no issues.
sudo crossgrader amd64
Which first crossgrades dpkg, apt, python3 and python3-apt before advising to run the same step once again. Crossgrader appears to loop over installation selections while deferring packages which fail to be retried until everything is resolved. The wiki essentially recommends to run these steps repeatedly until they finish “quite cleanly”.
The first stage of my crossgrade ended with logsave “might not be in the correct architecture”. And with apt being off-limits during a crossgrade, we address this through the -p switch.
sudo crossgrader amd64 -p logsave
Running crossgrader amd64
no longer spits out warnings so we move on to stage two.
Checked that 64 bit apt and dpkg are now installed and the i386 architecture has taken up the secondary role as a foreign architecture.
dpkg -l apt dpkg | grep '^ii '; dpkg --print-architecture; dpkg --print-foreign-architectures
amd64
i386
✔
crossgrader --second-stage amd64
Which failed at an exception regarding the linux-image-686-pae package. As per the crossgrader notes, the –force-unavailable switch informs crossgrader to proceed, ignoring these exceptions.
Some packages, including gnome-shell and gdm3 did not successfully crossgrade to amd64. I attempted to go back and manually install packages which where holding back the installation of the others.
sudo crossgrader amd64 -p libc++abi1-16 libuwind-16
But to no avail. I thought I was going to need to simply remove and reinstall the remaining packages through apt after removing crossgrader and issuing a reboot.
GRUB continues to default to the linux-image-686-pae kernel so I need to manually select the amd64 kernel. Interestingly, it still successfully reaches gdm3, presumably a franken-mixture of amd64 and the remaining two dozen (or so) i386 packages. gnome-control-center fails to launch, so there is definitely some breakage from these remaining packages.
After dropping back to terminal, I then move on to the third stage which cleans up the remaining i386 packages.
sudo crossgrader --third-stage i386 --dry-run amd64
sudo crossgrader --third-stage i386 amd64
But hit a wall with “…returned non-zero exit status 1”
Well, let’s see how much we can get away with ignoring. Like with every other stage, we’ll just run it again!
But roughly twenty packages still yield “…returned non-zero exit status 1”. A few packages that needed to be manually crossgraded:
sudo crossgrader amd64 -p python3-cairo libwebkit-gtk-4.0-37 libjavascriptcoregkt-4.0-18 libunwind-16 libc++abi1-16 libc++-16
However, my attempts to manually crossgrade these packages failed. Ultimately, dpkg kept complaining about broken dependencies associated with python3-cairo:i386 which turned out to be a known problem at this Debian bug report.
Per the very helpful comment at message #10, I was able to edit the file at /var/lib/dpkg/info/python3-cairo:i386.prerm to append “:i386” after both instances of “gir1.2-ibus-1.0”. Thus, freeing up dpkg’s confusion about multiple installed versions of the “same” package.
Afterwhich, once again running crossgrader --third-stage i386 amd64
, it was able to complete and remove the remaining i386 packages.
dpkg -l | grep -F i386
confirmed that the twenty or so remaining i386 packages are no longer present. Time to remove crossgrader.
apt purge crossgrader
Success! And we’re left with a system that is fully 64 bit which began its life as a 32 bit installation.
So Bullseye shipped with a known broken config at /var/lib/dpkg/info/python3-cairo:i386.prerm which affects the crossgradeability of systems using Gnome desktop. And even the final update with 11.11 never implemented a fix for it.
Support for alternative init systems was improved for Bullseye. Even so, much of the talent maintaining the other init systems prefer to roll their own distro in protest.
Python 3 replaces Python 2 in Debian Bullseye.
Pipewire packages begin to make their appearance, indicating Debain were already gearing up to switch to pipewire at least as early as Bullseye.
Having effectly run an informal audit of the crossgrading procedure, we can say that converting to foreign architectures is possible mostly without issue. With no more time or effort than for a normal upgrade. Upgrade-Journey is hardly recognizable as the system provisioned on a Pentium 4 with twenty year old software. I’m looking forward to the last upgrade and reflecting back on the changes and oddities over Debian’s history, when I eventually get around to Bookworm.