我使用了这个问题中描述的脚本列出了计算机上安装的内核:
在 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+
我原本以为 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,但仅包含相同的 9 个条目。
答案1
您问了两个问题:为什么会发生这种情况?我该如何解决它?
应该发生什么
当软件包管理器安装新内核时,/etc/kernel/postinst.d/apt-auto-removal 脚本会标记上一个内核,以便在下次运行时删除。它做对于大多数用户来说大多数时候都可以正常工作。
剧本比较保守。它不会删除全部旧内核,并且它倾向于保留内核,而不是错误地删除当前内核或以前的内核(以防您需要恢复)。它不会扫描以查看您已安装的所有内核 - 它只使用新内核和当前内核的版本号。
为什么没有发生
脚本中可能存在错误,不同的包管理问题可能阻止了标记,一些用户操作可能在删除之前将包标记为手动安装。确切原因未知,甚至可能无法知晓。这一切都是一幅丰富的画卷。
如何修复
修复非常简单。您需要两条信息:
- 当前内核(使用命令:uname -r)
- 安装其他内核(使用命令:ls /boot)
例子:
$ 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
忽略所有文件名称看看所有的版本号。从示例中可以看到安装了两个内核版本:
- 3.11.0-14-generic(可删除)
- 3.11.0-15-generic(正在运行的内核 - 请勿删除!)
所以我们可以删除旧内核:
sudo apt-get remove linux-image-3.11.0-14-generic
当内核被删除时,包管理器将自动从 /boot 中删除所有这些文件并更新 grub 菜单。