Как использовать kexec в Fedora для автоматического использования новейшего установленного ядра?

Как использовать kexec в Fedora для автоматического использования новейшего установленного ядра?

Как использовать kexecFedora 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.

Связанный контент