6712
Comment: Apt dependency resolver generates broken solutions
|
6852
add anarcat's post
|
Deletions are marked like this. | Additions are marked like this. |
Line 89: | Line 89: |
* [[https://anarc.at/services/upgrades/cross-architecture/|Upgrading Debian from 32-bit to 64-bit - AKA crossgrading from i386 to amd64]] |
Translation(s): none
Contents
Cross-grading a Debian System
This page is meant to document the procedure for cross-grading a Debian install using Multiarch.
Pre-requisites
The first Debian release to feature Multiarch is Wheezy, so you will need to upgrade before attempting the procedure described here.
A full backup is also strongly recommended as this procedure is still very much work in progress. Reinstalling is still the safer option. You have been warned!
Steps
These are the steps for converting an i386 install to amd64, but they should be applicable for any other architecture pairs if your machine can run both (e.g. armel and armhf). You can use arch-test to determine which Debian architectures your system can run. You can install qemu-user-static add support for more Debian architectures.
Add the new architecture
# dpkg --print-architecture i386 # dpkg --add-architecture amd64 # dpkg --print-foreign-architectures amd64 # apt-get update
Install a kernel that supports both architectures in userland
# apt-get install linux-image-amd64:amd64 # reboot
Make sure you are actually running the new kernel before proceeding with the next steps (uname -a).
Crossgrade `dpkg` `tar` and `apt`
Get all the packages needed to replace dpkg, tar and apt, then install them for the new architecture. It is changing dpkg that actually 'counts' for changing the default arch. Tar has to be replaced with dpkg, not apt otherwise it gets removed then there is no tar to put the new one back with. You need to upgrade first (or otherwise check all the versions of packages to be crossgraded in this step) to make sure all amd64/i386 packages are in version-sync otherwise the cross-grade will break.
# apt-get clean # apt-get upgrade # apt-get --download-only install dpkg:amd64 tar:amd64 apt:amd64 # dpkg --install /var/cache/apt/archives/*_amd64.deb # dpkg --print-architecture amd64 # dpkg --print-foreign-architectures i386
If you got this far you are now effectively running amd64, but with mostly i386 packages. You can try to replace them with the corresponding amd64 packages. If that doesn't work (not all libraries will necessarily have been converted to Multiarch yet) it should be possible to remove the i386 package and install the amd64 version instead.
One rather brutal way to do the swap is
dpkg --get-selections | grep :i386 | sed -e s/:i386/:amd64/ | dpkg --set-selections apt-get -f install
You will have to type in 'Yes, do as I say' to get apt to do this.
Caveats and Known Problems
KDE
The KDE desktop environment creates the file ~/.config/Trolltech.conf which contains locations of shared libararies and, more problematic, their architecture. This causes panel widgets to crash. The file can apparently be safely removed or renamed to fix these problems.
Apt dependency resolver generates broken solutions
It might happen that apt's resolver emits an unworkable solution:
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages. E: Unable to correct dependencies
In this case you can inspect what packages are marked as Broken and decide what to do:
apt -o Debug::pkgProblemResolver=1 -f install
Articles
Announce by Guillem Jover, dpkg Maintainer (see "Cross-grading" at the bottom of the message)
Howto amd64 an i386 Debian installation with multiarch by Marc Haber
Crossgrading Debian in 2017 by Simon Richter
Upgrading Debian from 32-bit to 64-bit - AKA crossgrading from i386 to amd64
Sample cross-grade script
Here is a script to essentially do the above for you. It could do with some work to put in a lot more error checking, but it works OK on a build-essential basic chroot - you may have problems on a more fully-configured real system. Use at your own risk!
# scary script to crossgrade your debian machine between arches. # usage crossgrade <final-architecture> set -e if [ -z "$1" ]; then echo "Usage: crossgrade <architecture> (debian architecture to convert to)" exit 1 fi #validate arch if ! TO=$(dpkg-architecture -qDEB_HOST_ARCH -a$1); then echo "$1 is not a recognised architecture name" exit 1 fi FROM=$(dpkg --print-architecture) echo "Crossgrading from $FROM to $TO" #check for a compatible kernel # should check $FROM and $TO harder # allow for switching kernel over too to minimal one if requested? case $TO in amd64) TO_KERN=amd64 ;; i386) TO_KERN=amd64 ;; armhf) TO_KERN=armhf ;; armel) TO_KERN=armhf ;; arm64) TO_KERN=arm64 ;; mips) TO_KERN=mips64le ;; mipsel) TO_KERN=mips64le ;; mips64le) TO_KERN=mips64le ;; ppc) TO_KERN=ppc64el ;; powerpc) TO_KERN=ppc64el ;; ppc64el) TO_KERN=ppc64el esac dpkg --add-architecture $TO # check that dpkg --print-foreign-architectures is $TO apt-get update apt-get upgrade # Install a kernel capable to run the new architecture with the old # architecture in userspace KERNEL=$(uname -m) echo "Current kernel arch is $KERNEL" if [ "$KERNEL" != "$TO_KERN" ]; then if apt-get install linux-image-$TO:$TO; then echo "There should be a reboot here" #reboot else echo "kernel updating to linux-image-$TO:$TO failed" fi fi #Crossgrade dpkg and apt apt-get clean apt-get --download-only install dpkg:$TO apt:$TO #check ever package to be installed is available in same version for amd64 if installed (multiarch sync is needed) #for pkg in /var/cache/apt/archives/*_$TO.deb #do # file=$(basename $pkg) # pkgname= ${file%%_.*} # version= ${file##*._} # if dpkg -l $($pkgname) #done #in practice this needs to run twice (do it more? is there a better way?) if ! dpkg --install /var/cache/apt/archives/*_$TO.deb; then dpkg --install /var/cache/apt/archives/*_$TO.deb fi test $(dpkg --print-architecture) = $TO test $(dpkg --print-foreign-architectures | grep $FROM) = $FROM echo "Yay! dpkg and apt crossgrade completed successfully" echo "Updating core packages" apt-get -f install