我从 Fedora 38 升级到 Fedora 40 或多或少是顺利的。然而,当安装新内核时,grub 配置不会更新。
该命令grep vmlinuz /boot/grub2/grub.cfg
显示
linux /boot/vmlinuz-6.8.8-300.fc40.x86_64 root=UUID=0e08d465-d601-478f-be17-a2663626588c ro
linux /boot/vmlinuz-6.8.8-100.fc38.x86_64 root=UUID=0e08d465-d601-478f-be17-a2663626588c ro
linux /boot/vmlinuz-6.3.12-200.fc38.x86_64 root=UUID=0e08d465-d601-478f-be17-a2663626588c ro
但我没有安装 6.3.12,并ls /boot/loader/entries
给了我
vmlinuz-6.8.8-100.fc38.x86_64
vmlinuz-6.8.8-300.fc40.x86_64
vmlinuz-6.8.9-300.fc40.x86_64
rpm -q kernel
也同意:
kernel-6.8.8-100.fc38.x86_64
kernel-6.8.8-300.fc40.x86_64
kernel-6.8.9-300.fc40.x86_64
是的,grub2-mkconfig -o /boot/grub2/grub.cfg
恢复配置,命令grep vmlinuz /boot/grub2/grub.cfg
现在给出
linux /boot/vmlinuz-6.8.9-300.fc40.x86_64 root=UUID=0e08d465-d601-478f-be17-a2663626588c ro
linux /boot/vmlinuz-6.8.8-300.fc40.x86_64 root=UUID=0e08d465-d601-478f-be17-a2663626588c ro
linux /boot/vmlinuz-6.8.8-100.fc38.x86_64 root=UUID=0e08d465-d601-478f-be17-a2663626588c ro
但grub2-mkconfig
不应该在每次安装内核时运行。
到底是怎么回事?
由于
/boot/loader/entries
存在且是最新的,因此不应在 中提及单个内核/boot/grub2/grub.cfg
:相反,配置应调用 GRUB 命令blscfg
,这将导致 GRUB 读取/boot/loader/entries
并使用其中的信息。换句话说,grep blscfg /boot/grub2/grub.cfg
应该返回类似以下内容:如果您
grub2-mkconfig
将内核列表更新到/boot/grub2/grub.cfg
,则意味着您必须有旧版本的脚本/etc/grub.d/10_linux
仍然处于活动状态,或者您必须已添加GRUB_ENABLE_BLSCFG=false
到/etc/default/grub
。但是,从 RHEL 8(以及相应的 Fedora 版本)开始,默认内核安装后脚本现在假定正在
blscfg
使用,因此grub2-mkconfig
在安装新内核后不需要调用 ,除非GRUB_ENABLE_BLSCFG=false
在/etc/default/grub
.在 RHEL/Fedora 中,内核包事务后脚本将
/bin/kernel-install add <kernel version> ...
在安装和/bin/kernel-install remove <kernel-version> ...
删除时调用。它将/bin/kernel-install
依次调用它在目录中找到的任何脚本/etc/kernel/install.d/
,并且/usr/lib/kernel/install.d
(前一个目录中的文件覆盖后一个目录中具有相同名称的任何文件)具有类似的add
/remove
和内核版本参数。安装和删除时执行的最后一个脚本应该是
/usr/lib/kernel/install.d/99-grub-mkconfig.install
:它运行grub2-mkconfig
,但前提是/etc/default/grub
已GRUB_ENABLE_BLSCFG
设置为确切的字符串false
。任何偏差都会导致脚本假定引导加载程序能够使用/boot/loader/entries
,因此脚本将退出而不执行任何操作。如果这一切看起来都不错,请查看您的
/etc/grub.d/
目录。你10_linux.rpmnew
那里可能有一个或类似的吗?如果您有这样的文件,请备份旧的(可能是自定义的)
10_linux
文件并将其替换为10_linux.rpmnew
(或类似的)文件,然后grub2-mkconfig -o /boot/grub2/grub.cfg
最后运行一次。显然该
/etc/grub.d/10_linux
文件可能来自grub2-tools
包,因此dnf reinstall grub2-tools
如果不存在10_linux.rpmnew
或不存在类似文件,则可能需要 a 。