¿Cómo usar adecuadamente kexec con systemd en CentOS 7?

13

Quiero usar kexec para acelerar los reinicios de mi máquina CentOS 7. ¿Cómo puedo hacer eso de una manera que se integre bien con los objetivos existentes de apagado / reinicio de systemd? ¿Cuál es la forma adecuada (oficial) de hacer esto?

Matriz
fuente

Respuestas:

11

Descubrí una manera de hacer un script de carga kexec que funcione bien y cargue el kernel predeterminado en grub, lo que significa que debería cargar el nuevo kernel después de una actualización del kernel.

Archivo: / usr / bin / kexec-load

#!/usr/bin/env bash

GRUBBY_FILE="/var/log/grubby"
TMP=$(mktemp)

#  Command "grubby --default-kernel" has a bug/feature that fsyncs
#  after writting each line to a debug log file, making it slow (several seconds).
#  Workaround is to write to /dev/null instead.
if [ -e $GRUBBY_FILE ]
        then rm -f $GRUBBY_FILE
fi
ln -s /dev/null $GRUBBY_FILE
KERNEL_IMG=$(grubby --default-kernel)
unlink $GRUBBY_FILE

#  Get the detailed information of the default kernel (as seen by grub)
#  This will create a temporary file in /tmp
grubby --info=$KERNEL_IMG | grep -v title > $TMP
source $TMP
rm $TMP

#  Simple log to see if this script gets executed
date --rfc-3339=seconds >> /var/log/kexec

#  Load (prepare) the kernel for execution
kexec -l $kernel --initrd=$initrd --command-line="root=$root $args"

Archivo: /etc/systemd/system/kexec-load.service

[Unit]
Description=loads the kernel
Documentation=man:kexec(8)
DefaultDependencies=no
Before=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/usr/bin/kexec-load

[Install]
WantedBy=kexec.target 

$ chmod +x /usr/bin/kexec-load
$ systemctl enable kexec-load.service
$ systemctl kexec
Matriz
fuente
1
Maravilloso, no entiendo por qué esto todavía no tiene 289 votos a favor ...
kubanczyk
3
Para simplificarlo, me deshago del archivo de script y lo uso en su lugarExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
kubanczyk
7

Esto es bastante sencillo.

Primera etapa del kernel a arrancar:

kexec -l /boot/vmlinuz-3.10.0-123.6.3.el7.x86_64 \
--initrd=/boot/initramfs-3.10.0-123.6.3.el7.x86_64.img \
--command-line="root=/dev/mapper/centos-root ro rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto  vconsole.keymap=us rhgb quiet LANG=en_US.UTF-8"

Estas opciones se han eliminado de la configuración de grub generada.

Ahora dile a systemd que haga su magia.

systemctl start kexec.target

O en versiones más recientes de systemd:

systemctl kexec

Unos segundos más tarde, estará en su nuevo núcleo.


Recientemente escribí un script independiente de distribución para ayudar a automatizar esto (se admiten informes de errores).

Michael Hampton
fuente
¿No --command-line=$(cat /proc/cmdline)funcionaría tan bien?
Dennis Kaarsemaker
1
@DennisKaarsemaker Sí, probablemente sea así. Pero cambiar las opciones de la línea de comandos podría ser una de las cosas que se están haciendo, por lo que no siempre haría eso necesariamente .
Michael Hampton
Gracias por la respuesta. ¿Hay alguna manera de automatizar la "preparación kexec"? ¿Se puede configurar systemd para preparar kexec automáticamente cuando ejecuto "systemctl start kexec.target"?
Matrix
@Matrix Buena pregunta. Si existe tal cosa, no soy consciente de ello. Y de todos modos, reiniciar es algo en lo que generalmente desea pensar.
Michael Hampton
Creo que --reuse-cmdlinees más corto y más legible. Desafortunadamente, se --reuseinitrdniega a reconocer un initramfs actual, por lo que necesito especificarlo manualmente.
kubanczyk