由于内核包问题无法升级

0x4*_*450 5 package-management apt dpkg kernel

这里是 Ubuntu 14.04 LTS 用户。

基本上我在运行时遇到了问题

sudo apt-get update
sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

dpkg 返回错误代码,因为 Linux 内核包 3.13.0.57 被标记为“未完全安装”:

Errors were encountered while processing:
 linux-image-3.13.0.57-generic
 linux-image-extra-3.13.0-57-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)
Run Code Online (Sandbox Code Playgroud)

我输入了uname -r以查看我的系统内核的当前版本,令人惊讶的是它是3.13.0.57。之后我重新启动系统并输入 grub 以列出所有已安装的 linux 内核,看到我有3.8.0-35-generic,所以我用它启动并尝试重新安装 3.13.0.57 版本。我不知道为什么默认情况下 Ubuntu 14.04 在 3.8.0-35 可用时以 3.13.0.57 启动。

在我用3.8.0成功启动后,我再次列出了我使用 dpkg 拥有的所有内核,以确保3.13.0-57存在。

sudo dpkg --list | grep linux-image
sudo apt-get purge linux-image-3.13.0.57-generic
sudo apt-get purge linux-image-extra-3.13.0-57-generic
Run Code Online (Sandbox Code Playgroud)

但是额外的镜像包无法删除,而纯linux镜像可以:

Errors were encountered while processing:
 linux-image-extra-3.13.0-57-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这一问题?我搜索并看到引导分区上可能缺少空间会导致此类问题,但我认为我的情况有所不同。我设法手动清除了 4-5 个旧内核,以确保在引导分区上释放了足够的空间。

编辑 1:我看到 Ubuntu 14.04.2 附带 Linux Kernel 3.16.x,但我没有。我的最新版本是 3.8.0-35,然后是 3.13.0-57。

编辑 2:运行sudo apt-get autoremovesudo apt-get dist-upgrade没有帮助。似乎我无法运行任何升级。这是日志sudo apt-get autoremove

    $ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-image-extra-3.13.0-57-generic
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
2 not fully installed or removed.
After this operation, 152 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 747752 files and directories currently installed.)
Removing linux-image-extra-3.13.0-57-generic (3.13.0-57.95) ...
depmod: FATAL: could not load /boot/System.map-3.13.0-57-generic: No such file or directory
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.13.0-57-generic /boot/vmlinuz-3.13.0-57-generic
run-parts: executing /etc/kernel/postinst.d/dkms 3.13.0-57-generic /boot/vmlinuz-3.13.0-57-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.13.0-57-generic /boot/vmlinuz-3.13.0-57-generic
update-initramfs: Generating /boot/initrd.img-3.13.0-57-generic
grep: /boot/config-3.13.0-57-generic: No such file or directory
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.13.0-57-generic /boot/vmlinuz-3.13.0-57-generic
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.13.0-57-generic /boot/vmlinuz-3.13.0-57-generic
run-parts: executing /etc/kernel/postinst.d/zz-runlilo 3.13.0-57-generic /boot/vmlinuz-3.13.0-57-generic
Fatal: open /boot/vmlinuz-3.13.0-46-generic.efi.signed: No such file or directory
run-parts: /etc/kernel/postinst.d/zz-runlilo exited with return code 1
dpkg: error processing package linux-image-extra-3.13.0-57-generic (--remove):
 subprocess installed post-removal script returned error exit status 1
Errors were encountered while processing:
 linux-image-extra-3.13.0-57-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)
Run Code Online (Sandbox Code Playgroud)

我不知道这是什么 -Fatal: open /boot/vmlinuz-3.13.0-46-generic.efi.signed: No such file or directory与删除 3.13.0-57 有关系。

0x4*_*450 5

我设法找到了解决问题的方法。尽管如此,如果有人遇到同样的问题,我决定将其发布为答案。

问题原因:

我检查了软件包的 dpkg 状态:

dpkg --status linux-image-3.13.0.57-generic
dpkg --status linux-image-extra-3.13.0-57-generic
Run Code Online (Sandbox Code Playgroud)

输出清楚地表明包处于不良状态。正如我在上面的问题中所写的那样,它们“未完全安装”。

解决方案:

这些包的条目必须从状态文件中删除dpkg才能apt-get正常运行。步骤如下:

  1. 如果出现问题,请确保备份状态文件。

    sudo cp /var/lib/dpkg/status /var/lib/dpkg/status.backup

  2. /var/lib/dpkg/status使用您喜欢的文本编辑器打开并搜索和删除损坏包的引用。您不得删除任何其他内容!

  3. 运行sudo apt-get upgrade以确保一切都已修复。