Migración de CentOS a Rocky Linux o AlmaLinux

La discontinuación de CentOS Linux en diciembre de 2021 obligó a millones de administradores de sistemas a evaluar rutas de migración para su infraestructura de producción. Este cambio inesperado transformó el panorama empresarial de Linux, creando tanto desafíos como oportunidades para las organizaciones que dependían de CentOS para sus sistemas críticos.

Esta guía completa proporciona instrucciones detalladas para migrar de CentOS a Rocky Linux o AlmaLinux, dos distribuciones impulsadas por la comunidad y compatibles con RHEL que surgieron como las principales alternativas a CentOS. Ya sea que estés administrando un puñado de servidores u orquestando migraciones en cientos de sistemas, esta guía cubre planificación, ejecución, verificación y solución de problemas para transiciones exitosas.

Tabla de Contenidos

  • Introducción
  • Comprendiendo la Situación de CentOS
  • Rocky Linux vs AlmaLinux: Comparación
  • Planificación y Evaluación Pre-Migración
  • Preparación de Respaldo y Recuperación
  • Método de Migración 1: Migración In-Place (Recomendado)
  • Método de Migración 2: Instalación Limpia
  • Migrando Cargas de Trabajo Específicas
  • Verificación Post-Migración
  • Solución de Problemas Comunes
  • Migrando a Escala
  • Rutas de Migración Alternativas
  • Mejores Prácticas y Recomendaciones
  • Conclusión

Introducción

El 8 de diciembre de 2020, Red Hat anunció que CentOS Linux sería discontinuado, con CentOS 8 alcanzando el fin de vida el 31 de diciembre de 2021, y CentOS 7 recibiendo actualizaciones hasta el 30 de junio de 2024. Esta decisión redirigió el proyecto CentOS hacia CentOS Stream, una distribución de lanzamiento continuo posicionada upstream de Red Hat Enterprise Linux (RHEL) en lugar de downstream.

Este cambio eliminó el CentOS Linux estable y predecible en el que las organizaciones habían confiado durante casi dos décadas, obligando a los administradores a elegir entre:

  • Rocky Linux: Fundado por Gregory Kurtzer (fundador original de CentOS), proporcionando compatibilidad binaria 1:1 con RHEL
  • AlmaLinux: Creado por CloudLinux, ofreciendo compatibilidad con RHEL con respaldo comercial
  • CentOS Stream: El lanzamiento continuo de Red Hat, upstream de RHEL
  • RHEL: Migrar a suscripciones pagas de Red Hat
  • Distribuciones Alternativas: Moverse a Ubuntu, Debian u otras distribuciones Linux

Tanto Rocky Linux como AlmaLinux proporcionan reemplazos directos para CentOS, manteniendo compatibilidad binaria con RHEL y ofreciendo ciclos de soporte a largo plazo. Esta guía se centra en migrar a estas alternativas impulsadas por la comunidad que preservan la estabilidad y previsibilidad que hicieron popular a CentOS.

Comprendiendo la Situación de CentOS

Historia y Cronología de CentOS

# Verifica tu versión actual de CentOS
cat /etc/centos-release

# Salidas de ejemplo:
# CentOS Linux release 7.9.2009 (Core)
# CentOS Linux release 8.4.2105

Cronología Crítica:

  • Diciembre 2020: Anuncio de EOL de CentOS 8
  • 31 de diciembre de 2021: CentOS 8 alcanzó fin de vida (sin más actualizaciones)
  • 30 de junio de 2024: CentOS 7 alcanza fin de vida
  • En curso: CentOS Stream continúa como vista previa upstream de RHEL

Por Qué es Necesaria la Migración

Riesgos de Seguridad:

# Verifica el tiempo desde la última actualización de seguridad
rpm -qa --last | grep -i kernel | head -5

# Los sistemas sin actualizaciones no reciben parches de seguridad
# Las vulnerabilidades sin parchear se acumulan con el tiempo
# Los marcos de cumplimiento requieren actualizaciones de seguridad actuales

Problemas de Cumplimiento:

  • PCI-DSS requiere sistemas operativos soportados
  • HIPAA exige gestión de parches de seguridad
  • El cumplimiento SOC 2 demanda software actualizado
  • Requisitos de seguros y auditorías

Deuda Técnica:

  • Los parches de seguridad faltantes crean vulnerabilidades
  • Los paquetes de software se vuelven cada vez más obsoletos
  • El software de terceros puede eliminar el soporte
  • Las imágenes base de contenedores se vuelven inseguras

Rocky Linux vs AlmaLinux: Comparación

Ambas distribuciones tienen como objetivo reemplazar CentOS con alternativas compatibles con RHEL, pero existen diferencias sutiles.

Resumen de Rocky Linux

# Características de Rocky Linux
cat << 'EOF'
Fundado: 2020
Fundador: Gregory Kurtzer (fundador original de CentOS)
Gobernanza: Rocky Enterprise Software Foundation (liderada por la comunidad)
Financiación: Patrocinios, donaciones
Compatibilidad Binaria: 1:1 con RHEL
Ciclo de Soporte: 10 años (coincidiendo con RHEL)
Soporte Comercial: Opciones emergentes de terceros
EOF

Características Clave:

  • Estructura de gobernanza impulsada por la comunidad
  • Fuerte enfoque en principios de código abierto
  • Comunidad de desarrollo activa
  • Creciente soporte del ecosistema

Resumen de AlmaLinux

# Características de AlmaLinux
cat << 'EOF'
Fundado: 2020
Fundador: CloudLinux Inc.
Gobernanza: AlmaLinux OS Foundation (sin fines de lucro)
Financiación: Patrocinio de CloudLinux, donaciones
Compatibilidad Binaria: 1:1 con RHEL (moviéndose a compatibilidad ABI)
Ciclo de Soporte: 10 años (coincidiendo con RHEL)
Soporte Comercial: Soporte pago de CloudLinux disponible
EOF

Características Clave:

  • Respaldo comercial de CloudLinux
  • Infraestructura madura desde el día uno
  • Soporte profesional disponible
  • Fuerte enfoque en seguridad

Comparación de Características

CaracterísticaRocky LinuxAlmaLinux
Compatibilidad RHELBinaria 1:1Binaria 1:1 (ABI futuro)
GobernanzaFundación ComunitariaFundación Sin Fines de Lucro
Respaldo ComercialNingunoCloudLinux
Soporte PagoTercerosCloudLinux
Herramientas de Migraciónmigrate2rockyalmalinux-deploy
Tiempo de LanzamientoDías después de RHELDías después de RHEL
PersonalizaciónCambios mínimosCambios mínimos

¿Cuál Elegir?

Elige Rocky Linux si:

  • Prefieres gobernanza puramente comunitaria
  • Valoras la independencia de la influencia corporativa
  • Tu equipo tiene experiencia con CentOS 7
  • No requieres soporte comercial

Elige AlmaLinux si:

  • Quieres opciones de soporte comercial
  • Prefieres respaldo organizacional
  • Necesitas SLAs profesionales
  • Valoras la infraestructura de CloudLinux

Realidad: Ambas distribuciones son excelentes reemplazos de CentOS. Las diferencias son principalmente filosóficas en lugar de técnicas. Muchas organizaciones eligen basándose en preferencias de la comunidad o relaciones de proveedores existentes.

# Prueba ambas distribuciones antes de decidir
# Usa VMs o contenedores para evaluar cada una
docker run -it rockylinux:9 bash
docker run -it almalinux:9 bash

Planificación y Evaluación Pre-Migración

Las migraciones exitosas comienzan con planificación exhaustiva y evaluación del sistema.

Inventario del Sistema

#!/bin/bash
# Crea un inventario completo del sistema

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

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

# Información del sistema
hostnamectl > "$REPORT_DIR/system-info.txt"
cat /etc/centos-release >> "$REPORT_DIR/system-info.txt"
uname -a >> "$REPORT_DIR/system-info.txt"

# Detalles del 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
rpm -qa | sort > "$REPORT_DIR/installed-packages.txt"
yum repolist > "$REPORT_DIR/repositories.txt"

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

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

# Configuración de red
ip addr show > "$REPORT_DIR/network-config.txt"
ip route show >> "$REPORT_DIR/network-config.txt"

# Estado de SELinux
sestatus > "$REPORT_DIR/selinux-status.txt"

# RPMs personalizados (no de repos oficiales)
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n' | grep -v "CentOS\|Red Hat" > "$REPORT_DIR/custom-packages.txt"

echo "Inventario guardado en $REPORT_DIR"

Identificar Servicios Críticos

#!/bin/bash
# Documenta servicios críticos y sus configuraciones

cat << 'EOF' > /root/critical-services.md
## Inventario de Servicios Críticos

### Servicios Web
- Nginx: /etc/nginx/
- Apache: /etc/httpd/
- Configuraciones: Vhosts personalizados, certificados SSL

### Servicios de Base de Datos
- PostgreSQL: /var/lib/pgsql/
- MariaDB: /var/lib/mysql/
- Configuraciones: my.cnf personalizado, pg_hba.conf

### Servicios de Aplicaciones
- Aplicaciones personalizadas: /opt/applications/
- Unidades SystemD: /etc/systemd/system/
- Trabajos Cron: /etc/cron.d/, /var/spool/cron/

