强制删除不需要的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
, apt
, aptitude
,无所谓)来删除/清除包似乎不起作用。
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 -L
validation了……)
此外,依赖关系现在已经被打破,因为在此阶段重复清除会导致在/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