Gentoo Live 32 to 64 migration as clean as possible:
This is my method - letting portage track every file and package except glibc and ld-linux.so.2 loader. System and all services can remain running. If this is done correctly only 2 reboots will be required.
make sure system is completely up to date and has been depcleaned, preserved-rebuilt and revdep-rebuild - to clean up old 32bit libraries else lots of work later
a full up to date backup of the system is a good idea and has saved me in the past.
make sure you have an *identically* up to date 64bit multilib profile VM to create binary packages on. Ensure CFLAGS is going to be identical, or compatible (“-mtune=generic -O2 -pipe” is safe). Make sure USE flags are the same between the systems as this makes live easier when doing emerge -k binarypackage on the other side. If changes are required to CFLAGS then emerge -e world.
read ahead a few points (or the whole page) when starting a step - several problems may be solved in subsequent notes
if problems arise with libraries and mismatched ABI binaries, scp them over from the donor VM as needed. subsequent emerge will overwrite them later.
Steps
mkdir /migration-backup
cp /etc/portage/make.conf /migration-backup/
emerge crossdev -av
crossdev -S -s3 --target x86_64-pc-linux-gnu
genkernel all
copy the resulting kernel, initramfs, system.map, and lib/modules/x.x directory over
reboot test into the 64bit kernel
Change CHOST to x86_64-pc-linux-gnu
copy lib and /usr/lib and /bin and /usr/bin and /sbin and /usr/sbin to /migration-backup
make /etc/env.d/99migration with LDPATH=/migration-backup/lib:/lib32:/lib64:/migration-backup/usr/lib:/usr/lib32:/usr/lib64
env-update
source /etc/profile
ldconfig
mkdir /lib32 (not if donor VM profile is 17.1 and onwards which uses lib and lib64 with no symlink)
mkdir /lib64
mkdir /usr/lib32 (not if donor VM profile is 17.1 and onwards which uses lib and lib64 with no symlink)
mkdir /usr/lib64
rm -Rf /usr/lib/distcc
cp -ar /usr/x86_64-pc-linux-gnu /migration-backup/usr/
cp -ar /usr/i686-pc-linux-gnu /migration-backup/usr/
cp -ar /usr/libexec /migration-backup/usr/
cp -ar /usr/include /migration-backup/usr
put -sandbox -usersandbox in features
add */* abi_x86_32 to package.use
most 32bit doesnt get built on stable unless u do this:
# cat /etc/portage/profile/use.mask
-abi_x86_32
quickpkg glibc gcc zlib ncurses gmp mpfr util-linux acl attr sandbox coreutils procps binutils libcap mpc cracklib flex =db-5* glib pam pambase =python-3.8* bash readline findutils install-xattr bzip2 tar xz-utils make grep patch gawk sed libpcre dev-libs/libffi gettext libxml2
for this lib / lib64 link ↔ switcheroo
* make sure busybox is functional. run this from busybox
* have a few shells open, in case you break the one you're working from
* remember.. if the source VM is profile 17.1 then this system will need to be built using 17.1, so think about making a /lib and /usr/lib folder (and no lib32 folders) rather than symlinking.
mv /lib oldlib
ln -s lib64 lib (not on 17.1 - mkdir lib)
cd /usr
mv lib to oldlib
ln -s lib64 lib (not on 17.1 - mkdir lib)
cp migration-backup/lib/ld-linux.so.2 /lib
ldconfig
cd /usr/oldlib
mv python-exec python3.6 libpython* portage gcc ../lib/
cp -r /oldlib/gentoo /lib/
LD_PRELOAD="/migration-backup/usr/lib/gcc/i686-pc-linux-gnu/10.3.0/libgcc_s.so.1:/migration-backup/usr/lib/libffi.so.7" PATH="/migration-backup/bin:/migration-backup/usr/bin:/migration-backup/sbin:/migration-backup/usr/sbin:${PATH}" FEATURES="-collision-detect -protect-owned" emerge -1kav sys-devel/gcc
check /usr/libexec/gcc/x86_64-pc-linux-gnu/ for any links pointing at i686 versions. remove.
continue to deploy initial binary packages using this method (except with collision detection) donated from prebuilt VM from /usr/portage/packages or /var/cache/binpkgs. Of these, mpc, zlib, glibc needs to come first, then everything else will come good. In the process of deploying glibc, /lib needs to be a symlink to /lib64 which will break 32bit programs. see ld-linux.so.2 trick above. ldconfig is your friend here with the above 99migration env file.
If you get into trouble getting 64bit loader working, do this (only if needed):
* backup these: /etc/env.d/99glibc /etc/gai.conf /etc/host.conf /etc/locale.gen /etc/nsswitch.conf /etc/rpc
* extract glibc tbz2 binary package directly into root of filesystem. subsequent remerge will track the files correctly later.
* restore etc files from above backup
PKGDIR=/var/cache/binpkgs emerge -1kav sys-devel/gcc mpfr mpc binutils
gcc-config 1
binutils-config 1
. /etc/profile
PKGDIR=/var/cache/binpkgs emerge -1kav glibc
Double check /etc/nsswitch.conf and other files backed up above, this may have overwritten them again.
mv /migration-backup/lib/modules /lib64
(or to /lib if 17.1 profile)
emerge gcc -1av
FEATURES="-sandbox -usersandbox" USE="-X -gtk -qt5 -introspection -cairo -gpm -consolekit -policykit -net -ipv6 -spell -sqlite -nls -berkdb -gdbm -openssl" emerge -1eav @system
work through any problems caused by emerge ordering above. If a dependancy problem proves too hard to solve, cheat by grabbing a binary package from the donor VM prepared earier. The subsequent @world emerge will take over the package later.
/etc/env.d/99migration can now be removed. env-update, source /etc/profile, ldconfig
emerge -eav –keep-going @world
Things to do later
uncomment LINGUAS from make.conf
take out /etc/env.d/99migration
remove /migration-backup
erase /usr/portage/packages (whole dir)
remove abi_x86_32 from package.use and profiles/use.mask, then emerge –newuse
clean up /lib.old and /usr/lib.old
check for packages that own files in 32bit directories:
emerge -1av /lib32 /usr/lib32
cd /lib32 ; find -xdev -type f -exec qfile -o {} + |less