为什么GrUB找不到已经找到的内核?

在升级到15.04版本后,我需要与正在运行的内核匹配的内核头文件(用于另一个软件包)。
升级安装了内核版本为3.19.0-17。为了以防万一,我还安装了"linux-headers-generic"。然后,我运行了"sudo update-grub"并重新启动。但是,系统仍然引导到了内核版本3.16.0-31(通过"uname -r"命令确认)。
经过多次尝试,我发现GrUB在"update-grub"中识别到了3.19内核,甚至将其添加到了"/boot/grub/menu.lst"中。然而,在启动时,GrUB只能在启动菜单中识别到3.16内核。我应该如何解决这个问题,让GrUB能够引导到3.19版本?
这是我当前系统的一些输出。 sudo update-grub 始终生成以下输出:
$ sudo update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-3.19.0-17-generic
Found kernel: /boot/vmlinuz-3.16.0-31-generic
Found kernel: /boot/vmlinuz-3.13.0-40-generic
Found kernel: /boot/vmlinuz-3.11.0-19-generic
Found kernel: /boot/vmlinuz-3.8.0-35-generic
Found kernel: /boot/memtest86+.bin
Found kernel: /boot/vmlinuz-3.19.0-17-generic
Found kernel: /boot/vmlinuz-3.16.0-31-generic
Found kernel: /boot/vmlinuz-3.13.0-40-generic
Found kernel: /boot/vmlinuz-3.11.0-19-generic
Found kernel: /boot/vmlinuz-3.8.0-35-generic
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done

运行update-grub后,打开/boot/grub/menu.lst文件,第一个选项是:
title        Ubuntu 15.04, kernel 3.19.0-17-generic
uuid        ac9d0eaf-e090-4c29-8e7b-30e98ed07d29
kernel        /boot/vmlinuz-3.19.0-17-generic root=UUID=ac9d0eaf-e090-4c29-8e7b-30e98ed07d29 ro quiet splash
initrd        /boot/initrd.img-3.19.0-17-generic

但是,在启动过程中按住Shift键,没有选择3.19的选项(虽然我可以选择其他版本)。启动后,uname -r确认它已经启动到了3.16版本。
$ uname -r
3.16.0-31-generic

从一个 dpkg -l 的输出中截取的部分,显示确实安装了 3.19 内核。
ii  linux-headers-3.19.0-17                              3.19.0-17.17                               all          Header files related to Linux kernel version 3.19.0
ii  linux-headers-3.19.0-17-generic                      3.19.0-17.17                               amd64        Linux kernel headers for version 3.19.0 on 64 bit x86 SMP
ii  linux-headers-generic                                3.19.0.17.16                               amd64        Generic Linux kernel headers

我还尝试过清除/重新安装grub和头文件,以及其他一些毫无影响的事情。

对于 grub 引导程序来说,linux-image-* 软件包比 linux-headers-* 软件包更为重要。 - saiarcot895
在我的系统上,我没有/boot/grub/menu.lst文件,而是有一个/boot/grub/grub.cfg文件,似乎会被更新。update-grub的man页面建议它调用grub-mkconfig,并告诉它将数据输出到/boot/grub/grub.cfg。你有一个名为/boot/grub/grub.cfg的文件吗?它是否没有较新的内核? - saiarcot895
@saiarcot895 linux-image-3.19.0-17-genericdpkg 列表中也存在。我确实有一个 grub.cfg 文件,而且它确实缺少了 3.19 的记录。 - geometrian
请尝试删除(确保备份)/boot/grub/menu.lst/boot/grub/default(如果后者存在),然后再次运行update-grub。检查/boot/grub/grub.cfg是否包含3.19的记录。 - saiarcot895
@saiarcot895 完成。它并没有。 - geometrian
你能确认你已经安装了 grub2-common 吗?(如果不确定,请运行 sudo apt-get install grub2-common。) - saiarcot895
@saiarcot895 我没有安装它。如上所标记的,GrUB版本是0.97。你认为应该升级到GrUB 2吗? - geometrian
是的,这很可能就是你遇到问题的原因。 - saiarcot895
@saiarcot895 在安装了GrUB 2之后,重新编辑您的第(n-2)条评论,然后重新启动计算机,它会启动到3.19版本。如果您重新发布上述内容并解释0.97版本的问题,那听起来就像是一个答案! - geometrian
1个回答

旧版本的GRUB(0.9.7)可能使用menu.lst来确定显示什么内容,而新版本的GRUB(GRUB 2)则使用grub.cfg。看起来你安装了一些混合了GRUB和GRUB 2的东西。
使用grub软件包中的update-grub命令将更新menu.lst文件,但如果引导加载程序是GRUB 2,则实际上不会有任何效果,这就是当前的情况。相反,你应该安装grub2-common(这将卸载grub软件包)。然后,在运行update-grub(或update-grub2;两者都是同样的操作)时,grub.cfg文件将被更新。
基于this答案给出的回答。