Esta pagina se ve mejor con JavaScript habilitado

Actualización de una Gentoo realmente vieja.

 ·  🎃 kr0m

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:

vi /etc/init.d/devfs

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:

emerge --unmerge EBUILD_NAME

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:

mkdir -p /mnt/build
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:

eselect profile list

Available profile symlink targets:
 [1] default/linux/amd64/17.0 (stable) *

Ahora actualizamos el portage del padre desde el chroot:

ROOT="/mnt/host" emerge --verbose --oneshot --nodeps sys-apps/portage

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 -uDav world
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

emerge -1v app-portage/unsymlink-lib
unsymlink-lib --analyze
unsymlink-lib --migrate --pretend
unsymlink-lib --migrate
reboot

Si reinicia correctamente terminamos la migración con:

unsymlink-lib --finish

En caso contrario revertimos los cambios con:

unsymlink-lib --rollback

Finalizamos la migración:

vi /etc/make.conf

SYMLINK_LIB=no
LIBDIR_x86=lib
emerge -1v /usr/lib/gcc /lib32 /usr/lib32

Ya estamos listos para pasar al siguiente profile:

eselect profile list
eselect profile set X

Recompilamos gcc:

emerge -1v sys-devel/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 /lib32
ls -la /usr/lib32
rm /lib32 /usr/lib32

Nos aseguramos de que no quede nada por actualizar:

emerge --sync
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

sed ’s/\<compat\>/files compat/g’ /etc/nsswitch.conf

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
gcc-config -l
 [1] x86_64-pc-linux-gnu-4.9.3 *
 [2] x86_64-pc-linux-gnu-8.3.0
gcc-config 2
. /etc/profile

Finalmente limpiamos el entorno de Python:

eselect python cleanup

Y ya tenemos nuestra Gentoo totalmente actualizada ;)

Si te ha gustado el artículo puedes invitarme a un RedBull aquí