Como usar corretamente o kexec com o systemd no CentOS 7?

10

Eu quero usar o kexec para acelerar as reinicializações da minha máquina do CentOS 7. Como posso fazer isso de uma maneira que se integre bem com os alvos systemd de desligamento / reinicialização existentes? Qual é a maneira correta (oficial) de fazer isso?

    
por Matrix 13.08.2014 / 19:58

2 respostas

10

Eu descobri uma maneira de fazer um script de carregamento do kexec que funciona bem e irá carregar o kernel padrão no grub, o que significa que ele deve carregar o novo kernel após uma atualização do kernel.

File: /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"

File: /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
    
por 14.08.2014 / 16:07
6

Isso é bastante simples.

Primeiro estágio o kernel a ser inicializado:

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 opções foram removidas da configuração gerada pelo grub.

Agora diga ao systemd para fazer sua mágica.

systemctl start kexec.target

Alguns segundos depois, você estará no seu novo kernel.

Eu recentemente escrevi um script agnóstico de distribuição para ajudar a automatizar isso (boas-vindas aos relatórios de bugs).

    
por 13.08.2014 / 20:22