Simon Richter: Crossgrading Debian in 2017
So, once again I had a box that had been installed with the kind-of-wrong
Debian architecture, in this case, powerpc (32 bit, bigendian), while I
wanted ppc64 (64 bit, bigendian). So, crossgrade time.
If you want to follow this, be aware that I use sysvinit. I doubt this can
be done this way with systemd installed, because systemd has a lot more
dependencies for PID 1, and there is also a dbus daemon involved that
cannot be upgraded without a reboot.
To make this a bit more complicated, ppc64 is an unofficial port, so it is
even less synchronized across architectures than sid normally is (I would
have used jessie, but there is no jessie for ppc64).
Step 1: Be Prepared
To work around the archive synchronisation issues, I installed pbuilder and
created 32 and 64 bit base.tgz archives:
pbuilder --create --basetgz /var/cache/pbuilder/powerpc.tgz
pbuilder --create --basetgz /var/cache/pbuilder/ppc64.tgz \
--architecture ppc64 \
--mirror http://ftp.ports.debian.org/debian-ports \
--debootstrapopts --keyring=/usr/share/keyrings/debian-ports-archive-keyring.gpg \
--debootstrapopts --include=debian-ports-archive-keyring
Step 2: Gradually Heat the Water so the Frog Doesn't Notice
Then, I added the sources to sources.list
, and added the architecture to dpkg
:
deb [arch=powerpc] http://ftp.debian.org/debian sid main
deb [arch=ppc64] http://ftp.ports.debian.org/debian-ports sid main
deb-src http://ftp.debian.org/debian sid main
dpkg --add-architecture ppc64
apt update
Step 3: Time to Go Wild
apt install dpkg:ppc64
Obviously, that didn't work, in my case because libattr1
and libacl1
weren't in sync, so there was no valid way to install powerpc and ppc64
versions in parallel, so I used pbuilder
to compile the current version
from sid for the architecture that wasn't up to date (IIRC, one for
powerpc, and one for ppc64).
Manually installed the libraries, then tried again:
apt install dpkg:ppc64
Woo, it actually wants to do that. Now, that only half works, because apt
calls dpkg
twice, once to remove the old version, and once to install the
new one. Your options at this point are
apt-get download dpkg:ppc64
dpkg -i dpkg_*_ppc64.deb
or if you didn't think far enough ahead, cursing followed by
cd /tmp
ar x /var/cache/apt/archives/dpkg_*_ppc64.deb
cd /
tar -xJf /tmp/data.tar.xz
dpkg -i /var/cache/apt/archives/dpkg_*_ppc64.deb
Step 4: Automate That
Now, I'd like to get this a bit more convenient, so I had to repeat the
same dance with apt
and aptitude
and their dependencies. Thanks to
pbuilder
, this wasn't too bad.
With the aptitude
resolver, it was then simple to upgrade a test package
aptitude install coreutils:ppc64 coreutils:powerpc-
The resolver did its thing, and asked whether I really wanted to remove an
Essential
package. I did, and it replaced the package just fine.
So I asked dpkg for a list of all powerpc packages installed (since it's
a ppc64 dpkg
, it will report powerpc as foreign), massage that into
shape with grep and sed, and give the result to aptitude
as a command
line.
Some time later, aptitude
finished, and I had a shiny 64 bit system.
Crossgrade through an ssh session that remained open all the time, and
without a reboot. After closing the ssh session, the last 32 bit binary was
deleted as it was no longer in use.
There were a few minor hiccups during the process where dpkg
refused to
overwrite "shared" files with different versions, but these could be solved
easily by manually installing the offending package with
dpkg --force-overwrite -i ...
and then resuming what aptitude was doing, using
aptitude install
So, in summary, this still works fairly well.