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
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
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
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
aptitude and their dependencies. Thanks to
pbuilder, this wasn't too bad.
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
dpkg, it will report powerpc as foreign), massage that into
shape with grep and sed, and give the result to
aptitude as a command
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
So, in summary, this still works fairly well.