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

由于未满足依赖关系,无法清理完整的 /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).

答案1

在这种情况下,我会使用该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 的空间)

答案2

这是我在 Ubuntu 16.04 上工作的方法。

sudo apt autoremove --purge
sudo apt autoremove
sudo apt-get -f install
sudo apt-get upgrade

答案3

列出所有内核:

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

答案4

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

正如所述移除旧内核Ubuntu 社区 wiki 页面上,您可以通过在无人值守更新配置文件中添加以下行来配置无人值守升级以自动删除旧内核:

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

重要的是:确保您确实想要这个,因为正如 wiki 中所述:

它还会删除其他不需要的包,无论这是或不是您想要的。

相关内容