### Servicios de Red
- Firewalld: /etc/firewalld/
- DNS: /etc/named/
- NTP: /etc/chrony/

### Monitoreo y Registro
- Exportadores de Prometheus
- Reenvío de logs (rsyslog)
- Agentes de monitoreo
EOF

Verificar Software de Terceros

# Identifica repositorios no estándar
yum repolist all

# Verifica paquetes EPEL
rpm -qa | grep epel

# Verifica software comercial
rpm -qa | grep -E "oracle|mongodb|elastic|puppet|chef"

# Lista paquetes de repos de terceros
yum list installed | grep -v "@base\|@updates\|@extras"

# Documenta controladores propietarios
lsmod | grep -E "nvidia|amd|proprietary"

Evaluar Complejidad de Migración

cat << 'EOF' > /root/migration-complexity.md
## Evaluación de Complejidad de Migración

### Baja Complejidad (Seguro para migración in-place)
- [ ] Stack LAMP/LEMP estándar
- [ ] Usando solo repositorios oficiales de CentOS
- [ ] Sin módulos personalizados del kernel
- [ ] Configuraciones estándar
- [ ] Ambiente de pruebas disponible

### Complejidad Media (In-place posible con precaución)
- [ ] Paquetes EPEL instalados
- [ ] Repositorios de terceros (Docker, PostgreSQL)
- [ ] Configuraciones personalizadas pero bien documentadas
- [ ] Algo de software propietario
- [ ] Ambiente de pruebas limitado

### Alta Complejidad (Considerar instalación limpia)
- [ ] Kernel personalizado compilado
- [ ] Controladores propietarios
- [ ] Software comercial no soportado
- [ ] Personalizaciones extensivas
- [ ] Sin ambiente de pruebas
- [ ] Sistema de producción crítico

**Decisión**: Basado en la evaluación, elegir método de migración
EOF

Crear Cronología de Migración

cat << 'EOF' > /root/migration-timeline.md
## Cronología de Migración de CentOS a Rocky Linux

### Fase 1: Preparación (Semana 1-2)
- [ ] Completar inventario del sistema
- [ ] Documentar configuraciones
- [ ] Crear respaldos
- [ ] Configurar ambiente de pruebas
- [ ] Probar migración en réplica

### Fase 2: Pruebas (Semana 3-4)
- [ ] Realizar migración de prueba
- [ ] Validar aplicaciones
- [ ] Documentar problemas y soluciones
- [ ] Actualizar procedimientos de migración
- [ ] Capacitar al equipo en nuevos procedimientos

### Fase 3: Sistemas No Críticos (Semana 5-6)
- [ ] Migrar servidores de desarrollo
- [ ] Migrar ambientes de prueba
- [ ] Validar monitoreo
- [ ] Documentar cualquier problema

### Fase 4: Migración de Producción (Semana 7-12)
- [ ] Programar ventanas de mantenimiento
- [ ] Migrar servidores de producción (escalonado)
- [ ] Monitorear de cerca problemas
- [ ] Actualizar documentación
- [ ] Validar cumplimiento

### Fase 5: Limpieza (Semana 13-14)
- [ ] Eliminar respaldos antiguos
- [ ] Actualizar planes de recuperación de desastres
- [ ] Actualizaciones finales de documentación
- [ ] Retrospectiva del equipo
EOF

Preparación de Respaldo y Recuperación

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

Respaldo Completo del Sistema

#!/bin/bash
# Respaldo completo antes de la migración

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

echo "Iniciando respaldo completo del sistema..."

# Respaldo completo del sistema (excluyendo sistemas de archivos virtuales)
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" /

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

# Crear lista de paquetes RPM
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | sort > "$BACKUP_DIR/rpm-list.txt"

# Respaldar configuración de yum/dnf
tar -czf "$BACKUP_DIR/yum-backup.tar.gz" /etc/yum.repos.d/ /etc/yum.conf

echo "Respaldo del sistema completado: $BACKUP_DIR"
echo "Tamaño del respaldo: $(du -sh $BACKUP_DIR)"

Respaldos de Bases de Datos

#!/bin/bash
# Respaldar todas las bases de datos antes de la migración

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

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

# Respaldo de MariaDB/MySQL
if systemctl is-active --quiet mariadb; then
    echo "Respaldando MariaDB..."
    mysqldump --all-databases --single-transaction \
        --routines --triggers --events \
        > "$BACKUP_DIR/mariadb-all.sql"
    gzip "$BACKUP_DIR/mariadb-all.sql"
fi

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

Respaldos Basados en Snapshots

# Para máquinas virtuales - crear snapshot antes de la migración

# Snapshot de VMware
# Crear snapshot vía interfaz de vSphere/ESXi
# Nombre: "Pre-Rocky-Migration-$(date +%Y%m%d)"

