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