由于未满足的依赖关系,无法清理完整的/boot目录。

我收到了一个错误消息,解释说我的/boot目录已满。尝试清理旧的镜像文件似乎总是失败,因为磁盘已满或依赖错误。有人能解释一下我做错了什么吗?
$ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run ‘apt-get -f install’ to correct these.
The following packages have unmet dependencies.
 linux-image-extra-3.13.0-44-generic : Depends: linux-image-3.13.0-44-generic but it is not installed
 linux-image-extra-3.13.0-45-generic : Depends: linux-image-3.13.0-45-generic but it is not installed
 linux-image-generic : Depends: linux-image-3.13.0-45-generic but it is not installed
E: Unmet dependencies. Try using -f.

$ ls /boot
abi-3.13.0-32-generic         initrd.img-3.13.0-43-generic
abi-3.13.0-36-generic         lost+found
abi-3.13.0-37-generic         memtest86+.bin
abi-3.13.0-39-generic         memtest86+.elf
abi-3.13.0-40-generic         memtest86+_multiboot.bin
abi-3.13.0-43-generic         System.map-3.13.0-32-generic
config-3.13.0-32-generic      System.map-3.13.0-36-generic
config-3.13.0-36-generic      System.map-3.13.0-37-generic
config-3.13.0-37-generic      System.map-3.13.0-39-generic
config-3.13.0-39-generic      System.map-3.13.0-40-generic
config-3.13.0-40-generic      System.map-3.13.0-43-generic
config-3.13.0-43-generic      vmlinuz-3.13.0-32-generic
grub                          vmlinuz-3.13.0-36-generic
initrd.img-3.13.0-32-generic  vmlinuz-3.13.0-37-generic
initrd.img-3.13.0-36-generic  vmlinuz-3.13.0-39-generic
initrd.img-3.13.0-37-generic  vmlinuz-3.13.0-40-generic
initrd.img-3.13.0-39-generic  vmlinuz-3.13.0-43-generic
initrd.img-3.13.0-40-generic

我使用了。
kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver

获取
linux-headers-3.13.0-32
linux-headers-3.13.0-32-generic
linux-headers-3.13.0-36
linux-headers-3.13.0-36-generic
linux-headers-3.13.0-37
linux-headers-3.13.0-37-generic
linux-headers-3.13.0-39
linux-headers-3.13.0-39-generic
linux-headers-3.13.0-40
linux-headers-3.13.0-40-generic
linux-headers-3.13.0-44
linux-headers-3.13.0-44-generic
linux-headers-3.13.0-45
linux-headers-3.13.0-45-generic
linux-image-3.13.0-32-generic
linux-image-3.13.0-36-generic
linux-image-3.13.0-37-generic
linux-image-3.13.0-39-generic
linux-image-3.13.0-40-generic

然后选择第一张图片进行删除
$ sudo apt-get purge linux-image-3.13.0-32-generic
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies.
 linux-image-extra-3.13.0-32-generic : Depends: linux-image-3.13.0-32-generic but it is not going to be installed
 linux-image-extra-3.13.0-44-generic : Depends: linux-image-3.13.0-44-generic but it is not going to be installed
 linux-image-extra-3.13.0-45-generic : Depends: linux-image-3.13.0-45-generic but it is not going to be installed
 linux-image-generic : Depends: linux-image-3.13.0-45-generic but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

иҜ·зј–иҫ‘жӮЁзҡ„й—®йўҳд»ҘеҸҠsudo apt-get autoremoveе’Ңls /bootзҡ„иҫ“еҮәгҖӮ - muru
试试Phrog的答案。使用uname -r命令查找您当前的内核版本,并尝试删除除此之外的其他内核。 - muru
4个回答

在这种情况下,我会使用dpkg工具来强制删除一些内核包。但是不建议普通用户使用,有一定的风险,但在遇到依赖关系不满足的情况下可能会有帮助。
首先要找到系统当前启动的内核。打开终端(CTRL+ALT+T)并输入以下命令。
uname -r

它会显示加载的内核,你不应该尝试删除这个。然后输入命令。
ls /boot 

它将返回所有已安装的图像。选择一两个并尝试删除它们。试着强制删除/清除它们。 例如
sudo dpkg --force-all -P linux-image-3.13.0-32-generic