# Snapshot de LVM
sudo lvcreate -L 20G -s -n root-pre-migration /dev/vg0/root

# Snapshots en la nube (ejemplo AWS)
aws ec2 create-snapshot \
    --volume-id vol-1234567890abcdef0 \
    --description "Pre-Rocky-Linux-migration-$(date +%Y%m%d)"

# Verificar snapshot creado
aws ec2 describe-snapshots --snapshot-ids snap-xxxxxxxxx

Método de Migración 1: Migración In-Place (Recomendado)

La migración in-place convierte CentOS a Rocky Linux o AlmaLinux sin reinstalación.

Migrando a Rocky Linux

Paso 1: Preparar el Sistema

# Actualizar CentOS a la última versión antes de la migración
sudo yum update -y

# Reiniciar si se actualizó el kernel
if [ -f /var/run/reboot-required ]; then
    echo "Reinicio requerido - por favor reinicia antes de la migración"
    # sudo reboot
fi

# Verificar que el sistema está completamente actualizado
yum check-update

Paso 2: Descargar Script de Migración

# Descargar script oficial migrate2rocky
curl https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh -o migrate2rocky.sh

# Revisar el script (recomendado)
less migrate2rocky.sh

# Hacer ejecutable
chmod +x migrate2rocky.sh

Paso 3: Ejecutar Migración

# Ejecutar script de migración
# Usar screen o tmux para sesiones SSH
screen -S rocky-migration

# Ejecutar la migración
sudo ./migrate2rocky.sh -r

# El script:
# 1. Verificará compatibilidad del sistema
# 2. Descargará repositorios de Rocky Linux
# 3. Reemplazará paquetes de CentOS con equivalentes de Rocky
# 4. Actualizará todos los paquetes
# 5. Instalará branding de Rocky

# Este proceso toma 15-60 minutos dependiendo de:
# - Número de paquetes
# - Velocidad de red
# - Recursos del sistema

Paso 4: Reiniciar y Verificar

# Reiniciar sistema después de la migración
sudo reboot

# Después del reinicio, verificar Rocky Linux
cat /etc/rocky-release
# Debería mostrar: Rocky Linux release 8.x (Green Obsidian)

# Verificar información del SO
hostnamectl

# Verificar base de datos RPM
rpm -qa | grep -i rocky

# Verificar remanentes de CentOS
rpm -qa | grep -i centos

Migrando a AlmaLinux

Paso 1: Preparar el Sistema

# Actualizar CentOS completamente
sudo yum update -y

# Limpiar caché de yum
sudo yum clean all

# Verificar que no hay paquetes rotos
rpm -Va

# Reiniciar si es necesario
if [ -f /var/run/reboot-required ]; then
    sudo reboot
fi

Paso 2: Descargar Herramienta de Migración de AlmaLinux

# Descargar script almalinux-deploy
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh

# Verificar integridad del script (opcional pero recomendado)
# Verificar SHA256 de la documentación oficial de AlmaLinux

# Hacer ejecutable
chmod +x almalinux-deploy.sh

Paso 3: Ejecutar Migración

# Ejecutar en sesión screen/tmux
screen -S alma-migration

# Ejecutar migración
sudo bash almalinux-deploy.sh

# El script:
# 1. Verificará compatibilidad del sistema
# 2. Respaldará archivos de lanzamiento actuales
# 3. Descargará repositorios de AlmaLinux
# 4. Reemplazará paquetes de CentOS
# 5. Actualizará sistema a AlmaLinux

# La migración típicamente toma 20-60 minutos

Paso 4: Verificar Migración

# Reiniciar después de la migración
sudo reboot

# Verificar instalación de AlmaLinux
cat /etc/almalinux-release
# Salida: AlmaLinux release 8.x (Sky Tiger)

# Verificar información del sistema
hostnamectl

# Verificar base de paquetes
rpm -qa | grep -i alma

# Verificar paquetes de CentOS restantes
rpm -qa | grep -i centos | grep -v centos-release

Limpieza de Paquetes Post-Migración

# Eliminar paquetes antiguos de branding de CentOS (si quedan)
sudo rpm -e --nodeps $(rpm -qa | grep -i centos-logos)
sudo rpm -e --nodeps $(rpm -qa | grep -i centos-release)

# Limpiar caché de paquetes
sudo dnf clean all

# Reconstruir base de datos RPM
sudo rpm --rebuilddb

# Actualizar todos los paquetes
sudo dnf update -y

Método de Migración 2: Instalación Limpia

Para sistemas complejos o cuando la migración in-place es demasiado arriesgada.

Procedimiento de Instalación Limpia

Paso 1: Documentar Sistema Actual

#!/bin/bash
# Documentación completa para instalación limpia

