Fast reboot en Proxmox utilizando kexec

Uno de los problemas que tenemos a la hora de reiniciar nuestros servidores HP Proliant es que el proceso de arranque dura demasiado tiempo. Eso significa que, si en algún momento, necesitamos apagarlo, el sistema estará inoperativo durante todo el tiempo en que se realicen las tareas POST, se configuren los dispositivos y se diagnostique la memoria.

kexec es una herramienta que permite cargar un nuevo kernel en la memoria y transferirle el control directamente, evitando el proceso completo de reinicio del hardware. Ésto permite realizar reinicios más rápidos, ya que se omite la fase de inicialización del hardware y el cargador de arranque.

En nuestro caso, para lograr un inicio rápido de nuestros servidores HP Proliant, nos hemos basado en los aportes realizados en el siguiente foro de Proxmox:

https://forum.proxmox.com/threads/proxmox-7-fast-reboot-with-kexec.93422/

A continuación os comentamos todo lo que hemos realizado y cómo lo hemos hecho:

Para empezar, necesitamos disponer de la herramienta kexec, así que instalamos el paquete kexec-tools en nuestro servidor Proxmox:

apt update && apt -y install kexec-tools

Durante la instalación del paquete, el sistema nos preguntará si queremos que kexec gestione completamente el proceso de arranque. Le respondemos que no.

Una vez instalado kexec-tools, creamos el servicio /etc/systemd/system/kexec-load.service:

nano /etc/systemd/system/kexec-load.service

Y agregamos el siguiente contenido al archivo:

[Unit]
Description=boot into into the current pve kernel
Documentation=man:kexec(8)
DefaultDependencies=no
Before=shutdown.target umount.target final.target reboot.target
#RequiresMountsFor=/boot

[Service]
Type=oneshot
ExecStart=/sbin/kexec -l /boot/pve/vmlinuz --initrd=/boot/pve/initrd.img --reuse-cmdline

[Install]
WantedBy=kexec.target

Como podéis ver, hemos comentado la línea que dice "RequiresMountsFor=/boot". Ésto es porque el sistema de nuestro equipo no tiene /boot en una partición separada, y, por tanto, no necesita montarla.

Este servicio está diseñado para cargar el último kernel de PVE en la memoria antes de que el sistema se apague o reinicie. Al hacerlo, cuando se ejecuta el comando systemctl kexec, el sistema transfiere el control directamente al nuevo kernel cargado, omitiendo el proceso completo de reinicio del hardware. Esto es especialmente útil en entornos donde se requieren reinicios rápidos, como en servidores que necesitan minimizar el tiempo de inactividad.

En cuanto a la configuración del servicio, os la detallamos a continuación:

[Unit]:

  • Description=boot into the current pve kernel: Describe el propósito del servicio, que en este caso es iniciar con el kernel actual de Proxmox Virtual Environment (PVE).
  • Documentation=man:kexec(8): Referencia al manual de kexec para obtener más información.
  • DefaultDependencies=no: Indica que el servicio no debe establecer dependencias predeterminadas, permitiendo una mayor flexibilidad en su ejecución.
  • Before=shutdown.target umount.target final.target reboot.target: Especifica que este servicio debe ejecutarse antes de los objetivos de apagado, desmontaje, finalización y reinicio.
  • RequiresMountsFor=/boot: Asegura que el sistema de archivos /boot esté montado antes de que se ejecute el servicio, ya que es donde reside el kernel que se va a cargar.

[Service]:

  • Type=oneshot: El servicio ejecuta una acción única y no permanece en ejecución.
  • ExecStart=/sbin/kexec -l /boot/pve/vmlinuz --initrd=/boot/pve/initrd.img --reuse-cmdline: Comando que carga el kernel especificado (/boot/pve/vmlinuz) en la memoria junto con su imagen initrd (/boot/pve/initrd.img), reutilizando las opciones de línea de comandos del kernel actual.

[Install]:

  • WantedBy=kexec.target: Indica que este servicio es requerido por el objetivo kexec, permitiendo que se ejecute cuando se invoque este objetivo.

Bien, pues una vez creado el servicio, lo habilitamos:

systemctl enable kexec-load.service

Y lo iniciamos:

systemctl start kexec-load.service

Por último, hacemos un reemplazo del reinicio normal. ¿Cómo? Simplemente creando un link:

ln -s /usr/lib/systemd/system/kexec.target /etc/systemd/system/reboot.target

De este modo, a partir de ahora, cuando hagamos un reboot, se invocará a kexec y se realizará un fast reboot. Este arranque rápido hará que se reinicie el sistema servidor sin pasar por todo el proceso de arranque inicial.

Si en algún momento, queremos reestablecerlo para que el sistema se inicie normalmente al realizar un reboot, no tenemos más que eliminar el link:

unlink /etc/systemd/system/reboot.target

Como hemos configurado nuestro sistema para que siempre se realice un reinicio rápido, ya para terminar, creamos un script que nos permita realizar un reinicio normal cuando queramos. Para ello creamos un script /usr/local/bin/normal-reboot:

nano /usr/local/bin/normal-reboot

Con el siguiente contenido:

#!/bin/sh
# File: /usr/local/bin/normal-reboot
mkdir -p /run/systemd/transient/systemd-reboot.service.d/
ln -sf /dev/null /run/systemd/transient/systemd-reboot.service.d/override.conf
ln -sf /dev/null /run/systemd/transient/kexec-load.service
systemctl daemon-reload
reboot

Y le asignamos permisos de ejecución:

chmod +x /usr/local/bin/normal-reboot

De este modo., cuando queramos realizar un reinicio normal, tan sólo tendremos que ejecutar el script normal-reboot.

Be the first to comment