Come usare correttamente kexec con systemd su CentOS 7?


13

Voglio usare kexec per accelerare i riavvii della mia macchina CentOS 7. Come posso farlo in un modo che si integri perfettamente con gli attuali obiettivi di spegnimento / riavvio del sistema? Qual è il modo corretto (ufficiale) per farlo?

Risposte:


11

Ho trovato un modo per creare uno script di caricamento di kexec che funzioni bene e caricherà il kernel predefinito in grub, il che significa che dovrebbe caricare il nuovo kernel dopo un aggiornamento del 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

1
Meraviglioso, non capisco bene perché questo non abbia ancora 289 voti positivi ...
Kubanczyk,

3
Per semplicità, mi ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
sbarazzo

7

Questo è piuttosto semplice.

Primo stadio del kernel da avviare:

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"

Queste opzioni sono state eliminate dalla configurazione di grub generata.

Ora dì a systemd di fare la sua magia.

systemctl start kexec.target

O su versioni più recenti di systemd:

systemctl kexec

Pochi secondi dopo, sarai nel tuo nuovo kernel.


Di recente ho scritto uno script indipendente dalla distribuzione per aiutare ad automatizzarlo (segnalazioni di bug benvenute).


Non --command-line=$(cat /proc/cmdline)funzionerebbe pure?
Dennis Kaarsemaker,

1
@DennisKaarsemaker Sì, probabilmente è così. Ma la modifica delle opzioni della riga di comando potrebbe essere una delle cose che sta facendo, in modo da non necessariamente sempre farlo.
Michael Hampton

Grazie per la risposta. C'è un modo per automatizzare la "preparazione kexec"? Systemd può essere configurato per preparare automaticamente kexec quando eseguo "systemctl start kexec.target"?
Matrix

@Matrix Buona domanda. Se esiste un tale modo, non ne sono consapevole. E comunque, il riavvio è qualcosa a cui generalmente vuoi pensare.
Michael Hampton

Penso che --reuse-cmdlinesia più breve e più leggibile. Sfortunatamente --reuseinitrdrifiuta di riconoscere un initramfs corrente, quindi devo specificarlo manualmente.
Kubanczyk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.