Herramientas de usuario

Herramientas del sitio


servidores:general:wheezy_cambiando_arquitectura

Debian Wheezy: cambiando la arquitectura de i386 a amd64 aprovechando "multiarch"

Introducción

Con la nueva versión Debian GNU/Linux 7.0 Wheezy una nueva funcionalidad llamada “multiarch” (multiarquitectura) ha sido introducida. Esto permite la utilización de ejecutables, como librerías y programas de múltiples arquitecturas en forma simultánea en el mismo sistema. El uso primario de esto es para permitir a programas de 32 bit correr en sistemas de 64 bit. Sin embargo, también puede ser útil para migrar sistemas que por años fueron instalados en arquitectura i386 de 32 bit, y que luego con el tiempo fueron llevados a sistemas de 64 bit sin ser reinstalados. En nuestro caso tenemos muchos sistemas en estas condiciones. Multiarch permite llevarlos a 64 bit sin tener que reinstalar todo, e incluso hacerlo en forma remota. No hay otro sistema operativo que permita semejante flexibilidad.

En particular para nosotros es útil debido a que varios sistemas de 32 bit están siendo ejecutados en máquinas virtuales con KVM. Pasarlos a 64 bit, así como al sistema operativo host (también Debian Squeeze), nos permitirá aprovechar al máximo la característica KSM de KVM.

En este documento mostraremos cómo actualizar de Squeeze (v. 6.x) a Wheezy (v. 7.x), convirtiendo al mismo tiempo el sistema de 32 bit a 64 bit. Se conservarán archivos, configuraciones, programas y datos.

Se empezará con un sistema Debian Squeeze 6.x de 32 bit como arquitectura principal, y se finalizará con un sistema de 64 bit, eliminando por completo programas y librerías de 32 bit.

Lo ideal es bajar la imagen ISO y comenzar la migración a partir de ella. En este caso lo haremos todo en línea, sin la imagen, pero si se desea bajar, utilizar:

wget http://cdimage.debian.org/debian-cd/6.0.7-live/i386/iso-hybrid/debian-live-6.0.7-i386-standard.iso

Debian 7.0 32 bit upgrade

Se puede comenzar haciendo una actualización completa del sistema a Wheezy, pero no es imprescindible, sino que se puede hacer ambas cosas al mismo tiempo. Se debe tener cuidado de no quedar con un sistema inusable, pero es perfectamente posible.

Si se trata de un desktop, recomiendo primero desinstalar todo el escritorio y archivos de interfaz gráfica como Xorg y KDE, por ejemplo, para simplificar el cambio de arquitectura y disminuir el número de paquetes a bajar inicialmente:

aptitude remove kdelibs5-data xserver-xorg-core

Se debe cambiar la versión en el archivo sources.list de APT:

sed -i -e"s/squeeze/wheezy/g" /etc/apt/sources.list

Migrar de Squeeze a Wheezy 32 bit

Se debe hacer primero la migración de Squeeze a Wheezy 32 bit, realizando los pasos habituales:

apt-get update && apt-get dist-upgrade

Luego reiniciar para obtener el nuevo kernel:

shutdown -r now && exit

y a continuación purgar paquetes obsoletos de Debian Squeeze utilizando aptitude:

LANG=en_US aptitude
l~c [return]
_gg

Asegurarse que no haya quedado ningún paquete obsoleto, y si es así, purgarlo.

Nota: recomiendo no ejecutar un “apt-get clean” para eliminar de /var/cache/apt/archives los paquetes que se acaban de instalar, ya que en caso de emergencia quizá se necesiten. Cabe recordar que estarán ahí todos los paquetes del sistema tal como está instalado en este momento.

Backups

El proceso de migración es obviamente crítico, y se debe resguardar absolutamente todo lo que sea útil. Por favor notar que hay paquetes cuyos datos pueden no funcionar sobre una arquitectura diferente, como el formato controlfile de PostgreSQL.

Iniciar con un kernel de 64 bit

El kernel de 32 bit no permite ejecutar aplicaciones de 64 bit, pero un kernel de 64 bit permite ejecutar tanto de 64 como de 32 bit. Por lo tanto es necesario instalar un kernel de 64 bit e iniciar el sistema con él.

Primero agregaremos una nueva arquitectura:

dpkg --add-architecture amd64

Y luego se instalará un kernel de 64 bit y debootstrap, que será utilizado más tarde:

apt-get update && apt-get install linux-image-amd64:amd64 debootstrap

Ahora se debe reiniciar con el nuevo kernel amd64 recién instalado. Hecho eso, quizá se desee purgar todos los otros kernels de 32 bit que hubiese. Esto ahorrará espacio y tiempo y asegurará que el kernel elegido al iniciar sea siempre el de 64 bit.

