为了制作很长的故事简而言之,我被一些不需要的、半配置的图像包困住了,我正试图摆脱它们:
$ 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
... 验证)
此外,依赖关系现在被破坏了,因为在此阶段重复清除会导致 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
。