![如何在 Fedora 中使用 kexec 自动使用最新安装的内核?](https://linux22.com/image/1443546/%E5%A6%82%E4%BD%95%E5%9C%A8%20Fedora%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20kexec%20%E8%87%AA%E5%8A%A8%E4%BD%BF%E7%94%A8%E6%9C%80%E6%96%B0%E5%AE%89%E8%A3%85%E7%9A%84%E5%86%85%E6%A0%B8%EF%BC%9F.png)
如何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。