
Как использовать kexec
Fedora Linux для быстрой автоматической перезагрузки с использованием новейшего установленного ядра?
kexec --load
Использование командной строки довольно многословно — вам необходимо указать:
- образ ядра, например
/boot/vmlinuz-3.18.8-201.fc21.x86_64
, - соответствующий файл initrd, например
--initrd=/boot/initramfs-3.18.8-201.fc21.x86_64.img
, - аргументы командной строки ядра, например
--append="root=/dev/sda1 ro rhgb quiet LANG=en_US.UTF-8"
, из/proc/cmdline
.
Вводить все это утомительно, так как даже автодополнение клавишей Tab не помогает, поскольку обычно установлено несколько ядер.
С системами UEFI и ноутбуком с двойной загрузкой Windows 8 легко упустить подходящий момент, чтобы прервать перезагрузку и выбрать нестандартную систему. Если вы пропустите, вам придется ждать, пока Windows 8 запустится, возможно, автоматически войдет в систему, перезагрузится и повторите попытку.
решение1
Я не думаю, что это хорошая идея — повторно использовать текущие аргументы командной строки, как вы это делаете сейчас. Я рекомендую вместо этого проверить конфигурацию GRUB, предполагая, что GRUB у вас настроен. Команда grubby
может предоставить вам необходимую информацию. Точный формат вывода grubby --info
немного непоследователен, но его достаточно, чтобы быть пригодным для использования.
# 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"
}
Это не использует последнее доступное ядро, оно использует то, что настроено в Grub как ядро для использования по умолчанию. У вас уже есть код для определения последнего установленного ядра, и вы можете легко изменить его --info="$index"
на --info=$latestkernel
, если вы хотите использовать его вместо этого.
решение2
Я решил эту проблему, создав скрипт /usr/local/bin/kexec-load-latest
, который автоматически выбирает самую последнюю версию ядра и загружает ее в 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"
Сделайте его исполняемым chmod a+x /usr/local/bin/kexec-load-latest
, чтобы я мог просто:
- бегать
sudo /usr/local/bin/kexec-load-latest
, - затем
sudo reboot
или воспользуйтесь функцией перезагрузки моей среды рабочего стола.
Протестировано на Fedora 21. Это также должно работать в других, более новых rpm
дистрибутивах, таких как RHEL или CentOS.