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ón | Nombre | Lanzamiento | Fin del Soporte Estándar | Fin de ESM |
|---|---|---|---|---|
| 20.04 LTS | Focal Fossa | Abril 2020 | Abril 2025 | Abril 2030 |
| 22.04 LTS | Jammy Jellyfish | Abril 2022 | Abril 2027 | Abril 2032 |
| 24.04 LTS | Noble Numbat | Abril 2024 | Abril 2029 | Abril 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:
-
Nunca Omitas la Planificación: Documenta tu sistema, identifica dependencias y crea planes de actualización detallados antes de comenzar.
-
Siempre Respalda: Los respaldos completos son obligatorios. Prueba los procedimientos de restauración antes de la actualización.
-
Prueba Primero: Nunca actualices producción sin probar el procedimiento exacto en un sistema réplica primero.
-
Usa Herramientas Oficiales: La utilidad do-release-upgrade es el método de actualización soportado y más confiable.
-
Despliegues Escalonados: Actualiza sistemas de producción incrementalmente, monitoreando cada etapa antes de proceder.
-
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.
-
Ten un Plan de Reversión: Conoce tus opciones de recuperación y practícalas antes de la ventana de actualización.
-
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:
- Documentar lecciones aprendidas y actualizar procedimientos
- Entrenar miembros del equipo en nuevas características y cambios
- Actualizar documentación de recuperación ante desastres
- Revisar y optimizar configuraciones del sistema para nueva versión
- Planificar para el próximo ciclo de actualización LTS
- Suscribirse a anuncios de seguridad de Ubuntu
- 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.


