Actualización de Ubuntu LTS a una Nueva Versión

La actualización de versiones de Ubuntu Long Term Support (LTS) es una tarea crítica de mantenimiento para administradores de sistemas que gestionan servidores en producción. Aunque el proceso de actualización de Ubuntu es generalmente confiable, realizar una actualización de versión principal requiere una planificación cuidadosa, pruebas exhaustivas y ejecución sistemática para evitar tiempo de inactividad, pérdida de datos o inestabilidad del sistema.

Esta guía completa te guía por el proceso completo de actualización de Ubuntu LTS a una nueva versión, desde la planificación previa y los procedimientos de respaldo hasta la ejecución real de la actualización y la verificación posterior. Ya sea que estés actualizando de Ubuntu 20.04 a 22.04, o planificando futuras transiciones LTS, esta guía proporciona el conocimiento y los procedimientos necesarios para una actualización exitosa.

Tabla de Contenidos

  • Introducción
  • Comprensión del Ciclo de Versiones de Ubuntu LTS
  • Planificación y Evaluación Previa a la Actualización
  • Estrategias de Respaldo y Recuperación ante Desastres
  • Pruebas del Proceso de Actualización
  • Preparación del Sistema para la Actualización
  • Realización de la Actualización (Método 1: do-release-upgrade)
  • Métodos Alternativos de Actualización
  • Solución de Problemas Comunes
  • Verificación y Limpieza Posterior a la Actualización
  • Reversión de Actualizaciones Fallidas
  • Mejores Prácticas para Sistemas en Producción
  • Automatización de Actualizaciones a Escala
  • Conclusión

Introducción

Las versiones Ubuntu LTS (Long Term Support) reciben cinco años de soporte estándar y cinco años adicionales de mantenimiento de seguridad extendido a través de Ubuntu Pro. Las versiones LTS principales se lanzan bienalmente en abril, incluyendo versiones recientes:

  • Ubuntu 20.04 LTS (Focal Fossa) - Abril 2020
  • Ubuntu 22.04 LTS (Jammy Jellyfish) - Abril 2022
  • Ubuntu 24.04 LTS (Noble Numbat) - Abril 2024

La actualización entre versiones LTS trae mejoras de seguridad, actualizaciones del kernel, versiones más nuevas de software y mejoras de rendimiento. Sin embargo, el proceso de actualización también introduce riesgos incluyendo:

  • Problemas de compatibilidad de aplicaciones con versiones más nuevas de bibliotecas
  • Conflictos de archivos de configuración que requieren resolución manual
  • Cambios del kernel que afectan a controladores o módulos personalizados
  • Conflictos de repositorios de terceros
  • Interrupción del servicio durante el proceso de actualización

Un enfoque metódico para las actualizaciones LTS minimiza estos riesgos mientras maximiza los beneficios de las versiones más nuevas de Ubuntu. Esta guía enfatiza la preparación, las pruebas y la verificación para asegurar actualizaciones exitosas en entornos de producción.

Comprensión del Ciclo de Versiones de Ubuntu LTS

Antes de planificar tu actualización, comprende la estructura de versión y soporte de Ubuntu.

Línea de Tiempo de Soporte LTS

# Verificar la versión actual de Ubuntu
lsb_release -a

# Ejemplo de salida:
# Distributor ID: Ubuntu
# Description:    Ubuntu 22.04.3 LTS
# Release:        22.04
# Codename:       jammy

Períodos de Soporte de Ubuntu LTS:

VersiónNombreLanzamientoFin del Soporte EstándarFin de ESM
20.04 LTSFocal FossaAbril 2020Abril 2025Abril 2030
22.04 LTSJammy JellyfishAbril 2022Abril 2027Abril 2032
24.04 LTSNoble NumbatAbril 2024Abril 2029Abril 2034

Ruta de Actualización de LTS a LTS

Ubuntu oficialmente soporta actualizaciones directas solo entre versiones LTS consecutivas:

# Rutas de actualización soportadas:
# 20.04 LTS → 22.04 LTS → 24.04 LTS

# NO soportado (saltar versiones):
# 20.04 LTS → 24.04 LTS  # Debe pasar por 22.04

Consideraciones de Versiones Puntuales

Ubuntu habilita actualizaciones LTS-a-LTS después de la primera versión puntual (X.04.1) de la nueva versión LTS:

# Verificar si se ofrecen actualizaciones a la siguiente LTS
/usr/lib/ubuntu-release-upgrader/check-new-release-gtk

# Las actualizaciones LTS típicamente están disponibles después de:
# - Lanzamiento de 22.04.1 (aproximadamente julio 2022 para 22.04)
# - Los administradores del sistema pueden actualizar inmediatamente después del lanzamiento .0
# - Los usuarios de escritorio ven notificaciones después del lanzamiento .1

Planificación y Evaluación Previa a la Actualización

Una planificación exhaustiva previene fallos de actualización y reduce el tiempo de inactividad.

Inventario del Sistema y Documentación

#!/bin/bash
# Crear inventario completo del sistema

REPORT_DIR="/root/upgrade-prep-$(date +%Y%m%d)"
mkdir -p "$REPORT_DIR"

echo "Creando inventario del sistema para planificación de actualización..."

# Información actual del sistema
hostnamectl > "$REPORT_DIR/system-info.txt"
lsb_release -a >> "$REPORT_DIR/system-info.txt"
uname -a >> "$REPORT_DIR/kernel-info.txt"