DOC_DIR="/root/fresh-install-docs-$(date +%Y%m%d)"
mkdir -p "$DOC_DIR"

# Paquetes instalados
rpm -qa > "$DOC_DIR/packages.txt"

# Configuraciones de servicios
systemctl list-unit-files --state=enabled > "$DOC_DIR/enabled-services.txt"

# Configuración de red
cp -r /etc/sysconfig/network-scripts "$DOC_DIR/"
ip addr show > "$DOC_DIR/ip-config.txt"

# Reglas de firewall
firewall-cmd --list-all-zones > "$DOC_DIR/firewall-rules.txt"

# Trabajos cron
crontab -l > "$DOC_DIR/root-crontab.txt"
ls -la /etc/cron.d/ > "$DOC_DIR/cron.d-files.txt"

# Usuarios y grupos
getent passwd > "$DOC_DIR/users.txt"
getent group > "$DOC_DIR/groups.txt"

# Ubicaciones de datos de aplicaciones
find /opt -type d -maxdepth 2 > "$DOC_DIR/opt-structure.txt"
find /var/www -type d -maxdepth 2 > "$DOC_DIR/www-structure.txt" 2>/dev/null

Paso 2: Respaldar Datos de Aplicaciones

#!/bin/bash
# Respaldar datos de aplicaciones y archivos de usuario

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

# Datos de aplicaciones web
if [ -d /var/www ]; then
    tar -czf "$BACKUP_DIR/var-www.tar.gz" /var/www
fi

# Directorios de aplicaciones
if [ -d /opt ]; then
    tar -czf "$BACKUP_DIR/opt.tar.gz" /opt
fi

# Directorios home de usuarios
tar -czf "$BACKUP_DIR/home.tar.gz" /home

# Bases de datos (formato dump)
# Ver sección de respaldo de bases de datos anterior

echo "Datos de aplicaciones respaldados en $BACKUP_DIR"

Paso 3: Instalar Rocky Linux / AlmaLinux Limpio

# Descargar ISO de fuentes oficiales
# Rocky Linux: https://rockylinux.org/download
# AlmaLinux: https://almalinux.org/get-almalinux/

# Arrancar desde medios de instalación
# Seguir asistente de instalación:
# 1. Seleccionar idioma
# 2. Configurar particiones de disco (coincidir con diseño antiguo)
# 3. Configurar red (mismo IP/hostname)
# 4. Establecer contraseña de root
# 5. Crear cuentas de usuario
# 6. Seleccionar instalación mínima o servidor
# 7. Completar instalación y reiniciar

Paso 4: Restaurar Configuración y Datos

#!/bin/bash
# Restaurar configuraciones en instalación limpia

BACKUP_DIR="/backup/fresh-install-20241215"

# Instalar paquetes del sistema antiguo
# Revisar lista e instalar paquetes necesarios
while read package; do
    dnf install -y "$package" || echo "Fallido: $package"
done < "$BACKUP_DIR/packages.txt"

# Restaurar configuraciones
tar -xzf "$BACKUP_DIR/etc-specific.tar.gz" -C /

# Restaurar datos de aplicaciones
tar -xzf "$BACKUP_DIR/var-www.tar.gz" -C /
tar -xzf "$BACKUP_DIR/opt.tar.gz" -C /

# Restaurar bases de datos
# PostgreSQL
gunzip < "$BACKUP_DIR/postgresql-all.sql.gz" | sudo -u postgres psql

# MariaDB
gunzip < "$BACKUP_DIR/mariadb-all.sql.gz" | mysql

# Establecer permisos apropiados
chown -R nginx:nginx /var/www  # o apache:apache
restorecon -R /var/www  # Restaurar contextos SELinux

# Habilitar e iniciar servicios
systemctl enable nginx postgresql
systemctl start nginx postgresql

Migrando Cargas de Trabajo Específicas

Diferentes cargas de trabajo requieren consideraciones específicas durante la migración.

Servidores Web (Apache/Nginx)

# Antes de la migración - respaldar configuraciones
tar -czf /backup/httpd-config.tar.gz /etc/httpd
tar -czf /backup/nginx-config.tar.gz /etc/nginx

# Después de la migración - verificar servidor web
systemctl status httpd
systemctl status nginx

# Probar configuración
httpd -t  # Apache
nginx -t  # Nginx

# Verificar hosts virtuales
httpd -S  # Resumen de vhost de Apache
nginx -T  # Configuración completa de Nginx

# Verificar certificados SSL
openssl x509 -in /etc/ssl/certs/cert.pem -text -noout

# Reiniciar servicios web
systemctl restart httpd nginx

Servidores de Base de Datos

# Verificación de migración de PostgreSQL
sudo -u postgres psql -c "SELECT version();"