Este paso es imprescindible dado que de otra manera, los programas de 64 bit necesarios para continuar con el procedimiento, no podrán ser ejecutados.

shutdown -r now && exit

Preparativos para la migración

Crear un punto de chequeo de los paquetes instalados al iniciar. El objetivo es tener instalados los mismos paquetes al finalizar, pero en architectura de 64 bit.

dpkg --get-selections "*:i386"|grep -v deinstall >dpkg-get-selections.cp.00.i386
dpkg --get-selections "*:amd64"|grep -v deinstall >dpkg-get-selections.cp.00.amd64
dpkg --get-selections "*:all"|grep -v deinstall >dpkg-get-selections.cp.00.all

Ahora se deben descargar algunos archivos esenciales que serán utilizados luego. Se desempaquetarán dpkg y dash ya que tienen algunos ejecutables que deben estar disponibles más tarde.

mkdir -p archives/partial files
rm -f archives/*.deb
apt-get install -d -o Dir::Cache::Archives=./archives apt:amd64 dpkg:amd64 bash:amd64 dash:amd64
rm -Rf files/*
dpkg-deb -x archives/dpkg_*.deb files
dpkg-deb -x archives/dash_*.deb files

También se debe crear una lista de paquetes del sistema base, y descargarlos. Algunos paquetes romperán el proceso de migración y por ello deben estar disponibles.

mkdir -p bootstrap
rm -Rf bootstrap/*
debootstrap --arch=amd64 --download-only --include=openssh-client,openssh-server wheezy ./bootstrap
ls -1 bootstrap/var/cache/apt/archives/|egrep "\.deb$"|cut -d "_" -f1|awk '{print $1 " install"}' >dpkg-get-selections.base

Limitar el sistema base de 32 bit

Ahora se recortará la selección de paquetes instalados de 32 bit, dejando sólo los esenciales.

dpkg --clear-selections
cat dpkg-get-selections.base | dpkg --set-selections
apt-get dselect-upgrade

No se debe abortar la remoción del kernel cuando se pregunte, pero prestar atención que el sistema no será iniciable hasta que sea reinstalado más tarde, así como otros paquetes requeridos como LVM.

Actualizar el sistema base a 64 bit

Se instalarán ahora algunos paquetes misceláneos y todas las librerías que necesitaremos inmediatamente para la actualización del sistema base.

apt-get install gcc-4.7-base:amd64 libc6:amd64 libgcc1:amd64 libssl1.0.0:amd64 zlib1g:amd64
dpkg -i archives/lib*.deb

Este paso puede fallar debido a dependencias circulares de librerías. Se puede resolver forzando la instalación de algunos paquetes:

dpkg --force-all -i archives/gcc-4.7-base_4.7.2-5_amd64.deb
dpkg -i archives/libgcc1_1%3a4.7.2-5_amd64.deb

Y luego instalando todas las otras librerías dentro del directorio “archives” en orden, según dpkg vaya solicitando las dependencias.

Empezaremos con la instalación de las versiones de 64 bit de dpkg y apt. Ya lo desempaquetamos anteriormente, así que podemos usar esos archivos para instalar el paquete de reemplazo.

dpkg --force-remove-essential --force-depends -r dpkg:i386
PATH=$PATH:files/usr/bin:files/sbin dpkg -i archives/dpkg_*_amd64.deb
dpkg --print-architecture
dpkg -r apt:i386
dpkg -i archives/apt_*

Resolveremos a continuación las dependencias de apt:

apt-get update
apt-get -f install
apt-get -f install

Esta instalación se detendrá con un error al remover man-db. El segundo apt-get -f install resolverá esto.

Ahora se instalarán los shells de 64 bit. Se debe responder “Yes, do as I say!” cuando se pregunte.

apt-get install dash bash
cp -pi files/bin/dash /bin/sh
cp -pi files/bin/dash /bin/bash
dpkg --configure -a
apt-get install dash bash

Grabaremos otro punto de chequeo para documentar el estado de la migración de arquitectura.

dpkg --get-selections "*:i386"|grep -v deinstall >dpkg-get-selections.cp.01.i386
dpkg --get-selections "*:amd64"|grep -v deinstall >dpkg-get-selections.cp.01.amd64
dpkg --get-selections "*:all"|grep -v deinstall >dpkg-get-selections.cp.01.all

Ahora reemplazaremos gradualmente cada paquete de 32 bit con su equivalente de 64 bit:

apt-get autoremove
apt-get install apt-utils
apt-get install locales
#dpkg --get-selections "*:i386"|grep -v deinstall|grep -v ^lib|cut -f1|cut -d: -f1
apt-get install dmidecode e2fslibs groff-base info install-info iproute iptables iputils-ping isc-dhcp-client isc-dhcp-common mawk multiarch-support nano net-tools netcat-traditional openssh-client traceroute vim-common vim-tiny wget whiptail xz-utils
apt-get install bsdmainutils bsdutils cpio debianutils diffutils hostname login passwd sed
apt-get install mount ncurses-bin
apt-get install base-files base-passwd grep gzip
apt-get install gpgv
apt-get install sysvinit-utils sysvinit
apt-get install cron logrotate

Hay un error en libldap-2.4-2 ya que la librería usa el mismo archivo de configuración para múltiples arquitecturas, y debe ser resuelto:

dpkg --purge libldap-2.4-2:i386
apt-get install gnupg
apt-get purge e2fslibs:i386 zlib1g:i386

Ahora se deben eliminar los últimos paquetes de 32 bit, pero son esenciales, y su remoción romperá el sistema base. Entonces deberemos desempaquetarlos manualmente así podemos continuar accediendo sus ejecutables a medida que están siendo reemplazados.

dpkg-deb -x bootstrap/var/cache/apt/archives/tar_*.deb files
dpkg --force-remove-essential --force-depends -r tar:i386
cp -pi files/bin/tar /bin
dpkg -i bootstrap/var/cache/apt/archives/tar_*.deb
dpkg-deb -x bootstrap/var/cache/apt/archives/findutils_*.deb files
dpkg --force-remove-essential -r findutils:i386
PATH=$PATH:files/usr/bin dpkg -i bootstrap/var/cache/apt/archives/findutils_*.deb
dpkg-deb -x bootstrap/var/cache/apt/archives/coreutils_*.deb files
dpkg --force-remove-essential --force-depends -r coreutils:i386
PATH=$PATH:files/bin dpkg -i bootstrap/var/cache/apt/archives/coreutils_*.deb
dpkg --configure -a
dpkg -i bootstrap/var/cache/apt/archives/*.deb

En este punto puede ocurrir que algún paquete relacionado con Kerberos no se instale por temas de dependencias. Se puede resolver con algo como:

aptitude install libk5crypto3

Y aceptando las desinstalaciones y actualizaciones que hará. Luego se debe eliminar el siguiente paquete, proceso que provocará la desinstalación de varios otros no necesarios:

apt-get purge gcc-4.7-base:i386

Ahora finalmente podemos reinstalar el kernel y utilitarios imprescindibles para el inicio, según los casos. Luego de esto podremos tomar un respiro ya que es nuevamente seguro reiniciar.

apt-get install linux-image-amd64 lvm2 mdadm grub-pc

En el siguiente paso se revisarán los paquetes instalados. No debería haber ningún paquete de arquitectura i386. El sistema base debería constar solamente de paquetes amd64.

dpkg --get-selections "*:i386"|grep -v deinstall >dpkg-get-selections.cp.02.i386
dpkg --get-selections "*:amd64"|grep -v deinstall >dpkg-get-selections.cp.02.amd64
dpkg --get-selections "*:all"|grep -v deinstall >dpkg-get-selections.cp.02.all

Reinstalar paquetes

Ahora que el sistema ha sido migrado a 64 bit, se puede comenzar el proceso de reinstalar los paquetes necesarios previamente instalados como software de 32 bit. Será necesario ejecutar varios installs y configures hasta que las dependencias sean cumplidas. Comenzaremos con los paquetes más importantes y los metapaquetes estándares.

dpkg --purge libmagic1:i386 libsane:i386 libpulse0:i386 libnl-3-200:i386 libsane-extras:i386 openjdk-6-jre-headless:i386 libpam-cap:i386 libgl1-mesa-dri:i386

Si se usa KDE:

apt-get install kde-full

Si se usa Gnome:

apt-get install gnome-desktop-environment

Ahora el sistema está listo para instalar todos los paquetes de software que fueron previamente instalados. Se instalará dselect y usará aptitude para purgar masivamente todos los archivos de configuración de las librerías i386:

apt-get install dselect
dselect access
dselect update
LANG=en_US aptitude

^T
e
l~clib
_gg

Puede ser necesario realizar el purgado varias veces; en ocasiones he tenido que hacerlo tres veces. Hecho eso, salir de aptitude. Nuestro –set-selections será ahora exitoso.

cat dpkg-get-selections.cp.00.all|grep -v deinstall >dpkg-get-selections.final
cat dpkg-get-selections.cp.00.i386|grep -v ":i386"|grep -v deinstall|cut -f1|awk '{print $1 " install"}' >>dpkg-get-selections.final
cat dpkg-get-selections.cp.00.i386|grep ":i386"|grep -v deinstall|cut -d: -f1|awk '{print $1 " install"}' >>dpkg-get-selections.final

Si queda alguna librería i386, la purgaremos ahora. Eso se puede ver en aptitude, en el paso anterior, al pulsar “g”.

dpkg --purge freeglut3:i386 linux-libc-dev:i386
dpkg --clear-selections
dpkg --remove-architecture i386
dselect update
cat dpkg-get-selections.final|dpkg --set-selections

A partir de ahora, el sistema es 100% amd64, y nada de lo que se instale será de arquitectura i386.

En los siguientes tres comandos, aparecerán gran cantidad de avisos y errores, los que se debe ignorar.

apt-get install `dpkg --get-selections "*:i386"|grep -v deinstall|cut -f1|cut -d: -f1|sed ':a;N;$!ba;s/\n/ /g'`
apt-get install `dpkg --get-selections "*:all"|grep -v deinstall|cut -f1|cut -d: -f1|sed ':a;N;$!ba;s/\n/ /g'`
apt-get install `dpkg --get-selections "*:amd64"|grep -v deinstall|cut -f1|cut -d: -f1|sed ':a;N;$!ba;s/\n/ /g'`

En estos pasos, se instalarán gran cantidad de paquetes y se desinstalarán otros muchos. No se debe abortar la remoción del kernel.

apt-get dselect-upgrade
apt-get install linux-image-amd64

Hecho esto, se puede utilizar aptitude para eliminar paquetes que ya no se usan, reparar paquetes rotos y dependencias insatisfechas.

aptitude
gg

Dependiendo de la instalación y de qué paquetes han sido utilizados, quizá haya que ejecutar los comandos “g” varias veces, hasta que no queden acciones por realizar.

Posiblemente también sea necesario instalar paquetes básicos que puedan faltar. Utilizar para ello tasksel:

tasksel --new-install

Y marcar las tareas que uno desee. En servidores generalmente utilizo “Servidor SSH” y “Utilidades estándar del sistema”.

Finalmente, reiniciar el desktop manager según corresponda:

Para KDE:

/etc/init.d/kdm restart

Para Gnome:

/etc/init.d/gdm3 restart

Tareas finales y restauración de backups

Backups

En este punto, se puede restaurar cualquier backup realizado que sea necesario para la migración, por ejemplo los datos de PostgreSQL.

Locales

La configuración de los locales está ahora en /etc/default/locale. Por ello, algunos programas como cron, mostrarán algún warning ya que en versiones anteriores se usaba /etc/environment y ese archivo aún podría existir.

Para resolver esto, simplemente se debe comentar la línea dentro de /etc/environment, por ejemplo:

#LANG=es_AR

Mailx

En las últimas versiones de bsd-mailx se han introducido cambios que provocan errores en los scripts si el subject (-s) ha sido especificado luego de las direcciones de correo-e de destino, por ejemplo:

mailx usuario@direccion.com -s "Asunto"

Se debe cambiar por:

mailx -s "Asunto" usuario@direccion.com

Permitir paquetes de 32 bit (opcional)

Se puede ahora reactivar la instalación de paquetes de 32 bit. En otras palabras tendremos un sistema multiarquitectura que ejecuta aplicaciones de 64 bit, pero que permite la instalación de programas y librerías de 32 bit.

dpkg --add-architecture i386
apt-get update

Revisar ahora los paquetes que han sido instalados.

dpkg --get-selections "*:i386"|grep -v deinstall >dpkg-get-selections.cp.03.i386
dpkg --get-selections "*:amd64"|grep -v deinstall >dpkg-get-selections.cp.03.amd64
dpkg --get-selections "*:all"|grep -v deinstall >dpkg-get-selections.cp.03.all
sdiff -s dpkg-get-selections.cp.00.i386 dpkg-get-selections.cp.03.amd64

Reinstalar programas de 32 bit (opcional)

Ahora se puede reinstalar cualquier programa que sea sólo de 32 bit, por ejemplo:

apt-get install googleearth 

Eliminar archivos y directorios temporales

Una vez que se haya revisado que el sistema esté perfectamente en funcionamiento. Se pueden eliminar los archivos temporales y directorios usados para la migración:

rm -Rf ./bootstrap/ ./files/ ./archives/ ./dpkg-get-selections.*

Bibliografía

servidores/general/wheezy_cambiando_arquitectura.txt · Última modificación: 2013/10/19 09:13 por fmolinuevo