De una sesión SSH a una instalación nueva de RHEL10
Hay escenarios en los que necesitamos reinstalar completamente un servidor Linux, pero no tenemos acceso físico, consola remota, iLO, iDRAC ni acceso al hipervisor. Lo único disponible es una sesión SSH funcionando.
Linux permite preparar un arranque automático que reinstale el sistema actual y conserve configuraciones básicas como la red, el hostname y el acceso SSH. Por supuesto, el nuevo servidor no conservará los servicios o aplicaciones instalados anteriormente, porque el objetivo es volver a disponer de un sistema limpio, listo para utilizarse nuevamente, por ejemplo, en laboratorios, pruebas de servicios, despliegues controlados o nuevas instalaciones.
En este procedimiento trabajaremos con:
RHEL 10 GRUB Anaconda Kickstart SSH
1. Conocer el servidor que vamos a borrar
Antes de empezar el procedimiento de reinstalación, es necesario recopilar toda la información para reconstruir el servidor. Una vez que ejecutemos el reinicio, ya no podremos volver al sistema actual para consultar qué interfaz de red utilizaba, puerta de enlace o cómo estaba particionado el disco.
Comenzamos por el sistema operativo (puede variar dependiendo de la distribución y de la versión instalada):
cat /etc/os-release
Revisamos discos y particiones:
lsblk -o NAME,SIZE,FSTYPE,PTTYPE,PARTTYPE,MOUNTPOINTS
Necesitamos saber si el servidor está utilizando BIOS tradicional o UEFI. Este dato será importante cuando preparemos nuevamente el cargador de arranque.
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
Red
Obtenemos las interfaces:
ip -br addr
Después:
ip route
Aquí debemos documentar al menos:
Interfaz Dirección IP Máscara Gateway
También resulta útil conservar la dirección MAC:
cat /sys/class/net/INTERFAZ/address
y el nombre completo del servidor:
hostname -f
DNS
Revisamos la configuración actual:
cat /etc/resolv.conf
GRUB y /boot
También debemos revisar:
df -h /boot
y:
grub2-editenv list
En esta primera fase todavía no estamos cambiando nada. Estamos simplemente asegurándonos de que conocemos el servidor que estamos a punto de borrar. Antes de formatear un servidor remotamente debemos ser capaces de reconstruir su red, almacenamiento y arranque sin depender del sistema que vamos a eliminar.
2. Preparar el nuevo sistema
RHEL utiliza Anaconda como instalador y Kickstart para automatizar instalaciones.
Red Hat documenta inst.ks= como parámetro de arranque para indicar dónde se encuentra el archivo Kickstart. Si ese archivo contiene toda la configuración necesaria, la instalación puede ejecutarse automáticamente.
Por tanto, necesitamos preparar tres elementos:
kernel del instalador initrd del instalador Kickstart
Para arrancar el instalador de RHEL 10 desde GRUB necesitamos dos archivos del propio medio de instalación:
vmlinuz initrd.img
Estos archivos forman parte del medio ISO oficial de instalación de RHEL 10 y se encuentran dentro de la estructura:
images/pxeboot/vmlinuz
images/pxeboot/initrd.img
Una vez localizados, copiamos ambos archivos al directorio /boot:
cp /mnt/rhel10/images/pxeboot/initrd.img /boot/rhel10-reinstall-initrd.img
Si, en lugar de utilizar una ISO local, disponemos de un árbol de instalación RHEL 10 publicado por HTTP, la estructura equivalente sería:
https://SERVIDOR/RUTA/images/pxeboot/vmlinuz https://SERVIDOR/RUTA/images/pxeboot/initrd.img
Crear Kickstart
El siguiente elemento es:
/boot/ks.cfg
Kickstart puede definir prácticamente toda la instalación:
idioma teclado zona horaria red usuarios contraseñas almacenamiento paquetes servicios acciones post instalación
Un esquema simplificado podría ser:
text reboot lang en_US.UTF-8 keyboard us timezone America/Guayaquil --utc network --bootproto=static --device=INTERFAZ --ip=IP_SERVIDOR --netmask=MASCARA --gateway=GATEWAY --nameserver=DNS --hostname=FQDN --activate --onboot=yes
Después definimos el almacenamiento.
Por ejemplo:
zerombr clearpart --all --initlabel --drives=sda
Aquí está una de las líneas más importantes del procedimiento:
clearpart --all
No estamos actualizando el sistema. Estamos indicando a Anaconda que elimine las particiones seleccionadas antes de realizar la nueva instalación. Por eso debemos haber identificado correctamente el disco en la primera fase.
Red Hat mantiene network, clearpart, bootloader, rootpw, %packages, %post y otras instrucciones como parte de Kickstart en RHEL 10.
Validar Kickstart
Antes de utilizarlo podemos instalar:
dnf install -y pykickstart
y validar la sintaxis:
ksvalidator -v RHEL10 /boot/ks.cfg
Esta validación comprueba la sintaxis y opciones obsoletas, pero no garantiza por sí sola que la instalación completa vaya a funcionar ni valida totalmente el contenido de %pre, %post y %packages.
3. Garantizar que podremos volver a ingresar
Formatear el servidor es muy sencillo. Lo importante es poder volver a entrar una vez reinstalado. Si SSH era nuestra única vía de acceso antes de comenzar, debemos asegurarnos de que el nuevo RHEL 10 arranque con:
red configurada gateway correcto DNS funcional OpenSSH instalado sshd habilitado firewall permitiendo SSH usuario o root accesible
Dentro de Kickstart podemos instalar OpenSSH:
%packages @core openssh-server NetworkManager %end
Y después habilitarlo:
%post systemctl enable sshd systemctl enable NetworkManager %end
Podemos utilizar contraseña, clave SSH o ambos mecanismos durante esta reinstalación. Kickstart permite configurar tanto rootpw como claves SSH.
Si queremos conservar temporalmente la contraseña actual de root, podemos obtener el hash sin conocer la contraseña en texto claro:
ROOT_HASH="$(awk -F: '$1=="root"{print $2}' /etc/shadow)"
y utilizar ese hash en Kickstart:
rootpw --iscrypted HASH
También podemos incluir una clave pública SSH. Lo relevante en este punto es garantizar que, una vez terminada la reinstalación, podremos volver a conectarnos por SSH. Después podremos endurecer la configuración, desactivar el acceso por contraseña o restringir el acceso de root.
4. Preparar GRUB y validar antes del reinicio
Hasta este momento el servidor continúa funcionando normalmente. No hemos borrado ni formateado el sistema. Lo que haremos ahora es crear una entrada adicional en GRUB para que, solo en el próximo arranque, el servidor inicie con el kernel y el initrd del instalador de RHEL 10 que copiamos anteriormente en /boot. Primero identificamos dónde está montado /boot:
findmnt /boot
y obtenemos el UUID de esa partición:
blkid
Supongamos que /boot corresponde a /dev/sda1. Podemos obtener directamente su UUID con:
BOOT_UUID=$(blkid -s UUID -o value /dev/sda1) echo "$BOOT_UUID"
Ese UUID nos permitirá indicarle a GRUB dónde encontrar tanto el kernel como nuestro archivo ks.cfg. Ahora creamos una entrada específica para la reinstalación:
cat > /etc/grub.d/41_rhel10_reinstall <<EOF
#!/bin/sh
exec tail -n +3 $0
menuentry 'RHEL 10 Automatic Reinstall' --id rhel10-reinstall {
<pre><code>search --no-floppy --fs-uuid --set=root ${BOOT_UUID}
linux /rhel10-reinstall-vmlinuz \
inst.repo=URL_REPOSITORIO_RHEL10 \
inst.ks=hd:UUID=${BOOT_UUID}:/ks.cfg \
ip=IP_SERVIDOR::GATEWAY:MASCARA:FQDN:INTERFAZ:none \
nameserver=DNS \
rd.neednet=1
initrd /rhel10-reinstall-initrd.img
</code></pre>
}
EOF
Aquí hay varias cosas importantes.
search --fs-uuid indica a GRUB en qué partición están los archivos que preparamos.
La línea:
linux /rhel10-reinstall-vmlinuz
carga el kernel del instalador. Mientras que:
inst.ks=hd:UUID=${BOOT_UUID}:/ks.cfg
le indica a Anaconda dónde encontrar nuestro archivo Kickstart. Por su parte:
inst.repo=URL_REPOSITORIO_RHEL10
indica desde dónde se descargarán los paquetes necesarios para instalar RHEL 10. También dejamos definida la red desde el propio arranque:
ip=IP_SERVIDOR::GATEWAY:MASCARA:FQDN:INTERFAZ:none nameserver=DNS rd.neednet=1
Esto es especialmente importante en nuestro escenario, porque el instalador necesitará conectividad antes incluso de comenzar a instalar el nuevo sistema. Finalmente:
initrd /rhel10-reinstall-initrd.img
carga el initrd del instalador. Damos permisos al archivo:
chmod +x /etc/grub.d/41_rhel10_reinstall
y regeneramos la configuración de GRUB:
grub2-mkconfig -o /boot/grub2/grub.cfg
En sistemas con una configuración de arranque diferente, la ubicación del archivo de GRUB puede variar, por lo que conviene verificarla previamente. Antes de continuar comprobamos que nuestra nueva entrada realmente haya sido incorporada:
grep -A20 "RHEL 10 Automatic Reinstall" /boot/grub2/grub.cfg
Si todo es correcto, indicamos que esta entrada debe utilizarse únicamente en el próximo reinicio:
grub2-reboot rhel10-reinstall
Y verificamos:
grub2-editenv list
Deberíamos obtener algo parecido a:
next_entry=rhel10-reinstall
Esto significa que GRUB arrancará una sola vez utilizando nuestro instalador de RHEL 10. Después, el comportamiento normal de arranque volverá a utilizarse.
Hasta este punto todavía podemos cancelar el procedimiento sin formatear nada. El verdadero punto de no retorno llegará cuando ejecutemos el reinicio.
5. Resumen de configuraciones
A continuación te muestro una plantilla completa que reúne las configuraciones explicadas en las secciones anteriores. Debe adaptarse a cada servidor con los datos obtenidos en la fase inicial: interfaz, IP, máscara, gateway, DNS, FQDN, disco, origen de instalación y credenciales.
Plantilla de /boot/ks.cfg
text reboot lang en_US.UTF-8 keyboard us timezone America/Guayaquil --utc url --url="<a href="http://SERVIDOR/RUTA/">http://SERVIDOR/RUTA/</a>" network --bootproto=static --device=INTERFAZ --ip=IP_SERVIDOR --netmask=MASCARA --gateway=GATEWAY --nameserver=DNS --hostname=FQDN --activate --onboot=yes rootpw --iscrypted HASH_ROOT firewall --enabled --service=ssh selinux --enforcing zerombr clearpart --all --initlabel --drives=sda bootloader --boot-drive=sda autopart --type=lvm %packages @core openssh-server NetworkManager %end %post systemctl enable sshd systemctl enable NetworkManager %end
En esta plantilla, SERVIDOR/RUTA debe apuntar a un árbol válido de instalación de RHEL 10. El disco sda, la configuración de red y el hash de root son ejemplos y deben sustituirse por los valores reales obtenidos previamente.
Script de validación previa
Antes de reiniciar podemos ejecutar una validación sencilla para confirmar que los elementos fundamentales están disponibles. El script no reemplaza una revisión manual, pero ayuda a detectar omisiones comunes:
#!/usr/bin/env bash
set -euo pipefail
KERNEL="/boot/rhel10-reinstall-vmlinuz"
INITRD="/boot/rhel10-reinstall-initrd.img"
KS="/boot/ks.cfg"
INSTALL_URL="<a href="http://SERVIDOR/RUTA">http://SERVIDOR/RUTA</a>"
echo "===== SISTEMA ====="
cat /etc/os-release | grep -E '^(NAME|VERSION|VERSION_ID)=' || true
echo
echo "===== FIRMWARE ====="
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
echo
echo "===== RED ====="
ip -br addr
ip route
hostname -f
echo
echo "===== /BOOT ====="
findmnt /boot
df -h /boot
echo
echo "===== ARCHIVOS DEL INSTALADOR ====="
test -s "$KERNEL" && echo "OK: $KERNEL" || { echo "ERROR: falta $KERNEL"; exit 1; }
test -s "$INITRD" && echo "OK: $INITRD" || { echo "ERROR: falta $INITRD"; exit 1; }
test -s "$KS" && echo "OK: $KS" || { echo "ERROR: falta $KS"; exit 1; }
echo
echo "===== KICKSTART ====="
if command -v ksvalidator >/dev/null 2>&1; then
ksvalidator -v RHEL10 "$KS"
else
echo "AVISO: ksvalidator no está instalado"
fi
echo
echo "===== ORIGEN DE INSTALACIÓN ====="
curl -fsI "${INSTALL_URL}/.treeinfo" >/dev/null
&& echo "OK: árbol de instalación accesible"
|| { echo "ERROR: no se pudo validar ${INSTALL_URL}/.treeinfo"; exit 1; }
echo
echo "===== GRUB ====="
grub2-editenv list || true
echo
echo "Validaciones básicas completadas."
El archivo .treeinfo es especialmente útil en esta comprobación porque el origen indicado mediante inst.repo= o url debe corresponder a un árbol de instalación válido.
6. Reiniciar y recuperar el acceso
Una vez validado todo:
sync systemctl reboot
La sesión SSH desaparecerá y nuestro proceso iniciará automáticamente una reinstalación.
Monitorear el progreso
Desde otro servidor podemos comenzar observando:
ping IP_SERVIDOR
Que el servidor responda a ping no significa necesariamente que RHEL haya terminado de instalarse. Anaconda puede configurar la interfaz de red muy temprano durante el proceso. Podemos recibir respuesta al ping aunque todavía no exista ningún servicio SSH disponible.
Una comprobación más útil, después de que el servidor responda al ping, es comprobar si el puerto SSH ya está disponible:
nc -zvw2 IP_SERVIDOR 22
Durante la instalación podemos obtener:
Connection refused
y posteriormente:
Connection to IP_SERVIDOR 22 port [tcp/ssh] succeeded!
Ese momento nos indica que el nuevo sistema ya está suficientemente operativo como para intentar conectarnos.
Conclusión
Reinstalar completamente RHEL 10 utilizando únicamente una sesión SSH puede parecer arriesgado, y ciertamente exige más preparación que hacerlo desde una consola. Mientras el sistema actual continúa funcionando podemos preparar:
kernel initrd Kickstart red DNS almacenamiento credenciales SSH GRUB
Después del reinicio, Anaconda ya no depende del sistema que estamos eliminando. La reinstalación pasa a ser un proceso independiente. Por eso, en este tipo de escenario, la parte más importante no es realmente borrar el disco. Es todo lo que hacemos antes de borrarlo. Debemos dejar preparado un sistema que pueda arrancar, instalarse, conectarse nuevamente a la red y devolvernos el acceso. Pasamos así de una sesión SSH a una instalación nueva de RHEL10, sin consola y sin acceso directo al hipervisor.
Fuentes Técnicas
Fuentes técnicas
Red Hat Enterprise Linux 10: Boot options reference
Red Hat Enterprise Linux 10: Automatically installing RHEL
Red Hat Enterprise Linux 10: Creating Kickstart files
Red Hat Enterprise Linux 10: Kickstart commands and options reference
Red Hat Enterprise Linux 10: Starting Kickstart installations