强制删除不需要的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-getaptaptitude ,无所谓)来删除/清除包似乎不起作用。

 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-extra s仍然报告为半安装(甚至虽然它们似乎不包含任何文件,但是dpkg -Lvalidation了……)

此外,依赖关系现在已经被打破,因为在此阶段重复清除会导致在/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 

我没有想法了。

鉴于:

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

然后可能的方法是强制清除dpkg数据库中的那些悬空条目,如此处所示 。

请注意:这是一个hackish,低级别,有潜在危险的操作。

  • 查找属于您要删除的包的任何文件(尝试$ dpkg -L linux-image-extra-3.13.0-XXX-generic )并删除它们
  • 打开文件/var/lib/dpkg/status ,找到并删除描述你希望dpkg忘记的软件包的文本块
  • 要特别注意保留包描述符之间的空行,行开头的空格等。他们说apt数据库是错误的错别字。
  • 保存状态文件后, dpkg以及所有与apt相关的程序应恢复正常

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

我在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