# Verificar bases de datos
sudo -u postgres psql -l

# Verificar directorio de datos
ls -la /var/lib/pgsql/

# Verificación de MariaDB/MySQL
mysql -e "SELECT VERSION();"

# Verificar bases de datos
mysql -e "SHOW DATABASES;"

# Verificar integridad de datos
mysqlcheck --all-databases

# Verificar rendimiento
mysqladmin status

Cargas de Trabajo Docker y Contenedores

# Verificar instalación de Docker
docker --version
systemctl status docker

# Listar contenedores existentes
docker ps -a

# Listar imágenes
docker images

# Verificar redes
docker network ls

# Probar creación de contenedor
docker run hello-world

# Verificar Docker Compose
docker-compose --version

# Verificar volúmenes
docker volume ls

Nodos Kubernetes

# Después de la migración, reunirse con clúster o verificar estado del nodo

# Verificar kubelet
systemctl status kubelet

# Verificar estado del nodo
kubectl get nodes

# Verificar pods en ejecución
kubectl get pods --all-namespaces

# Verificar plugin CNI
ls -la /etc/cni/net.d/

# Verificar runtime de contenedores
crictl version

# Drenar nodo antes de la migración
kubectl drain node-name --ignore-daemonsets

# Descordonar después de la migración
kubectl uncordon node-name

Verificación Post-Migración

La verificación exhaustiva asegura el éxito de la migración.

Lista de Verificación del Sistema

#!/bin/bash
# Verificación completa post-migración

echo "Reporte de Verificación Post-Migración"
echo "===================================="
echo ""

# Versión del SO
echo "Sistema Operativo:"
cat /etc/os-release | grep "^NAME\|^VERSION"
echo ""

# Versión del Kernel
echo "Kernel:"
uname -r
echo ""

# Estado del Sistema
echo "Estado del Sistema:"
systemctl is-system-running
echo ""

# Servicios Fallidos
echo "Servicios Fallidos:"
systemctl --failed
echo ""

# Espacio en Disco
echo "Espacio en Disco:"
df -h / | tail -1
echo ""

# Memoria
echo "Memoria:"
free -h | grep Mem
echo ""

# Red
echo "Conectividad de Red:"
ping -c 3 google.com > /dev/null 2>&1 && echo "✓ Internet OK" || echo "✗ Internet FALLIDO"
echo ""

# SELinux
echo "Estado de SELinux:"
sestatus | grep "Current mode"
echo ""

# Base de Datos de Paquetes
echo "Base de Datos RPM:"
rpm -qa > /dev/null 2>&1 && echo "✓ BD RPM OK" || echo "✗ BD RPM DAÑADA"
echo ""

# Acceso a Repositorios
echo "Acceso a Repositorios:"
dnf repolist > /dev/null 2>&1 && echo "✓ Repos OK" || echo "✗ Repos FALLIDOS"
echo ""

Pruebas Específicas de Aplicaciones

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

# Respuesta del servidor web
curl -I http://localhost > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "✓ Servidor web respondiendo"
else
    echo "✗ Servidor web no respondiendo"
fi

# Conexión de base de datos
if systemctl is-active --quiet postgresql; then
    sudo -u postgres psql -c "SELECT 1;" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "✓ PostgreSQL respondiendo"
    else
        echo "✗ Conexión de PostgreSQL fallida"
    fi
fi

# Verificación de salud de aplicación personalizada
# Agregar pruebas específicas de aplicación aquí
curl http://localhost:8000/health

Verificación de Seguridad

# Verificar que SELinux está en modo enforcing
sestatus

# Verificar denegaciones AVC
ausearch -m avc -ts recent

# Verificar firewall
firewall-cmd --state
firewall-cmd --list-all

# Verificar puertos abiertos
ss -tulpn

# Verificar configuración SSH
sshd -t

# Verificar cambios no autorizados
rpm -Va | grep '^..5'  # Archivos con contenido cambiado

Solución de Problemas Comunes

Fallos de Script de Migración

# Problema: Script de migración falla con errores de dependencias

# Solución: Actualizar CentOS completamente primero
sudo yum update -y
sudo yum clean all
sudo rpm --rebuilddb

# Eliminar paquetes problemáticos
sudo rpm -e --nodeps nombre-paquete

# Reintentar migración
sudo ./migrate2rocky.sh -r

Conflictos de Paquetes

# Problema: Conflictos RPM durante la migración

# Identificar paquetes en conflicto
rpm -qa | grep -i conflict

# Eliminar conflictos manualmente
sudo rpm -e --nodeps paquete-conflictivo

# Reinstalar después de la migración
sudo dnf install nombre-paquete

Problemas de Repositorios

# Problema: No se puede acceder a repositorios después de la migración