# Información de hardware
lscpu > "$REPORT_DIR/cpu-info.txt"
free -h > "$REPORT_DIR/memory-info.txt"
df -h > "$REPORT_DIR/disk-info.txt"
lsblk >> "$REPORT_DIR/disk-info.txt"

# Paquetes instalados
dpkg -l > "$REPORT_DIR/installed-packages.txt"
apt-mark showmanual > "$REPORT_DIR/manually-installed.txt"

# Servicios en ejecución
systemctl list-units --type=service --state=running > "$REPORT_DIR/running-services.txt"

# Configuración de red
ip addr show > "$REPORT_DIR/network-config.txt"
ip route show >> "$REPORT_DIR/network-config.txt"
cat /etc/netplan/*.yaml > "$REPORT_DIR/netplan-config.txt" 2>/dev/null

# Módulos del kernel
lsmod > "$REPORT_DIR/loaded-modules.txt"

# Repositorios de terceros
grep -r --include '*.list' '^deb ' /etc/apt/ > "$REPORT_DIR/repositories.txt"

# Configuraciones personalizadas
find /etc -name '*.conf' -type f -exec ls -la {} \; > "$REPORT_DIR/config-files.txt"

echo "Inventario guardado en $REPORT_DIR"

Evaluación de Compatibilidad

Verificar Compatibilidad de Aplicaciones:

# Identificar aplicaciones críticas
systemctl list-units --type=service --state=running | grep -v '@'

# Verificar cada servicio crítico para compatibilidad
# Ejemplo: Verificar compatibilidad de versión de PHP
php -v

# Verificar versiones de base de datos
mysql --version
psql --version

# Verificar versiones de servidor web
nginx -v
apache2 -v

Investigar Problemas Conocidos:

# Buscar notas de versión de Ubuntu
# Visitar: https://wiki.ubuntu.com/JammyJellyfish/ReleaseNotes

# Verificar compatibilidad de aplicaciones específicas
apt-cache policy nombre-aplicación

# Revisar changelog para paquetes principales
apt-get changelog nombre-paquete | less

Estimar Ventana de Tiempo de Inactividad

# Calcular tiempo estimado de actualización basado en:
# - Número de paquetes a actualizar
# - Ancho de banda de red
# - Recursos del sistema

# Verificar número de paquetes
apt list --upgradable | wc -l

# Estimar tamaño de descarga
apt-get -s dist-upgrade | grep "Need to get"

# Tiempos típicos de actualización:
# - Sistema pequeño (< 500 paquetes): 30-60 minutos
# - Sistema mediano (500-1000 paquetes): 1-2 horas
# - Sistema grande (> 1000 paquetes): 2-4 horas
# Agregar tiempo adicional para problemas inesperados

Crear Documento de Plan de Actualización

cat << 'EOF' > /root/upgrade-plan.md
## Plan de Actualización de Ubuntu LTS

### Información del Sistema
- Nombre del host: production-web-01
- Versión Actual: Ubuntu 20.04.6 LTS
- Versión Objetivo: Ubuntu 22.04.3 LTS
- Rol: Servidor de Aplicación Web

### Lista de Verificación Previa a la Actualización
- [ ] Respaldo completo del sistema completado
- [ ] Compatibilidad de aplicaciones verificada
- [ ] Repositorios de terceros documentados
- [ ] Ventana de mantenimiento programada
- [ ] Procedimiento de reversión documentado
- [ ] Equipo notificado
- [ ] Alertas de monitoreo configuradas

### Ventana de Actualización
- Fecha: 2024-12-15
- Hora de Inicio: 02:00 UTC
- Duración Estimada: 2 horas
- Duración Máxima: 4 horas

### Plan de Reversión
- Snapshot disponible: Sí
- Ubicación del snapshot: /backup/snapshots/pre-upgrade-20241215
- Reversión probada: Sí
- Duración de reversión: 30 minutos

### Servicios Críticos
1. Servidor web Nginx
2. Base de datos PostgreSQL
3. Caché Redis
4. Workers de aplicación (Celery)

### Criterios de Éxito
- [ ] El sistema arranca exitosamente
- [ ] Todos los servicios críticos en ejecución
- [ ] La aplicación responde correctamente
- [ ] Sin errores críticos en los logs
- [ ] Métricas de rendimiento aceptables
EOF

Estrategias de Respaldo y Recuperación ante Desastres

Nunca actualices sin respaldos completos y procedimientos de recuperación probados.

Respaldo Completo del Sistema

#!/bin/bash
# Respaldo completo del sistema antes de la actualización

BACKUP_DIR="/backup/pre-upgrade-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

echo "Iniciando respaldo completo del sistema..."

# Respaldar sistema completo (excluyendo sistemas de archivos virtuales)
sudo tar --exclude=/backup \
         --exclude=/proc \
         --exclude=/tmp \
         --exclude=/mnt \
         --exclude=/dev \
         --exclude=/sys \
         --exclude=/run \
         --exclude=/media \
         --exclude=/var/cache \
         --exclude=/var/tmp \
         -czf "$BACKUP_DIR/system-backup.tar.gz" /

echo "Respaldo del sistema completado: $BACKUP_DIR/system-backup.tar.gz"
echo "Tamaño del respaldo: $(du -sh $BACKUP_DIR/system-backup.tar.gz)"

# Respaldar configuraciones críticas por separado
tar -czf "$BACKUP_DIR/etc-backup.tar.gz" /etc
tar -czf "$BACKUP_DIR/home-backup.tar.gz" /home

# Crear lista de paquetes instalados
dpkg --get-selections > "$BACKUP_DIR/package-selections.txt"

Respaldos de Bases de Datos

#!/bin/bash
# Respaldar bases de datos antes de la actualización

BACKUP_DIR="/backup/databases-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

# Respaldo de MySQL/MariaDB
if systemctl is-active --quiet mysql; then
    echo "Respaldando bases de datos MySQL..."
    mysqldump --all-databases --single-transaction --quick --lock-tables=false \
        > "$BACKUP_DIR/mysql-all-databases.sql"
    gzip "$BACKUP_DIR/mysql-all-databases.sql"
fi

# Respaldo de PostgreSQL
if systemctl is-active --quiet postgresql; then
    echo "Respaldando bases de datos PostgreSQL..."
    sudo -u postgres pg_dumpall > "$BACKUP_DIR/postgresql-all-databases.sql"
    gzip "$BACKUP_DIR/postgresql-all-databases.sql"
fi

echo "Respaldos de bases de datos completados en $BACKUP_DIR"

Respaldos Basados en Snapshots (Máquinas Virtuales)

# Para entornos VMware
# Tomar snapshot antes de la actualización
# Nombre: "Pre-upgrade to 22.04 - $(date +%Y%m%d)"

# Para VirtualBox
VBoxManage snapshot "Ubuntu-Server" take "Pre-Ubuntu-22.04-Upgrade" \
    --description "Snapshot antes de actualizar de 20.04 a 22.04"

# Para sistemas basados en LVM
# Crear snapshot LVM
sudo lvcreate -L 20G -s -n root-snapshot /dev/vg0/root

# Para instancias en la nube (AWS)
# Crear AMI o snapshot EBS
aws ec2 create-image --instance-id i-1234567890abcdef0 \
    --name "Pre-upgrade-ubuntu-2204-$(date +%Y%m%d)" \
    --description "Respaldo antes de la actualización de Ubuntu 22.04"

Verificar Integridad del Respaldo

#!/bin/bash
# Verificar integridad del respaldo

BACKUP_FILE="/backup/pre-upgrade-20241215/system-backup.tar.gz"

echo "Verificando integridad del respaldo..."

# Probar integridad del archivo
if tar -tzf "$BACKUP_FILE" > /dev/null; then
    echo "✓ El archivo de respaldo es válido"
else
    echo "✗ ¡El archivo de respaldo está corrupto!"
    exit 1
fi

# Verificar tamaño del respaldo
SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)
echo "Tamaño del respaldo: $SIZE"

# Listar muestra del contenido del respaldo
echo "Muestra del contenido del respaldo:"
tar -tzf "$BACKUP_FILE" | head -20

# Calcular checksum
sha256sum "$BACKUP_FILE" > "$BACKUP_FILE.sha256"
echo "Checksum guardado en $BACKUP_FILE.sha256"

Pruebas del Proceso de Actualización

Siempre prueba la actualización en un sistema que no sea de producción primero.

Crear Entorno de Prueba

# Opción 1: Clonar máquina virtual
# Crear copia exacta del sistema de producción

# Opción 2: Usar snapshot de la nube
# AWS - Lanzar instancia desde snapshot
aws ec2 run-instances --image-id ami-snapshot-id \
    --instance-type t3.medium \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=upgrade-test}]'

# Opción 3: Clonar contenedor LXD
lxc copy production-server upgrade-test
lxc start upgrade-test

# Opción 4: VM local con Vagrant
vagrant init ubuntu/focal64
vagrant up
vagrant ssh

Ejecutar Actualización de Prueba

#!/bin/bash
# Procedimiento de actualización de prueba

echo "Iniciando actualización de prueba en sistema no productivo..."

# Actualizar sistema actual
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y

# Limpiar caché de paquetes
sudo apt clean

# Reiniciar si el kernel se actualizó
if [ -f /var/run/reboot-required ]; then
    echo "Reinicio requerido, reiniciando sistema de prueba..."
    sudo reboot
    # Esperar y reconectar
fi

# Realizar actualización
sudo do-release-upgrade -d  # -d para versión de desarrollo si se prueba temprano

# Documentar cualquier problema encontrado
# Anotar conflictos de archivos de configuración
# Registrar servicios que fallaron al iniciar

Documentar Resultados de Prueba

cat << 'EOF' > /root/test-upgrade-results.md
## Resultados de Actualización de Prueba

### Entorno de Prueba
- Fecha: 2024-12-10
- Sistema: Clon de production-web-01
- De: Ubuntu 20.04.6 LTS
- A: Ubuntu 22.04.3 LTS

### Proceso de Actualización
- Hora de inicio: 14:30
- Hora de finalización: 16:15
- Duración: 1 hora 45 minutos
- Tamaño de descarga: 1.2 GB
- Paquetes actualizados: 847

### Problemas Encontrados
1. **Cambio de versión de PHP (7.4 → 8.1)**
   - Acción: Código de aplicación actualizado
   - Tiempo: 30 minutos

2. **Conflicto de configuración de PostgreSQL**
   - Archivo: /etc/postgresql/14/main/postgresql.conf
   - Acción: Mantener versión local
   - Verificado: Funcionando correctamente

3. **Fallo de servicio systemd personalizado**
   - Servicio: custom-app.service
   - Problema: Directiva obsoleta
   - Solución: Archivo de servicio actualizado

### Estado Posterior a la Actualización
- ✓ El sistema arranca exitosamente
- ✓ Todos los servicios iniciados
- ✓ Aplicación funcional
- ✓ Base de datos accesible
- ✓ Rendimiento aceptable

### Recomendaciones
1. Actualizar código PHP antes de la actualización en producción
2. Revisar cambios de configuración de PostgreSQL
3. Actualizar servicios systemd personalizados
4. Asignar ventana de mantenimiento de 2 horas
5. Tener administrador de base de datos de guardia
EOF

Preparación del Sistema para la Actualización

La preparación adecuada previene la mayoría de los problemas de actualización.

Actualizar Sistema Actual

#!/bin/bash
# Actualizar completamente el sistema actual antes de actualizar

echo "Actualizando sistema Ubuntu 20.04 actual..."

# Actualizar listas de paquetes
sudo apt update

# Actualizar todos los paquetes instalados
sudo apt upgrade -y

# Realizar actualización de distribución (dentro de la versión actual)
sudo apt dist-upgrade -y

# Eliminar paquetes no utilizados
sudo apt autoremove -y

# Limpiar caché de paquetes
sudo apt autoclean

echo "Sistema actual completamente actualizado"

Resolver Problemas de Paquetes

# Verificar paquetes rotos
sudo dpkg --configure -a
sudo apt --fix-broken install

# Verificar paquetes retenidos
apt-mark showhold

# Si hay paquetes retenidos, investigar por qué
# Liberar retención si es seguro
# sudo apt-mark unhold nombre-paquete

# Verificar que no hay paquetes en estado inconsistente
sudo dpkg --audit

Deshabilitar Repositorios de Terceros

#!/bin/bash
# Deshabilitar repositorios de terceros antes de la actualización

echo "Deshabilitando repositorios de terceros..."

# Respaldar configuración de repositorio
sudo cp -r /etc/apt/sources.list.d /etc/apt/sources.list.d.backup

# Deshabilitar repositorios PPA
sudo mv /etc/apt/sources.list.d/ppa-*.list /etc/apt/sources.list.d.backup/

# Alternativa: Comentar fuentes de terceros
sudo sed -i 's/^deb /#deb /g' /etc/apt/sources.list.d/*.list

# Mantener solo repositorios oficiales de Ubuntu
sudo apt update

echo "Repositorios de terceros deshabilitados"
echo "Rehabilitar después de completar la actualización"

Eliminar Paquetes Obsoletos

# Eliminar kernels antiguos (mantener actual y uno anterior)
sudo apt autoremove --purge

# Eliminar paquetes obsoletos
sudo apt remove --purge $(dpkg -l | grep '^rc' | awk '{print $2}')

# Verificar paquetes instalados manualmente que puedan conflictuar
apt list --installed | grep -v "$(lsb_release -cs)"

Liberar Espacio en Disco

#!/bin/bash
# Asegurar suficiente espacio en disco para la actualización

echo "Verificando espacio disponible en disco..."

# Verificar espacio en partición raíz
ROOT_AVAILABLE=$(df -h / | tail -1 | awk '{print $4}')
echo "Espacio disponible en /: $ROOT_AVAILABLE"

# La actualización requiere al menos 5GB libres en /
if [ $(df / | tail -1 | awk '{print $4}') -lt 5242880 ]; then
    echo "ADVERTENCIA: Menos de 5GB libres en /"
    echo "Liberando espacio..."

    # Limpiar caché de paquetes
    sudo apt clean

    # Eliminar archivos de log antiguos
    sudo journalctl --vacuum-time=7d

    # Limpiar archivos temporales
    sudo rm -rf /tmp/*
    sudo rm -rf /var/tmp/*

    # Eliminar kernels antiguos
    sudo apt autoremove --purge
fi

# Verificar espacio después de la limpieza
df -h /

Respaldar y Actualizar Archivos de Configuración

#!/bin/bash
# Respaldar archivos de configuración antes de la actualización

CONFIG_BACKUP="/root/config-backup-$(date +%Y%m%d)"
mkdir -p "$CONFIG_BACKUP"

# Respaldar configuraciones críticas
sudo cp -r /etc/netplan "$CONFIG_BACKUP/"
sudo cp -r /etc/nginx "$CONFIG_BACKUP/"
sudo cp -r /etc/apache2 "$CONFIG_BACKUP/"
sudo cp -r /etc/mysql "$CONFIG_BACKUP/"
sudo cp -r /etc/postgresql "$CONFIG_BACKUP/"
sudo cp -r /etc/ssh "$CONFIG_BACKUP/"
sudo cp /etc/fstab "$CONFIG_BACKUP/"
sudo cp /etc/hosts "$CONFIG_BACKUP/"

# Crear archivo tar
cd /root
tar -czf config-backup-$(date +%Y%m%d).tar.gz config-backup-$(date +%Y%m%d)/

echo "Respaldo de configuración guardado en $CONFIG_BACKUP"

Realización de la Actualización (Método 1: do-release-upgrade)

El método oficial y recomendado para actualizar versiones Ubuntu LTS.

Actualizar Configuración del Actualizador de Versiones

# Configurar para permitir actualizaciones de LTS a LTS
sudo nano /etc/update-manager/release-upgrades

# Asegurar que esta línea esté presente:
# Prompt=lts

# Esto asegura que solo se ofrezcan versiones LTS para actualización

Verificar Actualizaciones Disponibles

# Verificar si hay una nueva versión LTS disponible
sudo do-release-upgrade -c

# Ejemplo de salida:
# Checking for a new Ubuntu release
# New release '22.04.3 LTS' available.
# Run 'do-release-upgrade' to upgrade to it.

Iniciar el Proceso de Actualización

#!/bin/bash
# Realizar la actualización real

# Asegurar que estás en una sesión de terminal estable
# Usar screen o tmux para conexiones SSH para prevenir problemas de desconexión

# Iniciar sesión de screen
screen -S upgrade

# O iniciar sesión de tmux
# tmux new -s upgrade

# Comenzar actualización
sudo do-release-upgrade

# La herramienta de actualización hará:
# 1. Verificar disponibilidad del sistema
# 2. Calcular cambios requeridos
# 3. Descargar paquetes
# 4. Instalar nuevos paquetes
# 5. Manejar conflictos de archivos de configuración
# 6. Eliminar paquetes obsoletos
# 7. Solicitar reinicio

Manejo de Conflictos de Archivos de Configuración

Durante la actualización, encontrarás conflictos de archivos de configuración:

# Aviso típico:
# Configuration file '/etc/nginx/nginx.conf'
#  ==> Modified (by you or by a script) since installation.
#  ==> Package distributor has shipped an updated version.
#    What would you like to do about it?
#  Your options are:
#   Y or I  : install the package maintainer's version
#   N or O  : keep your currently-installed version
#   D       : show the differences between the versions
#   Z       : start a shell to examine the situation

# Mejor práctica: Elegir 'D' para ver diferencias
# Luego decidir basándose en tus personalizaciones

# Para archivos que has modificado mucho: Elegir 'N' (mantener)
# Para archivos que no has modificado: Elegir 'Y' (instalar nuevo)

# Siempre puedes fusionar cambios después

Monitorear Progreso de Actualización

# En otra terminal (si está disponible)
# Monitorear E/S de disco
iostat -x 5

# Monitorear actividad de red
iftop

# Observar syslog
tail -f /var/log/syslog

# Monitorear actividad de procesos
htop

Completar la Actualización

# Después de que la instalación de paquetes se complete
# Eliminar paquetes obsoletos cuando se solicite
# Reiniciar cuando se solicite

sudo reboot

# Después del reinicio, verificar nueva versión
lsb_release -a

# La salida debería mostrar:
# Description:    Ubuntu 22.04.3 LTS
# Release:        22.04

Métodos Alternativos de Actualización

Aunque do-release-upgrade es recomendado, existen métodos alternativos.

Actualización Manual vía APT

#!/bin/bash
# Solo usuarios avanzados - método de actualización manual

# Actualizar sources.list a nueva versión
sudo sed -i 's/focal/jammy/g' /etc/apt/sources.list

# Actualizar listas de paquetes
sudo apt update

# Actualizar paquetes
sudo apt upgrade -y
sudo apt dist-upgrade -y

# Instalar nueva base de Ubuntu
sudo apt install ubuntu-desktop  # o ubuntu-server

# Reiniciar
sudo reboot

# Nota: Este método NO está oficialmente soportado
# Usar solo si do-release-upgrade falla

Actualización desde Medios de Instalación

# Si la actualización del sistema falla, arrancar desde USB de Ubuntu 22.04
# Elegir "Actualizar Ubuntu 20.04 a 22.04"
# Los datos y configuraciones existentes se preservan

# Este método requiere:
# - Acceso a medios físicos o virtuales
# - Tiempo de inactividad potencial
# - Intervención manual

Solución de Problemas Comunes

Incluso las actualizaciones bien planificadas pueden encontrar problemas.

La Actualización No Inicia

# Problema: do-release-upgrade reporta que no hay nueva versión

# Solución 1: Verificar configuración de actualización de versión
cat /etc/update-manager/release-upgrades
# Asegurar: Prompt=lts

# Solución 2: Forzar verificación para versión de desarrollo
sudo do-release-upgrade -d

# Solución 3: Actualizar actualizador de versión
sudo apt update
sudo apt install ubuntu-release-upgrader-core

# Solución 4: Verificar si estás en la última versión puntual
sudo apt update && sudo apt dist-upgrade

Conflictos de Dependencias de Paquetes

# Problema: Dependencias no resueltas durante la actualización

# Ver información detallada de dependencias
apt-cache depends nombre-paquete
apt-cache rdepends nombre-paquete

# Intentar arreglar paquetes rotos
sudo apt --fix-broken install
sudo dpkg --configure -a

# Eliminar paquete conflictivo temporalmente
sudo apt remove paquete-conflictivo

# Reintentar actualización
sudo do-release-upgrade

Conexión SSH Perdida Durante la Actualización

# Prevención: Usar screen o tmux

# Iniciar screen antes de la actualización
screen -S ubuntu-upgrade

# Si se desconecta, reconectar
screen -r ubuntu-upgrade

# Recuperación si la actualización se interrumpió:
# Reconectar al servidor (puede requerirse acceso a consola)

# Continuar actualización interrumpida
sudo dpkg --configure -a
sudo apt --fix-broken install
sudo apt dist-upgrade

Fallo de Arranque Después de la Actualización

# Acceder al sistema vía modo de recuperación o disco de rescate

# Montar sistema de archivos raíz
mount /dev/sda1 /mnt  # ajustar dispositivo según sea necesario

# Chroot al sistema
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt

# Reparar cargador de arranque GRUB
update-grub
grub-install /dev/sda

# Arreglar problemas de paquetes
dpkg --configure -a
apt --fix-broken install

# Salir de chroot y reiniciar
exit
umount /mnt/dev /mnt/proc /mnt/sys
umount /mnt
reboot

Los Servicios No Inician

# Verificar estado del servicio
systemctl status nombre-servicio

# Ver logs del servicio
journalctl -u nombre-servicio -n 50

# Verificar problemas de archivo de configuración
nombre-servicio -t  # probar configuración (nginx, apache2)

# Restaurar configuración desde respaldo si es necesario
sudo cp /root/config-backup-20241215/nginx/nginx.conf /etc/nginx/

# Reiniciar servicio
sudo systemctl restart nombre-servicio

Pánico del Kernel o Inestabilidad del Sistema

# Arrancar en kernel anterior desde el menú GRUB
# Mantener Shift durante el arranque para acceder a GRUB
# Seleccionar "Advanced options"
# Elegir versión anterior del kernel

# Después de arrancar en kernel antiguo
# Eliminar nuevo kernel problemático
sudo apt remove linux-image-5.15.0-*

# Retener versión del kernel temporalmente
sudo apt-mark hold linux-image-generic

# Investigar problemas del kernel
dmesg | less
journalctl -k

# Cuando se resuelva, liberar retención del kernel
sudo apt-mark unhold linux-image-generic

Verificación y Limpieza Posterior a la Actualización

La verificación exhaustiva asegura que la actualización se completó correctamente.

Lista de Verificación de Verificación del Sistema

#!/bin/bash
# Verificación completa posterior a la actualización

echo "Lista de Verificación de Verificación Posterior a la Actualización"
echo "==================================================================="

# Verificar versión de Ubuntu
echo -n "Versión de Ubuntu: "
lsb_release -rs

# Verificar versión del kernel
echo -n "Versión del kernel: "
uname -r

# Verificar estado del sistema
echo -n "Sistema degradado: "
systemctl is-system-running

# Listar servicios fallidos
echo "Servicios fallidos:"
systemctl list-units --state=failed

# Verificar espacio en disco
echo "Espacio en disco:"
df -h / | tail -1

# Verificar conectividad de red
echo -n "Conectividad a Internet: "
ping -c 1 google.com > /dev/null 2>&1 && echo "OK" || echo "FALLIDO"

# Verificar resolución DNS
echo -n "Resolución DNS: "
nslookup ubuntu.com > /dev/null 2>&1 && echo "OK" || echo "FALLIDO"

# Listar problemas de paquetes
echo "Problemas de paquetes:"
dpkg --audit

echo "Verificación completa"

Pruebas de Aplicaciones

#!/bin/bash
# Probar aplicaciones críticas

# Servidor web
if systemctl is-active --quiet nginx; then
    curl -I http://localhost
    echo "✓ Nginx respondiendo"
fi

# Base de datos
if systemctl is-active --quiet postgresql; then
    sudo -u postgres psql -c "SELECT version();"
    echo "✓ PostgreSQL respondiendo"
fi

# Pruebas específicas de aplicación
# Agregar verificaciones de salud de tu aplicación aquí
curl http://localhost:8000/health
systemctl status custom-app.service

Revisar Archivos de Log

# Verificar errores en logs del sistema
sudo journalctl -p err -b

# Verificar logs de servicios específicos
sudo journalctl -u nginx.service -b
sudo journalctl -u postgresql.service -b

# Verificar mensajes del kernel
sudo dmesg | grep -i error

# Revisar log de autenticación
sudo tail -100 /var/log/auth.log

# Verificar problemas de seguridad
sudo grep -i "failure" /var/log/auth.log

Rehabilitar Repositorios de Terceros

#!/bin/bash
# Rehabilitar repositorios de terceros para nueva versión

echo "Rehabilitando repositorios de terceros..."

# Actualizar nombres de versión de repositorio
# focal → jammy para Ubuntu 22.04

sudo sed -i 's/focal/jammy/g' /etc/apt/sources.list.d/*.list

# O restaurar y actualizar desde respaldo
# sudo cp -r /etc/apt/sources.list.d.backup/* /etc/apt/sources.list.d/
# sudo sed -i 's/focal/jammy/g' /etc/apt/sources.list.d/*.list

# Actualizar listas de paquetes
sudo apt update

# Arreglar cualquier problema de repositorio
# Algunos PPAs pueden no soportar la nueva versión aún

echo "Repositorios de terceros actualizados"

Limpiar Paquetes Obsoletos

# Eliminar versiones antiguas del kernel (mantener actual y uno anterior)
sudo apt autoremove --purge -y

# Eliminar paquetes obsoletos
sudo apt autopurge -y

# Limpiar caché de paquetes
sudo apt clean

# Eliminar archivos de configuración de paquetes eliminados
sudo dpkg --purge $(dpkg -l | grep '^rc' | awk '{print $2}')

# Verificar problemas residuales
sudo deborphan  # instalar: sudo apt install deborphan

Actualizar Monitoreo y Alertas

# Actualizar configuraciones de monitoreo para nueva versión del SO
# Actualizar umbrales de alerta si es necesario
# Verificar que los agentes de monitoreo aún funcionen

# Ejemplo: Actualizar node_exporter para Prometheus
systemctl status node_exporter

# Ejemplo: Actualizar dashboards de monitoreo
# Actualizar etiquetas de versión del SO en Grafana
# Actualizar reglas de alerta para nueva versión del kernel

Reversión de Actualizaciones Fallidas

Si la actualización falla críticamente, los procedimientos de reversión restauran el estado anterior.

Restaurar desde Snapshot (Máquinas Virtuales)

# VMware: Revertir a snapshot
# 1. Apagar VM
# 2. Clic derecho en VM → Snapshot → Revertir a snapshot
# 3. Seleccionar snapshot previo a la actualización
# 4. Encender VM

# VirtualBox: Restaurar snapshot
VBoxManage controlvm "Ubuntu-Server" poweroff
VBoxManage snapshot "Ubuntu-Server" restore "Pre-Ubuntu-22.04-Upgrade"
VBoxManage startvm "Ubuntu-Server" --type headless

# Instancia en la nube (AWS): Lanzar desde AMI
aws ec2 run-instances --image-id ami-backup-id \
    --instance-type t3.medium \
    --subnet-id subnet-xxxxx \
    --security-group-ids sg-xxxxx

Restaurar desde Snapshot LVM

# Fusionar snapshot LVM de vuelta al volumen original
sudo lvconvert --merge /dev/vg0/root-snapshot

# Reiniciar para completar fusión
sudo reboot

# Después del reinicio, el volumen del snapshot se elimina
# Volumen original restaurado al estado previo a la actualización

Restaurar desde Respaldo Tar

#!/bin/bash
# Restaurar desde respaldo tar (último recurso)

# Arrancar desde USB en vivo/modo de recuperación
# Montar sistema de archivos raíz
mount /dev/sda1 /mnt

# Limpiar sistema actual
rm -rf /mnt/*

# Restaurar desde respaldo
cd /mnt
tar -xzf /backup/pre-upgrade-20241215/system-backup.tar.gz

# Reinstalar GRUB
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
grub-install /dev/sda
update-grub

# Salir y reiniciar
exit
umount /mnt/dev /mnt/proc /mnt/sys
umount /mnt
reboot

Degradar Paquetes Específicos

# Si solo paquetes específicos son problemáticos
# Degradar a versión anterior

# Listar versiones de paquete disponibles
apt-cache policy nombre-paquete

# Instalar versión específica
sudo apt install nombre-paquete=versión

# Retener paquete en versión actual
sudo apt-mark hold nombre-paquete

# Ejemplo: Degradar PHP
sudo apt install php=7.4* -y
sudo apt-mark hold php*

Mejores Prácticas para Sistemas en Producción

Minimizar riesgo y tiempo de inactividad en entornos de producción.

Estrategia de Despliegue Escalonado

# 1. Entorno de prueba: Semana 1
# 2. Entorno de desarrollo: Semana 2
# 3. Entorno de staging: Semana 3
# 4. Producción (1 servidor): Semana 4
# 5. Producción (servidores restantes): Semanas 5-8

# Monitorear cada etapa para problemas antes de proceder

Despliegue Blue-Green

# Mantener infraestructura paralela
# Blue: Servidores Ubuntu 20.04 actuales
# Green: Nuevos servidores Ubuntu 22.04

# 1. Desplegar aplicación en nuevos servidores 22.04
# 2. Probar exhaustivamente
# 3. Cambiar tráfico a nuevos servidores
# 4. Monitorear para problemas
# 5. Mantener servidores antiguos para reversión rápida
# 6. Desmantelar servidores antiguos después de confirmar estabilidad

# Cambio de balanceador de carga
# Actualizar DNS o balanceador de carga para apuntar a nuevos servidores

Automatizar con Gestión de Configuración

# Playbook de Ansible para actualización de Ubuntu
---
- name: Actualizar Ubuntu LTS
  hosts: ubuntu_servers
  serial: 1  # Actualizar un servidor a la vez

  tasks:
    - name: Actualizar todos los paquetes
      apt:
        update_cache: yes
        upgrade: dist

    - name: Verificar si se requiere reinicio
      stat:
        path: /var/run/reboot-required
      register: reboot_required

    - name: Reiniciar si es necesario
      reboot:
        reboot_timeout: 300
      when: reboot_required.stat.exists

    - name: Realizar actualización de versión
      command: do-release-upgrade -f DistUpgradeViewNonInteractive
      register: upgrade_result

    - name: Reiniciar después de la actualización
      reboot:
        reboot_timeout: 600

Planificación de Ventana de Mantenimiento

# Programar ventana de mantenimiento
cat << 'EOF'
Notificación de Ventana de Mantenimiento

Servicio: Servidores Web de Producción
Fecha: 15 de diciembre de 2024
Hora: 02:00 - 06:00 UTC (ventana de 4 horas)
Impacto Esperado: Interrupción del servicio
Duración Esperada: 2 horas
Razón: Actualización de Ubuntu LTS (20.04 → 22.04)

Plan de Reversión: Disponible en 30 minutos si ocurren problemas
Contacto de Soporte: [email protected]
Página de Estado: https://status.example.com
EOF

Automatización de Actualizaciones a Escala

Gestionar docenas o cientos de servidores requiere automatización.

Actualizaciones Desatendidas

# Configurar unattended-upgrades para actualizaciones de seguridad
sudo apt install unattended-upgrades

# Configurar actualizaciones automáticas
sudo dpkg-reconfigure --priority=low unattended-upgrades

# Editar configuración
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

# Habilitar reinicio automático si es necesario
# Unattended-Upgrade::Automatic-Reboot "true";
# Unattended-Upgrade::Automatic-Reboot-Time "03:00";

Landscape (Herramienta de Gestión de Ubuntu)

# Landscape de Canonical para gestionar múltiples sistemas Ubuntu
# Herramienta comercial con nivel gratuito para servidores limitados

# Instalar cliente de landscape
sudo apt install landscape-client

# Configurar landscape
sudo landscape-config --account-name CUENTA --computer-title "Servidor01"

# Gestionar actualizaciones a través de interfaz web

Script de Automatización Personalizado

#!/bin/bash
# Script de actualización LTS automatizado con verificaciones de seguridad

set -e  # Salir en error

LOG_FILE="/var/log/ubuntu-upgrade-$(date +%Y%m%d).log"

log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Verificaciones previas al vuelo
log "Iniciando verificaciones previas al vuelo..."

# Verificar conectividad a Internet
if ! ping -c 1 google.com > /dev/null 2>&1; then
    log "ERROR: Sin conectividad a Internet"
    exit 1
fi

# Verificar espacio en disco (necesita al menos 5GB libres)
FREE_SPACE=$(df / | tail -1 | awk '{print $4}')
if [ $FREE_SPACE -lt 5242880 ]; then
    log "ERROR: Espacio en disco insuficiente"
    exit 1
fi

# Crear respaldo
log "Creando respaldo..."
BACKUP_DIR="/backup/pre-upgrade-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/etc-backup.tar.gz" /etc
dpkg --get-selections > "$BACKUP_DIR/package-selections.txt"

# Actualizar sistema actual
log "Actualizando sistema actual..."
apt update
apt upgrade -y
apt dist-upgrade -y

# Realizar actualización
log "Iniciando actualización de versión..."
DEBIAN_FRONTEND=noninteractive do-release-upgrade -f DistUpgradeViewNonInteractive

log "Actualización completada exitosamente"

# Reiniciar
log "Reiniciando sistema..."
reboot

Conclusión

La actualización de versiones Ubuntu LTS es un proceso manejable cuando se aborda metódicamente con planificación, pruebas y procedimientos de respaldo adecuados. Aunque la herramienta do-release-upgrade de Ubuntu maneja la mayor parte de la complejidad, las actualizaciones exitosas en entornos de producción requieren preparación cuidadosa y verificación.

Conclusiones Clave:

  1. Nunca Omitas la Planificación: Documenta tu sistema, identifica dependencias y crea planes de actualización detallados antes de comenzar.

  2. Siempre Respalda: Los respaldos completos son obligatorios. Prueba los procedimientos de restauración antes de la actualización.

  3. Prueba Primero: Nunca actualices producción sin probar el procedimiento exacto en un sistema réplica primero.

  4. Usa Herramientas Oficiales: La utilidad do-release-upgrade es el método de actualización soportado y más confiable.

  5. Despliegues Escalonados: Actualiza sistemas de producción incrementalmente, monitoreando cada etapa antes de proceder.

  6. Verifica Exhaustivamente: La verificación posterior a la actualización es tan importante como la actualización misma. Prueba todos los servicios y aplicaciones críticas.

  7. Ten un Plan de Reversión: Conoce tus opciones de recuperación y practícalas antes de la ventana de actualización.

  8. Monitorea y Documenta: Registra todo durante la actualización y documenta cualquier problema para referencia futura.

Línea de Tiempo Recomendada para Actualizaciones de Producción:

  • Mes 1: Probar actualización en sistema réplica, documentar problemas
  • Mes 2: Actualizar procedimientos, probar nuevamente, entrenar equipo
  • Mes 3: Actualizar sistemas de producción no críticos
  • Mes 4-6: Despliegue escalonado a sistemas de producción críticos

Cuándo Actualizar:

Las actualizaciones Ubuntu LTS deben realizarse:

  • Antes de que la LTS actual llegue al fin de vida útil
  • Cuando las aplicaciones requieran dependencias más nuevas
  • Para acceder a características de seguridad en versiones más nuevas
  • Después de pruebas y validación exhaustivas

Cuándo Retrasar:

Considera retrasar actualizaciones cuando:

  • Las aplicaciones críticas carecen de pruebas de compatibilidad
  • Se aproximan fechas límite de proyectos importantes
  • El equipo carece de capacidad para problemas potenciales
  • La LTS actual aún tiene años de soporte restantes

Siguiendo los procedimientos descritos en esta guía, puedes actualizar con confianza sistemas Ubuntu LTS mientras minimizas riesgos y tiempo de inactividad. Recuerda que la paciencia y la minuciosidad previenen muchos más problemas de los que causan.

Próximos Pasos

Después de una actualización exitosa:

  1. Documentar lecciones aprendidas y actualizar procedimientos
  2. Entrenar miembros del equipo en nuevas características y cambios
  3. Actualizar documentación de recuperación ante desastres
  4. Revisar y optimizar configuraciones del sistema para nueva versión
  5. Planificar para el próximo ciclo de actualización LTS
  6. Suscribirse a anuncios de seguridad de Ubuntu
  7. Unirse a canales de la comunidad Ubuntu para soporte continuo

Las versiones LTS de Ubuntu proporcionan una base estable y bien soportada para sistemas de producción. Con procedimientos de actualización adecuados, puedes mantener esa estabilidad mientras te beneficias de las mejoras de seguridad, rendimiento y características en versiones más nuevas.