如何在 Fedora 中使用 kexec 自动使用最新安装的内核?

如何在 Fedora 中使用 kexec 自动使用最新安装的内核?

如何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

输入所有内容非常繁琐,因为通常安装了多个内核,即使制表符补全也无济于事。

使用 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。

相关内容