您可��对其他图像执行相同操作,以释放一些空间。
然后,您可以尝试安装缺失的软件包或者...
sudo apt-get install -f 

尝试解决依赖关系。
最后,执行“清理旧内核”命令。
 sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")

上述命令将删除除当前加载的内核之外的所有内核。
由于您有一个单独的/boot分区,请记住您需要经常跟踪其空间并进行清理(频率取决于/boot的空间)。

1嗨,当我尝试移除它们时,出现了一个错误:sudo dpkg --force-all -P abi-3.13.0-32-generic dpkg: 警告:忽略请求移除未安装的abi-3.13.0-32-generic。 - Philip Howard
我修改了答案,因为有个打字错误。你需要移除这个包。abi-3.13.0-32-generic不是包名。相反,请使用linux-image-3.13.0-32-generic。其他镜像也请使用相同的命名方式。 - NickTux
10这对我有用,只是有一个修改:在使用 dpkg 删除内核镜像后,我需要运行 sudo apt-get -f autoremove,以使 apt-get 不再抱怨未满足的依赖关系。否则,sudo apt-get -f install 显然会继续尝试重新安装我用 dpkg 删除的所有内核镜像,这显然只会再次填满 /boot 目录。 - mdunsmuir
4在执行了强制清理和@mdunsmuir评论中提到的apt-get -f autoremove之后,仍然会在上述任何清理操作期间安装所有旧内核。有没有办法只告诉它忽略无关的依赖项并删除一个完整的旧内核呢? - NKijak
3我想补充一下,我还需要使用 sudo dpkg --force-all -P linux-image-extra-3.13.0-32-generic 卸载额外的内容。否则这些额外内容仍然依赖于实际的镜像,而 -f 标志会导致重新安装镜像,从而导致磁盘空间不足。 - Ghostkeeper
这太愚蠢了。当Ubuntu自动更新这些内核时,它应该自动删除除最后两个内核之外的所有内容。否则,如果你长时间不管服务器,它会被这些垃圾填满,即使你删除了一个内核,在自动删除(由于未满足的依赖关系)期间它还会重新安装!完全是愚蠢的默认设置。 - Lonnie Best
1@LonnieBest 我同意。相反,Arch Linux只保留了一个备选项。Fedora似乎也没有这个问题。 - Franklin Yu

这是在Ubuntu 16.04上对我有效的方法。
sudo apt autoremove --purge
sudo apt autoremove
sudo apt-get -f install
sudo apt-get upgrade

这种方法对我有效。 - Bok

列出所有内核:
dpkg --list 'linux-image*'

显示当前内核:
uname -r

列出除了当前内核以外的所有内核:
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'

确保您当前的内核不在该列表中。
删除除当前内核之外的所有内核:
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge

清除其他杂项:
sudo apt-get autoremove

如果仍然出现错误,请重复以下命令以删除不需要的内核:
sudo dpkg --purge linux-image-X.X.X-XXX-generic linux-image-extra-X.X.X-XXX-generic linux-signed-image-X.X.X-XXX-generic
sudo dpkg --purge linux-image-Y.Y.Y-YYY-generic linux-image-extra-Y.Y.Y-YYY-generic linux-signed-image-Y.Y.Y-YYY-generic

sudo apt-get -f install

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

如果在安装/卸载文件时仍然出现引导磁盘空间错误,则直接从/boot目录中删除其中一个旧镜像, ls -lh /boot/*-3.13.0-119*; rm /boot/*-3.13.0-119*;注意:在删除任何镜像之前,请再次查看当前内核镜像。 - Hemant Thorat
仍然抱怨它有未满足的依赖关系 - Matiss

如果您正在使用无人值守更新,此问题将再次出现,您可能希望彻底修复它。

如在Ubuntu社区维基上的RemoveOldKernels页面所述,您可以通过将以下行添加到无人值守更新配置文件中来配置自动删除旧内核:

Unattended-Upgrade::Remove-Unused-Dependencies "true";

重要提示:请确保您真的想要这样做,因为正如维基百科所述:
它还会删除其他不需要的软件包,这可能是您想要的,也可能不是。