
¿Cómo utilizar kexec
Fedora Linux para reiniciar rápidamente automáticamente al kernel instalado más reciente?
kexec --load
El uso de la línea de comandos es bastante detallado: debes proporcionar:
- imagen del núcleo, como
/boot/vmlinuz-3.18.8-201.fc21.x86_64
, - archivo initrd correspondiente, como
--initrd=/boot/initramfs-3.18.8-201.fc21.x86_64.img
, - argumentos de la línea de comandos del kernel, como
--append="root=/dev/sda1 ro rhgb quiet LANG=en_US.UTF-8"
, de/proc/cmdline
.
Es tedioso escribirlo todo, ya que incluso completar tabulaciones no ayuda demasiado, porque normalmente hay varios núcleos instalados.
Con los sistemas UEFI y las computadoras portátiles con arranque dual Windows 8, es fácil perder el momento adecuado para interrumpir el reinicio y seleccionar un sistema no predeterminado. Si falla, tendrá que esperar a que se inicie Windows 8, tal vez inicie sesión automáticamente, reinicie e intente nuevamente.
Respuesta1
No creo que sea una buena idea reutilizar los argumentos actuales de la línea de comandos como los que tiene ahora. Recomiendo verificar la configuración de GRUB, asumiendo que tiene GRUB configurado. El grubby
comando puede brindarle la información requerida. El formato de salida exacto de grubby --info
es un poco inconsistente, pero es suficiente para ser utilizable.
# cat /usr/local/bin/kexec-load
#!/bin/sh
set -eu
index=$(grubby --default-index)
grubby --info="$index" | {
IFS==
while read field value
do
case $value in
\"*\")
eval "$field=$value" ;;
*)
eval "$field=\$value" ;;
esac
done
unset IFS
set -x
kexec -l --initrd="$initrd" --append="root=$root $args" -- "$kernel"
}
Esto no utiliza el último kernel disponible, utiliza el que esté configurado en Grub como kernel a usar de forma predeterminada. Ya tiene el código para determinar el último kernel instalado y puede cambiarlo fácilmente --info="$index"
si --info=$latestkernel
eso es lo que desea utilizar.
Respuesta2
Resolví esto creando un script /usr/local/bin/kexec-load-latest
que selecciona automáticamente el kernel más reciente y lo carga en kexec
.
#!/bin/bash
set -x
NEWEST_KERNEL_VERSION="$(
rpm --query --queryformat='%{VERSION}-%{RELEASE}.%{ARCH}\n' kernel \
| sort --version-sort --reverse \
| head --lines=1
)"
kexec --load --append="`cat /proc/cmdline`" \
--initrd="/boot/initramfs-$NEWEST_KERNEL_VERSION.img" \
"/boot/vmlinuz-$NEWEST_KERNEL_VERSION"
Configúrelo como ejecutable chmod a+x /usr/local/bin/kexec-load-latest
para que pueda simplemente:
- correr
sudo /usr/local/bin/kexec-load-latest
, - luego
sudo reboot
o usar la función de reinicio de mi entorno de escritorio.
Probado en Fedora 21. Esto también debería funcionar en otras rpm
distribuciones basadas recientemente como RHEL o CentOS.