Actualizar un sistema Gentoo antiguo puede convertirse en una autentica odisea, en este tutorial explicaremos como hacerlo en un sistema que no se actualiza desde el 30 de Marzo del 2017. Gentoo provee de mecanismos y funcionalidades claramente superiores al resto de distribuciones de Linux, gracias a estas funcionalidades podremos hacer uso de un chroot desde el cual compilar ebuilds para el sistema padre.
Antes de nada si se trata de un servidor físico lo convertiremos a CT con la herramienta lxd-p2c como ya explicamos en este artículo anterior de este modo podremos hacer snapshots y todas las pruebas que deseemos sin preocuparnos de romper el sistema ni de interrumpir el servicio, cuando tengamos el CT actualizado tan solo debemos realizar los mismos pasos en el servidor físico o apagar el servidor original y dejar el CT con la ip del servidor físico.
Para que Gentoo funcione dentro de LXD correctamente debemos modificar un script de devfs, eliminamos el ‘-’ de lxc:
keyword -docker lxc -prefix -systemd-nspawn -vserver
Para poder actualizar con éxito debemos tener en cuenta la importancia de los profiles en Gentoo, cuando una release incluye nuevas funcionalidades, provee un conjunto de paquetes core o parámetros que modifican el funcionamiento del sistema se provee de un nuevo perfil.
Un perfil es un conjunto de ficheros de configuración, los perfiles se almacenan en el directorio /var/db/repos/gentoo/profiles, estos decriben aspectos como los ebuilds que son considerados parte del sistema base, las USE flags por defecto, el mapeo de los paquetes virtuales y la arquitectura en la que el sistema está corriendo.
NOTA: Antes de hacer algún cambio de perfil hay que asegurarse de que tenemos el sistema operativo actualizado al máximo antes de realizar el cambio.
El sistema en cuestión es bastante antiguo, no se actualiza desde:
Last emerge --sync was jue 30 mar 2017 23:05:01 CEST.
El primer paso será eliminar todos los ebuilds que no sean de vital importancia de este modo nos ahorraremos problemas a la hora de compilar:
Además eliminamos posibles overlays configurados en el make.conf
Creamos un chroot donde tendremos herramientas actuales con las que compilar e ir actualizando los ebuilds conflictivos del padre:
wget http://distfiles.gentoo.org/releases/amd64/autobuilds/20190825T214502Z/stage3-amd64-20190825T214502Z.tar.xz
tar -xf stage3-amd64-20190825T214502Z.tar.xz -C /mnt/build
mount --rbind /dev /mnt/build/dev
mount --rbind /proc /mnt/build/proc
mount --rbind /sys /mnt/build/sys
mkdir -p /mnt/build/mnt/host
mount --rbind / /mnt/build/mnt/host
cp -L /etc/resolv.conf /mnt/build/etc/
chroot /mnt/build
source /etc/profile
export PS1="(chroot) ${PS1}"
emerge --sync
Seleccionamos el mismo profile que el host padre:
Available profile symlink targets:
[1] default/linux/amd64/17.0 (stable) *
Ahora actualizamos el portage del padre desde el chroot:
En otra consola seguimos actualizando el sistema de forma regular, si algún paquete dá problemas volvemos a la consola del chroot y actualizamos dicho paquete.
emerge --depclean
revdep-rebuild
etc-update
gcc-config -l
perl-cleaner --all
eselect kernel list -> Solo si se trata de un equipo físico
Por supuesto leeremos los mensajes que nos vayan apareciendo, esto es muy importante, leer lo que aparece por consola.
Cuando tengamos el sistema actualizado podemos hacer el cambio de perfil y seguir actualizando hasta tener un sistema totalmente funcional con las últimas versiones de software actualizado.
Cada profile tiene un proceso de migración, en este caso se trata del 17.1, seguimos los pasos antes de cambiar el profile:
https://www.gentoo.org/support/news-items/2019-06-05-amd64-17-1-profiles-are-now-stable.html
unsymlink-lib --analyze
unsymlink-lib --migrate --pretend
unsymlink-lib --migrate
reboot
Si reinicia correctamente terminamos la migración con:
En caso contrario revertimos los cambios con:
Finalizamos la migración:
SYMLINK_LIB=no
LIBDIR_x86=lib
Ya estamos listos para pasar al siguiente profile:
eselect profile set X
Recompilamos gcc:
emerge -1v --deep /lib32 /usr/lib32 /usr/lib/llvm/*/lib32
La actualización debería de haber eliminado los symlinks /lib32 /usr/lib32, si siguen existiendo los eliminamos manualmente:
ls -la /usr/lib32
rm /lib32 /usr/lib32
Nos aseguramos de que no quede nada por actualizar:
emerge -uDav world
emerge --depclean
revdep-rebuild
etc-update
gcc-config -l
perl-cleaner --all
eselect kernel list -> Solo si se tratra de un equipo físico
La sintaxis de los ficheros de configuración de algún software puede haber cambiado, tendremos que adaptarla para que funcione con la nueva versión.
Para cada software seguiremos la guía pertinente, para Apache por ejemplo:
https://httpd.apache.org/docs/current/upgrading.html
http://httpd.apache.org/docs/2.4/mod/core.html#options
Algunos errores de Glibc que han aparecido han sido:
* Your //etc/nsswitch.conf is out of date.
* Please make sure you have 'files' entries for
* 'passwd:', 'group:' and 'shadow:' databases.
https://wiki.gentoo.org/wiki/Glibc_2.26_porting_notes/nsswitch.conf_in_glibc-2.26
Otro error ha sido el siguiente relacionado con el compilador:
configure: error:
*** These critical programs are missing or too old: compiler
*** Check the INSTALL file for required versions.
* ERROR: sys-libs/glibc-2.29-r2::gentoo failed (configure phase):
* failed to configure glibc
[1] x86_64-pc-linux-gnu-4.9.3 *
[2] x86_64-pc-linux-gnu-8.3.0
. /etc/profile
Finalmente limpiamos el entorno de Python:
Y ya tenemos nuestra Gentoo totalmente actualizada ;)