# Limpiar caché
sudo dnf clean all
sudo rm -rf /var/cache/dnf

# Regenerar caché
sudo dnf makecache

# Verificar configuración de repositorio
ls -la /etc/yum.repos.d/

# Probar acceso a repositorio
sudo dnf repolist
sudo dnf check-update

Denegaciones de SELinux

# Problema: Servicios fallan debido a SELinux

# Verificar denegaciones
sudo ausearch -m avc -ts recent

# Establecer temporalmente en permisivo para solucionar problemas
sudo setenforce 0

# Corregir contextos de SELinux
sudo restorecon -R /var/www
sudo restorecon -R /etc/nginx

# Re-habilitar enforcing
sudo setenforce 1

# Generar política para denegaciones persistentes
sudo ausearch -m avc -ts recent | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp

Problemas de Arranque

# Problema: Sistema no arranca después de la migración

# Arrancar en modo rescate
# Seleccionar kernel más antiguo del menú GRUB

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

# Reinstalar bootloader
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg

# Salir y reiniciar
exit
reboot

Migrando a Escala

Gestionar migraciones en muchos servidores requiere automatización.

Playbook Ansible para Migración

---
# rocky-migration-playbook.yml
- name: Migrar CentOS a Rocky Linux
  hosts: centos_servers
  serial: 1  # Migrar un servidor a la vez
  become: yes

  tasks:
    - name: Crear directorio de respaldo
      file:
        path: /backup/pre-migration-{{ ansible_date_time.date }}
        state: directory

    - name: Respaldar lista de paquetes
      shell: rpm -qa > /backup/pre-migration-{{ ansible_date_time.date }}/packages.txt

    - name: Respaldar configuraciones
      archive:
        path: /etc
        dest: /backup/pre-migration-{{ ansible_date_time.date }}/etc-backup.tar.gz

    - name: Actualizar CentOS
      yum:
        name: '*'
        state: latest

    - name: Reiniciar si es necesario
      reboot:
        reboot_timeout: 600
      when: ansible_facts['reboot_required'] is defined

    - name: Descargar script migrate2rocky
      get_url:
        url: https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
        dest: /root/migrate2rocky.sh
        mode: '0755'

    - name: Ejecutar migración
      command: /root/migrate2rocky.sh -r
      register: migration_result

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

    - name: Verificar Rocky Linux
      shell: cat /etc/rocky-release
      register: rocky_version

    - name: Mostrar resultado
      debug:
        msg: "Migración exitosa: {{ rocky_version.stdout }}"

Script de Migración por Lotes

#!/bin/bash
# Migrar múltiples servidores desde archivo de inventario

INVENTORY_FILE="/root/servers-to-migrate.txt"
LOG_FILE="/root/migration-log-$(date +%Y%m%d).txt"

# Leer lista de servidores
while IFS= read -r server; do
    echo "$(date): Iniciando migración en $server" | tee -a "$LOG_FILE"

    # SSH al servidor y ejecutar migración
    ssh root@$server << 'ENDSSH'
        # Respaldo
        tar -czf /backup/pre-migration-$(date +%Y%m%d).tar.gz /etc

        # Actualizar
        yum update -y

        # Descargar y ejecutar migración
        curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
        chmod +x migrate2rocky.sh
        ./migrate2rocky.sh -r

        # Reiniciar
        reboot
ENDSSH

    # Esperar a que el servidor vuelva en línea
    echo "Esperando a que $server se reinicie..." | tee -a "$LOG_FILE"
    sleep 60

    until ssh root@$server "echo 'Servidor en línea'"; do
        echo "Aún esperando a $server..."
        sleep 30
    done

    # Verificar migración
    ssh root@$server "cat /etc/rocky-release" | tee -a "$LOG_FILE"

    echo "$(date): Migración completada en $server" | tee -a "$LOG_FILE"
    echo "---" | tee -a "$LOG_FILE"

done < "$INVENTORY_FILE"

echo "Todas las migraciones completadas. Verifica $LOG_FILE para detalles"

Rutas de Migración Alternativas

CentOS Stream

# Convertir CentOS Linux a CentOS Stream
# No recomendado para estabilidad en producción

sudo dnf install centos-release-stream
sudo dnf swap centos-linux-repos centos-stream-repos
sudo dnf distro-sync

# CentOS Stream recibe actualizaciones antes que RHEL
# Modelo de lanzamiento continuo
# Menos predecible para producción

Red Hat Enterprise Linux

# Convertir a RHEL (requiere suscripción)
# Descargar herramienta convert2rhel
curl -o convert2rhel.rpm https://access.redhat.com/convert2rhel-latest.rpm
sudo yum install convert2rhel.rpm

