
Como usar kexec
no Fedora Linux para reinicializar rapidamente automaticamente para o kernel instalado mais recente?
kexec --load
o uso da linha de comando é bastante detalhado - você deve fornecer:
- imagem do kernel, como
/boot/vmlinuz-3.18.8-201.fc21.x86_64
, - arquivo initrd correspondente, como
--initrd=/boot/initramfs-3.18.8-201.fc21.x86_64.img
, - argumentos de linha de comando do kernel, como
--append="root=/dev/sda1 ro rhgb quiet LANG=en_US.UTF-8"
, from/proc/cmdline
.
É tedioso digitar tudo, pois mesmo o preenchimento de tabulação não ajuda muito, porque geralmente há vários kernels instalados.
Com sistemas UEFI e laptop de inicialização dupla com Windows 8, é fácil perder o momento certo para interromper a reinicialização e selecionar um sistema não padrão. Se você errar, terá que esperar o Windows 8 iniciar, talvez fazer login automaticamente, reiniciar e tentar novamente.
Responder1
Não acho que seja uma boa ideia reutilizar os argumentos atuais da linha de comando como você tem agora. Eu recomendo verificar a configuração do GRUB, supondo que você tenha o GRUB configurado. O grubby
comando pode fornecer as informações necessárias. O formato exato de saída grubby --info
é um pouco inconsistente, mas é suficiente para ser utilizável.
# 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"
}
Isso não usa o kernel mais recente disponível, ele usa aquele que está configurado no Grub como o kernel a ser usado por padrão. Você já tem o código para determinar o kernel instalado mais recente e pode facilmente alterá-lo --info="$index"
para --info=$latestkernel
se for isso que deseja usar.
Responder2
Resolvi isso criando um script /usr/local/bin/kexec-load-latest
que seleciona automaticamente o kernel mais recente e o carrega no arquivo 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"
Defina-o como executável chmod a+x /usr/local/bin/kexec-load-latest
para que eu possa simplesmente:
- correr
sudo /usr/local/bin/kexec-load-latest
, - então
sudo reboot
ou use a função de reinicialização do meu ambiente de área de trabalho.
Testado no Fedora 21. Isso também deve funcionar em outras rpm
distribuições recentes, como RHEL ou CentOS.