User Tools

Site Tools


64bit-migration

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.
Steps
mkdir /migration-backup
cp /etc/portage/make.conf /migration-backup/
  • building cross compiler
emerge crossdev -av

convert /etc/portage/package.* into directories

crossdev -S -s3 --target x86_64-pc-linux-gnu
  • compile x86_64 kernel with ia32 emulation (use CROSS_COMPILE= to add a prefix to toolchain commands), reboot into it
make CROSS_COMPILE=x86_64-pc-linux-gnu- -j5
  • 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
mkdir /lib64
mkdir /usr/lib32
mkdir /usr/lib64
  • If applicable, dont use distcc till its remerged:
rm -Rf /usr/lib/distcc    
  • back up these 32bit crossdev versions, they may be useful if something goes wrong (experience says it may!)
cp -ar /usr/x86_64-pc-linux-gnu /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
  • change make.profile symlink to point to a multilib amd64 profile
  • on donor pc or VM:
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.6* bash readline findutils install-xattr bzip2 tar xz-utils make grep patch gawk sed libpcre dev-libs/libffi gettext libxml2
  • on source VM, scp -r /var/cache/binpkgs to target PC
  • 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
mv /lib oldlib
ln -s lib64 lib
cd /usr
mv lib to oldlib
ln -s lib64 /lib
  • this will get overwritten by emerge at the appropriate time, but lets the 32bit loader continue to work for now
cp migration-backup/lib/ld-linux.so.2 /lib
  • /usr/lib symlink creation will break python. The following will not create orphans as the files are in exactly the same location from portage's point of view.
cd /usr/oldlib
mv python-exec python3.6 libpython* portage gcc ../lib64
cp -r gentoo /lib
  • use quickpkg on source VM to grab and then PATH=“/migration-backup/bin:/migration-backup/usr/bin:/migration-backup/sbin:/migration-backup/usr/sbin:${PATH}” emerge -1kav to deploy initial binary packages donated from prebuilt VM from /usr/portage/packages or /var/cache/binpkgs. Of these, 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.
  • backup these: /etc/env.d/99glibc /etc/gai.conf /etc/host.conf /etc/locale.gen /etc/nsswitch.conf /etc/rpc
  • to get 64bit loader and glibc working, extract glibc tbz2 binary package directly into root of filesystem. subsequent remerge will track the files correctly later.
  • restore etc files from above backup
  • remove crossdev packages (and crossdev) and check gcc sanity
emerge --unmerge cross-x86_64-pc-linux-gnu/* crossdev -av
ldconfig
  • fix 32bit toolchain and python in wrong directory by running:
PKGDIR=/var/cache/binpkgs emerge -1kav sys-devel/gcc mpfr mpc binutils 
gcc-config 1
binutils-config 1
. /etc/profile

Example final binary emerge. Note obvious package version changes required based on source VM:

PKGDIR=/var/cache/binpkgs USE="fix any differences" emerge -1kav =zlib-1.2.11-r2  =ncurses-6.2-r1  =gmp-6.2.0-r1 =util-linux-2.35.1-r2  =acl-2.2.53  =attr-2.4.48-r3  =sandbox-2.13  =coreutils-8.31-r1  =procps-3.3.15-r1  =libcap-2.26-r2  =cracklib-2.9.7  =flex-2.6.4-r1  =db-5.3.28-r2  =glib-2.62.6  =pam-1.3.1-r2  =pambase-20190402  =python-3.6.10-r2 =bash-5.0_p17  =readline-8.0_p4  =findutils-4.7.0  =install-xattr-0.5  =bzip2-1.0.6-r11  =tar-1.32  =xz-utils-5.2.4-r2  =make-4.2.1-r4  =grep-3.3-r1  =patch-2.7.6-r4  =gawk-5.0.1  =sed-4.7  =libpcre-8.43 =dev-libs/libffi-3.3-r1 =gettext-0.20.1 =libxml2-2.9.9-r3

Finally now that theres a working coreutils etc, binary glibc package can overwrite the manual tar version we extracted in a previous step.

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
  • Emerging gcc needs to be done now, but also acts as a sanity check to see what we've missed. Repeat the quickpkg / emerge -1k steps for missing things
emerge gcc -1av
  • leave /etc/env.d/99migration in place at least until libraries in /lib32 are populated
  • @system rebuild - adjust USE as needed
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
  • remove -sandbox and -usersandbox from features
  • check for i686 compiler orphans with: qfile -o /usr/bin/i686-pc-linux-gnu-*

emerge -eav –keep-going @world

  • take note of failed, packages - these are usually caused by ordering/dependancy so a subsequent emerge run of the failed list will work. If not, work through the issues.
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 orphans in /usr/lib and all the other places. (bin sbin /usr/bin /usr/sbin). For finding orphan files after migration in /lib32, /usr/lib32, /usr/lib64
cd /lib32 ; find  -xdev -type f -exec qfile -o {} + |less
64bit-migration.txt · Last modified: 2020/07/13 09:32 by snarg