Differences between revisions 1 and 23 (spanning 22 versions)
Revision 1 as of 2013-06-14 08:04:14
Size: 740
Comment: Creating the page with a few links
Revision 23 as of 2018-01-21 11:11:08
Size: 9257
Editor: ?Joy
Comment: had to run another update so indices for swapped architectures would get downloaded properly
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
#language en
~-[[DebianWiki/EditorGuide#translation|Translation(s)]]: none-~
----
<<TableOfContents>>
Line 5: Line 9:
Please note this is still work in progress and re-installing is still safer.

== Links ==
== 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 DebianPackage:arch-test to determine which Debian architectures your system can run. You can install DebianPackage: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`).

=== Make sure all packages are in sync between architectures ===

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
}}}

=== 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.

{{{
# 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
# apt-get update
}}}

=== Crossgrade all other architecture-dependent packages ===

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 ==

=== APT dependency resolver wants to revert apt itself ===

If the system had packages that depend on apt like apt-utils, it's possible run into a situation where {{{apt-get -f install}}} wants to revert apt itself to i386. Aborting and doing another operation {{{apt-get autoremove}}} will illustrate the reason better:

{{{
The following packages have unmet dependencies:
 apt-utils:i386 : Depends: apt:i386 (= 1.4.8) but it is not installed
}}}

In such a case, the solution is to temporarily remove {{{apt-utils:i386}}} from the system, and install {{{apt-utils}}} afterwards. Note: this new apt-utils will be amd64, but once you switch apt to amd64, using the :amd64 suffix will not work.

=== 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
}}}

=== 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.

=== iamerican (and possibly others/similar) ===

Similar to KDE, some package(s) (e.g. iamerican on at least Debian 7.5) may have saved caches/hashes that need updating. E.g. encountered:
{{{
$ echo foo | spell
/usr/bin/ispell: Illegal format hash table
$
}}}
corrected with:
{{{
# (cd / && umask 022 && dpkg-reconfigure iamerican)
}}}
which then caused updating of: /var/lib/ispell/american.hash

== Articles ==
Line 11: Line 123:

== Pre-requisites ==

The first Debian release to feature [[Multiarch]] is [[Wheezy]], so you will need to upgrade before the procedure described here.
 * [[http://www.simonrichter.eu//blog/2017-01-07-crossgrading.html|Crossgrading Debian in 2017]] by Simon Richter
 * [[https://anarc.at/services/upgrades/cross-architecture/|Upgrading Debian from 32-bit to 64-bit - AKA crossgrading from i386 to amd64]] by anarcat
 * [[https://www.wiki.balug.org/wiki/doku.php?id=system:32-bit_to_64-bit|i386 to amd64]] - Debian 7.5 from i386 to amd64, discussion + links to edited script(1) capture, etc., by [[https://wiki.debian.org/MichaelPaoli|Michael Paoli]]
 * Articles by Jose M. Calhariz:
   * [[http://blog.calhariz.com/post/2017/07/12/Crossgrading-the-kernel-in-Debian-9|Crossgrading the kernel in Debian 9]]
   * [[http://blog.calhariz.com/post/2017/07/12/Crossgrading-a-minimal-install-of-Debian-9|Crossgrading a minimal install of Debian 9]]
   * [[http://blog.calhariz.com/post/2017/07/13/Crossgrading-a-more-typical-server-in-Debian9|Crossgrading a more typical server in Debian 9]]
   * [[http://blog.calhariz.com/post/2017/07/16/Crossgrading-a-complex-Desktop-and-Debian-Developer-machine-running-Debian-9|Crossgrading a complex Desktop and Debian Developer Machine running Debian 9]]
   * [[http://blog.calhariz.com/post/2017/07/30/Crossgrading-a-complex-Desktop-and-Debian-Developer-machine-running-Debian-9%2C-another-try|Crossgrading a complex Desktop and Debian Developer Machine running Debian 9, for real]]

== 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!

{{{
#! /bin/bash
# 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


}}}

Translation(s): none


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).

Make sure all packages are in sync between architectures

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

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.

# 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
# apt-get update

Crossgrade all other architecture-dependent packages

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

APT dependency resolver wants to revert apt itself

If the system had packages that depend on apt like apt-utils, it's possible run into a situation where apt-get -f install wants to revert apt itself to i386. Aborting and doing another operation apt-get autoremove will illustrate the reason better:

The following packages have unmet dependencies:
 apt-utils:i386 : Depends: apt:i386 (= 1.4.8) but it is not installed

In such a case, the solution is to temporarily remove apt-utils:i386 from the system, and install apt-utils afterwards. Note: this new apt-utils will be amd64, but once you switch apt to amd64, using the :amd64 suffix will not work.

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

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.

iamerican (and possibly others/similar)

Similar to KDE, some package(s) (e.g. iamerican on at least Debian 7.5) may have saved caches/hashes that need updating. E.g. encountered:

$ echo foo | spell
/usr/bin/ispell: Illegal format hash table
$ 

corrected with:

# (cd / && umask 022 && dpkg-reconfigure iamerican)

which then caused updating of: /var/lib/ispell/american.hash

Articles

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