# Registrar con Red Hat
subscription-manager register

# Ejecutar conversión
convert2rhel

# Requiere suscripción RHEL válida
# Proporciona soporte oficial de Red Hat

Mejores Prácticas y Recomendaciones

Mejores Prácticas Pre-Migración

  1. Prueba Primero: Siempre prueba la migración en sistemas no productivos
  2. Respalda Todo: Múltiples tipos de respaldo (snapshots, tar, bases de datos)
  3. Documenta Exhaustivamente: Inventario, configuraciones, procedimientos
  4. Programa Ventanas de Mantenimiento: Comunica con stakeholders
  5. Ten Plan de Rollback: Sabe cómo restaurar desde respaldos

Durante la Migración

  1. Usa Screen/Tmux: Previene problemas de desconexión SSH
  2. Monitorea Progreso: Observa logs en terminal separada
  3. No Interrumpas: Deja que la migración se complete totalmente
  4. Mantén Notas: Documenta cualquier error o advertencia

Post-Migración

  1. Verifica Exhaustivamente: Verifica todos los servicios y aplicaciones
  2. Monitorea de Cerca: Observa logs durante varios días
  3. Actualiza Documentación: Refleja nueva versión de SO
  4. Planifica Actualizaciones Regulares: Establece cronograma de mantenimiento

Cronología Recomendada

# Para ambientes de producción
Semana 1-2: Planificación y documentación
Semana 3-4: Migración y validación de ambiente de prueba
Semana 5-6: Migración de sistemas no críticos
Semana 7+: Migración de producción (escalonada, monitorizada)

Conclusión

Migrar de CentOS a Rocky Linux o AlmaLinux es una transición necesaria para organizaciones que buscan distribuciones estables, impulsadas por la comunidad y compatibles con RHEL. Tanto Rocky Linux como AlmaLinux proporcionan excelentes reemplazos para CentOS, ofreciendo compatibilidad binaria, soporte a largo plazo y ambientes familiares para administradores de sistemas.

Puntos Clave:

  1. La Migración es Necesaria: CentOS 7 alcanza EOL en junio de 2024. Los sistemas sin parchear crean riesgos de seguridad y problemas de cumplimiento.

  2. Ambas Opciones son Viables: Rocky Linux y AlmaLinux son excelentes elecciones. La selección a menudo se reduce a preferencias filosóficas o requisitos de soporte.

  3. La Migración In-Place Funciona: Los scripts migrate2rocky y almalinux-deploy proporcionan migraciones in-place confiables para la mayoría de los sistemas.

  4. Las Pruebas son Críticas: Nunca migres producción sin probar el procedimiento exacto en réplicas primero.

  5. Los Respaldos son Obligatorios: Los respaldos completos proporcionan red de seguridad para problemas inesperados.

  6. La Verificación es Esencial: Las pruebas exhaustivas post-migración aseguran que todos los servicios funcionen correctamente.

  7. Planifica para Escala: Los despliegues grandes se benefician de la automatización vía Ansible o herramientas similares.

Cuándo Elegir Rocky Linux:

  • Se prefiere gobernanza puramente comunitaria
  • Se valora independencia de influencia corporativa
  • Se desea desarrollo impulsado por la comunidad

Cuándo Elegir AlmaLinux:

  • Se necesitan opciones de soporte comercial
  • Se valora respaldo de CloudLinux
  • Se requieren SLAs profesionales

Ambas distribuciones reciben actualizaciones dentro de días de los lanzamientos de RHEL, proporcionan ciclos de soporte de 10 años y mantienen la estabilidad y previsibilidad que hicieron popular a CentOS. Las diferencias técnicas son mínimas, haciendo cualquier elección confiable para ambientes de producción.

La discontinuación de CentOS, aunque disruptiva, creó oportunidades para distribuciones Enterprise Linux verdaderamente impulsadas por la comunidad. Al migrar a Rocky Linux o AlmaLinux, las organizaciones mantienen compatibilidad con RHEL mientras apoyan proyectos de comunidad de código abierto.

Próximos Pasos

Después de una migración exitosa:

  1. Actualizar documentación de recuperación de desastres
  2. Modificar monitoreo y alertas para nueva versión de SO
  3. Capacitar equipo en cualquier diferencia
  4. Establecer cronograma de actualización regular
  5. Unirse a foros de comunidad y listas de correo
  6. Contribuir de vuelta a la distribución elegida
  7. Planificar para futuras migraciones LTS

La migración desde CentOS puede haber sido forzada por las circunstancias, pero tanto Rocky Linux como AlmaLinux demuestran la resiliencia y adaptabilidad de la comunidad de código abierto. Con planificación y ejecución adecuadas, esta migración fortalece en lugar de debilitar tu base de infraestructura.