2 min read

🐧 Actualizaciones automáticas en openSUSE Tumbleweed

🐧 Actualizaciones automáticas en openSUSE Tumbleweed
Photo by Lukas / Unsplash

Si me seguís en Mastodon, ya estaréis al tanto de que uso openSUSE Tumbleweed en todos los aparatos que me permiten instalarlo: sobremesa, portátil personal, y portátil de trabajo. Esto es así porque hace ya 5 años descubrí su facilidad de uso, y su configuración que «simplemente funciona», y el hecho de ser una distribución rolling release hace que no tenga que preocuparme de andar actualizando entre versiones «de punto» cada varios meses o años.

Por si no os ha quedado claro, os animo a que probéis openSUSE si sois ese tipo de gente que «le da a Linux».

Bueno, pues precisamente en una de esas configuraciones de «simplemente funciona» se apoya este tutorial: el uso del sistema de ficheros BTRFS, las actualizaciones automáticas, y los snapshots.

Normalmente, la manera de actualizar el sistema es hacerlo (o delegarlo) mediante el gestor de paquetes, o por consola (con un sudo zypper dup que ejecutaba casi compulsivamente a diario). Mediante esta configuración, haremos que las actualizaciones se instalen en segundo plano sin tocar el estado actual del sistema (se instalan en una nueva snapshot), y estarán disponibles automáticamente en el siguiente reinicio del sistema.

Esto, por supuesto, no me lo he inventado yo, sino que he recopilado varios pasos del internete.

Fuentes:

Requisitos previos

  • Usar BTRFS como sistema de ficheros en root / (usado por defecto al instalar OpenSUSE)
  • Tener el sistema actualizado (solución rápida: sudo zypper ref -f && sudo zypper dup)
  • Utilizar systemd (usado por defecto por OpenSUSE)

Paquetes necesarios

sudo zypper install transactional-update rebootmgr dracut-transactional-update transactional-update-notifier

¿Qué hace cada paquete?

  • transactional-update → Maneja las snapshots del sistema, y sus actualizaciones.
  • rebootmgr → Planifica los reinicios después de las actualizaciones.
  • dracut-transactional-update → Provee servicios adicionales para las actualizaciones transaccionales.
  • transactional-update-notifier → Permite enviar notificaciones del sistema cada vez que se realice una actualización en segundo plano.

Configuración

Estos pasos son opcionales, dependiendo del caso de uso de cada uno.

Notificaciones

Si queremos que se nos envíe una notificación del sistema cada vez que se instalen actualizaciones en segundo plano usando el paquete transactional-update-notifier:

echo "REBOOT_METHOD=notify" | sudo tee /etc/transactional-update.conf > /dev/null

Es decir: añadimos la línea REBOOT_METHOD=notify al fichero /etc/transactional-update.conf.

Habilitamos el servicio:

systemctl --user enable --now transactional-update-notifier.service

Para desactivar:

systemctl --user disable --now transactional-update-notifier.service

Habilitar los cambios de proveedor en las actualizaciones

Si usamos repositorios de terceros que tengan paquetes con el mismo nombre que los oficiales de openSUSE (se me ocurren los paquetes del repositorio Packman), tendremos que habilitar esto para permitir a la actualización automática efectuar el cambio de proveedor:

# Crear el directorio
sudo mkdir -p /etc/transactional-update.conf.d
# Editar el fichero
sudo vim /etc/transactional-update.conf.d/vendor-change.conf

Añadimos estas líneas:

ZYPPER_AUTO_IMPORT_KEYS=1
ZYPPER_DUP_OPTIONS="--allow-vendor-change"

Activar

sudo systemctl enable --now transactional-update.timer transactional-update-cleanup.timer rebootmgr.service create-dirs-from-rpmdb.service

Desactivar

sudo systemctl disable --now transactional-update.timer transactional-update-cleanup.timer rebootmgr.service create-dirs-from-rpmdb.service

Una vez realizados todos estos pasos, se ejecutará en segundo plano la actualización del sistema usando un temporizador, y se nos notificará. Cuando estemos listos, reiniciamos el sistema, y ya estarán disponibles los paquetes actualizados.


[¹] En esta fuente se indica que es posible crear hooks para ejecutar otros comandos una vez termine el servicio transactional-update.service. En mi caso no ha funcionado y, tras leer la documentación oficial del paquete, no parece que esa funcionalidad exista.