Friday, February 25, 2011

openSUSE 32bit to 64bit live conversion

Kids, don't try this at home.
Anyway, here is what worked for me:

  • add arch = x86_64 to /etc/zypp/zypp.conf

  • zypper ref -f

  • rpm -qa kernel*

  • zypper in -f kernel-default kernel-default-base (the kernel packages found by the step above)

  • mkinitrd

  • reboot

  • zypper in -f glibc

  • zypper in -f rpm Attention: don't install, just resolve everything and get the list of -32bit packages that would get installed

  • zypper in -f file-32bit libbz2-1-32bit... Install all the -32bit packages that were selected in the previous step

  • zypper in -f rpm

  • zypper dup --no-recommends --download-in-advance

  • mkinitrd

  • reboot

Whenever zypper asks you for conflict resolution (which will be every single case), select the option that involves "change architecture", never select "break ..." or "do not install ...". There should be no "uninstall..." proposal in the summary before confirming, only architecture changes and newly installed -32bit packgages.

There were some failing postinstalls for glib and other libraries, which could probably have been avoided by more carefully updating in intermediate steps, or by installing some -32bit library packages before the "dup" step, but the resulting system seems to work just fine.


  1. A simple way to update packages that satisfy a pattern is:

    zypper se 'kernel*' | awk 'BEGIN {FS="|"}; {if ($1=="i ") print $2}'| xargs zypper in

    Also, I see no reason "download in advance" or "download in heaps" (when it actually works) shouldn't be the default.