====== 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 [[http://www.linux-kvm.org/page/KSM|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 ===== -http://www.ewan.cc/?q=node/90 -http://wiki.debian.org/Multiarch/HOWTO