Réponses:
J'ai trouvé un moyen de créer un script de chargement kexec qui fonctionne bien et chargera le noyau par défaut dans grub, ce qui signifie qu'il devrait charger le nouveau noyau après une mise à jour du noyau.
Fichier: / 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"
Fichier: /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
ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
C'est assez simple.
Première étape du noyau à démarrer:
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"
Ces options ont été glissées hors de la configuration grub générée.
Dites maintenant à systemd de faire sa magie.
systemctl start kexec.target
Ou sur des versions plus récentes de systemd:
systemctl kexec
Quelques secondes plus tard, vous serez dans votre nouveau noyau.
J'ai récemment écrit un script indépendant de la distribution pour aider à automatiser cela (les rapports de bugs sont les bienvenus).
--command-line=$(cat /proc/cmdline)
fonctionnerait pas aussi bien?
--reuse-cmdline
c'est plus court et plus lisible. Refuse malheureusement --reuseinitrd
de reconnaître un initramfs actuel, donc je dois le spécifier manuellement.