我使用此问题中描述的脚本列出了计算机上安装的内核:
在 3.2.0 中,我有 33、34、35、36、37、38、39、41、43、44、45 和 48。我希望在重新启动后运行 3.2.0-48,但我是仍在运行 3.2.0-32。为什么不使用自动更新安装的内核(也没有在 menu.lst 中提供)?
[我正在运行 12.04 LTS]
grep title /boot/grub/menu.lst 结果:
title Ubuntu 12.04.1 LTS, kernel 3.2.0-32-generic
title Ubuntu 12.04.1 LTS, kernel 3.2.0-32-generic (recovery mode)
title Ubuntu 12.04.1 LTS, kernel 2.6.32-45-generic
title Ubuntu 12.04.1 LTS, kernel 2.6.32-45-generic (recovery mode)
title Ubuntu 12.04.1 LTS, kernel 2.6.32-44-generic
title Ubuntu 12.04.1 LTS, kernel 2.6.32-44-generic (recovery mode)
title Ubuntu 12.04.1 LTS, kernel 2.6.32-43-generic
title Ubuntu 12.04.1 LTS, kernel 2.6.32-43-generic (recovery mode)
title Ubuntu 12.04.1 LTS, memtest86+
Run Code Online (Sandbox Code Playgroud)
我本来希望 3.2.0-33 到 3.2.0-48 之间的内核在这个文件中,并且默认是最新的。为什么内核 3.2.0-33 到 48 没有添加到这个文件中?
当我运行时sudo dpkg-reconfigure linux-image-3.2.0-48-generic,它找到了所有其他内核,并重新生成了 menu.lst,但 in 仅包含相同的 9 个条目。
您问两个问题:为什么会发生这种情况,以及如何解决它?
应该发生什么
当包管理器安装新内核时,/etc/kernel/postinst.d/apt-auto-removal 中的脚本会标记以前的内核,以便在包管理器下次运行时删除。确实如此在大多数时间都
剧本比较保守。它不会删除所有旧内核,并且会错误地保留内核,而不是错误地删除当前内核或以前的内核(以防您需要恢复)。它不会扫描以查看您已安装的所有内核 - 它只是使用新内核和当前内核的版本号。
为什么它没有发生
脚本中可能存在错误,不同的包管理问题可能会阻止标记,多个用户操作可能会在删除之前将包标记为手动安装。确切原因尚不清楚,也可能无法得知。这一切都是一幅丰富的挂毯。
如何修复它
修复非常容易。您需要两条信息:
例子:
$ uname -r
3.11.0-15-generic
$ ls /boot
abi-3.11.0-14-generic initrd.img-3.11.0-14-generic
abi-3.11.0-15-generic initrd.img-3.11.0-15-generic
config-3.11.0-14-generic System.map-3.11.0-14-generic
config-3.11.0-15-generic System.map-3.11.0-15-generic
extlinux vmlinuz-3.11.0-14-generic
grub vmlinuz-3.11.0-15-generic
Run Code Online (Sandbox Code Playgroud)
忽略所有文件名。查看所有版本号。您可以从示例中看到安装了两个内核版本:
所以我们可以删除旧的内核:
sudo apt-get remove linux-image-3.11.0-14-generic
Run Code Online (Sandbox Code Playgroud)
当删除内核时,包管理器将自动从 /boot 中删除所有这些文件并更新 grub 菜单。