强制删除不需要的 linux-image-extra* 软件包

强制删除不需要的 linux-image-extra* 软件包

为了制作很长的故事简而言之,我被一些不需要的、半配置的图像包困住了,我正试图摆脱它们:

$ dpkg -l |grep linux-im
iF  linux-image-3.13.0-100-generic       3.13.0-100.147 i386 Linux kernel image for version 3.13.0 on 32 bit x86 SMP
iF  linux-image-3.13.0-101-generic       3.13.0-101.148 i386 Linux kernel image for version 3.13.0 on 32 bit x86 SMP
iF  linux-image-3.13.0-92-generic        3.13.0-92.139  i386 Linux kernel image for version 3.13.0 on 32 bit x86 SMP
iF  linux-image-3.13.0-93-generic        3.13.0-93.140  i386 Linux kernel image for version 3.13.0 on 32 bit x86 SMP
iF  linux-image-3.13.0-96-generic        3.13.0-96.143  i386 Linux kernel image for version 3.13.0 on 32 bit x86 SMP
iH  linux-image-extra-3.13.0-100-generic 3.13.0-100.147 i386 Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
iH  linux-image-extra-3.13.0-101-generic 3.13.0-101.148 i386 Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
iH  linux-image-extra-3.13.0-92-generic  3.13.0-92.139  i386 Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
iH  linux-image-extra-3.13.0-93-generic  3.13.0-93.140  i386 Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
iH  linux-image-extra-3.13.0-96-generic  3.13.0-96.143  i386 Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP

这些镜像实际上毫无用处,因为我的 32 位 14.04 系统位于 OpenVZ 容器中,该容器仅负责内核。如您所见,这是一个更老的版本:

$ uname -r
2.6.32-042stab116.2

因此,与大多数关注如何删除的类似问题不同老的常规升级后,我在这里尝试做的是彻底清除所有这些 3.13 软件包,它本来就不应该存在。


以下是我迄今为止尝试的总结。

由于明显的恶性循环,尝试以通常的方式删除/清除包(,,,apt-get没关系)似乎不起作用。aptaptitude

sudo apt-get purge linux-image-3.13.0-100-generic linux-image-3.13.0-101-generic linux-image-3.13.0-92-generic linux-image-3.13.0-93-generic linux-image-3.13.0-96-generic linux-image-extra-3.13.0-100-generic linux-image-extra-3.13.0-101-generic linux-image-extra-3.13.0-92-generic linux-image-extra-3.13.0-93-generic linux-image-extra-3.13.0-96-generic

正如你所看到的输出,实际上什么都没有被删除。另一方面,aptitude设法走得更远一点:

sudo aptitude purge linux-image-3.13.0-100-generic linux-image-3.13.0-101-generic linux-image-3.13.0-92-generic linux-image-3.13.0-93-generic linux-image-3.13.0-96-generic linux-image-extra-3.13.0-100-generic linux-image-extra-3.13.0-101-generic linux-image-extra-3.13.0-92-generic linux-image-extra-3.13.0-93-generic linux-image-extra-3.13.0-96-generic

在......的最后这个流程*image-3.13*s 消失了,连同通常在/boot和 中找到的匹配文件和文件夹也消失了/lib/modules,但image-extras 仍然被报告为半安装(即使它们似乎不包含任何文件,经dpkg -L... 验证)

此外,依赖关系现在被破坏了,因为在此阶段重复清除会导致 apt 抱怨 /boot和 中缺少文件/文件夹/lib/modules。我尝试将虚拟文件放置在预期位置,如下建议在这里但最后我还是发现了原文的错误。我认为,下面是关键的摘录:

[...]
Removing linux-image-extra-3.13.0-101-generic (3.13.0-101.148) ...
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.13.0-101-generic /boot/vmlinuz-3.13.0-101-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.13.0-101-generic /boot/vmlinuz-3.13.0-101-generic
update-initramfs: Generating /boot/initrd.img-3.13.0-101-generic
E: /usr/share/initramfs-tools/hooks/fixrtc failed with return 1.
update-initramfs: failed for /boot/initrd.img-3.13.0-101-generic with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
dpkg: error processing package linux-image-extra-3.13.0-101-generic (--purge):
subprocess installed post-removal script returned error exit status 1
[...]

在尝试失败后,所谓的核选择

sudo dpkg --remove --force-remove-reinstreq package_name

我没什么主意了。

答案1

鉴于:

  • linux-image-3.13.0-XXX-generic成功清除
  • 仍报告linux-image-extra-3.13.0-XXX-generic为半安装
  • 目前没有安装任何依赖这些image-extra软件包
  • 这些图像都不应该存在(因为 2.6 内核是由主机 OpenVZ 容器提供的)
  • 传统的尝试都无法成功清理系统

那么一个可能的方法是强制从dpkg数据库中清除那些悬空的条目,因为建议在这里

请注意:这是一个黑客行为、低级行为,且具有潜在危险的操作。

  • 查找您要删除的软件包中的任何文件(尝试$ dpkg -L linux-image-extra-3.13.0-XXX-generic)并删除它们
  • 打开文件/var/lib/dpkg/status,找到并删除描述你希望 dpkg 忘记的软件包的文本块
  • 要特别小心地保留包描述符之间的空行、行首的空格等。他们说 apt 数据库对拼写错误是不能容忍的。
  • 保存状态文件后,dpkg所有apt相关程序都应恢复正常

答案2

我在 bash 脚本中使用下面的内容来清除除活动内核之外的所有内容:

dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e "$(uname -r | cut -f1,2 -d"-")" | grep -e "[0-9]" | grep -E "(image|headers)" | xargs sudo apt-get -y purge

它与您调用的非常接近但也许dpkg有必要的区别。

如果感兴趣的话,完整的脚本在这里:
https://github.com/mtompkins/linux-kernel-utilities

答案3

执行此操作ls /boot应显示一些vmlinuz-X.XX.XX文件。apt-get purge linux-image-X.XX.XX-generic对每个文件执行此操作,但不要删除你正在运行的内核。你可以使用 检查是哪一个uname -r

相关内容