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

Phi*_*ard 45 package-management boot disk-usage

我收到一条错误消息,说明我的 /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
Run Code Online (Sandbox Code Playgroud)

我用了

kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver
Run Code Online (Sandbox Code Playgroud)

要得到

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
Run Code Online (Sandbox Code Playgroud)

然后选择要删除的第一个图像

$ 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).
Run Code Online (Sandbox Code Playgroud)

Nic*_*Tux 66

在这种情况下,我会使用该dpkg工具强制删除一些内核包。 这不建议经常使用,而且有点危险,而且,但在这种情况下,未满足的依赖项可能会有所帮助。

首先找到系统启动所在的内核。当前加载的那个。打开终端 (CTRL+ALT+T) 并发出以下命令

uname -r
Run Code Online (Sandbox Code Playgroud)

它会向您显示加载的内核,您不应该尝试删除这个内核。

然后发出命令

ls /boot 
Run Code Online (Sandbox Code Playgroud)

它将返回所有已安装的图像。选择一两个并尝试删除它们。尝试强制移除/清除它们。例如

sudo dpkg --force-all -P linux-image-3.13.0-32-generic
Run Code Online (Sandbox Code Playgroud)

您可以对其他图像执行相同操作,以释放一些空间。

然后你可以尝试安装缺少的包,或者

sudo apt-get install -f 
Run Code Online (Sandbox Code Playgroud)

尝试解决依赖关系。

最后,发出“清理旧内核”命令

 sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")
Run Code Online (Sandbox Code Playgroud)

上述命令将删除除当前加载的内核之外的所有内核。

因为你有一个单独的 /boot 分区,请记住你需要经常跟踪它的空间并清理(频率取决于 /boot 的空间)

  • 这对我有用,有一个修改:在用 `dpkg` 删除内核映像后,我必须运行 `sudo apt-get -f autoremove` 来让 `apt-get` 停止抱怨未满足的依赖项。否则,`sudo apt-get -f install` 显然一直在尝试重新安装我用 `dpkg` 删除的所有内核映像,这显然只是再次填满了 `/boot`。 (10认同)
  • 在强制清除和上面@mdunsmuir 注释中的`apt-get -f autoremove` 之后,它仍然希望在上述任何清理操作期间安装所有旧内核。有没有办法告诉它忽略不相关的依赖项并删除一个完整的旧内核? (4认同)
  • 我想补充一点,我还必须使用 `sudo dpkg --force-all -P linux-image-extra-3.13.0-32-generic` 卸载附加功能。否则这些额外的东西仍然依赖于实际的镜像,并且 `-f` 标志会导致镜像被重新安装,然后磁盘空间不足。 (3认同)

小智 6

这就是在 Ubuntu 16.04 上对我有用的方法。

sudo apt autoremove --purge
sudo apt autoremove
sudo apt-get -f install
sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)