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 ] &amp;&amp; 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" &amp;&amp; echo "OK: $KERNEL" || { echo "ERROR: falta $KERNEL"; exit 1; }
test -s "$INITRD" &amp;&amp; echo "OK: $INITRD" || { echo "ERROR: falta $INITRD"; exit 1; }
test -s "$KS" &amp;&amp; echo "OK: $KS" || { echo "ERROR: falta $KS"; exit 1; }

echo
echo "===== KICKSTART ====="
if command -v ksvalidator &gt;/dev/null 2&gt;&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" &gt;/dev/null
&amp;&amp; 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

Red Hat Enterprise Linux 10: Customizing the boot menu

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *