无法清除旧内核(依赖问题),但 /boot 空间不足

aug*_*ray 6 package-management apt dpkg dependencies kernel

我正在运行 Ubuntu 14.04.4 LTS,我正在尝试使用 apt-get 安装一个新包。不幸的是,每当我尝试时,我都会收到如下消息:

The following packages have unmet dependencies:
 linux-image-extra-3.16.0-70-generic : Depends: linux-image-3.16.0-70-generic but it is not going to be installed
 linux-image-generic-lts-utopic : Depends: linux-image-3.16.0-70-generic but it is not going to be installed
 linux-signed-image-3.16.0-70-generic : Depends: linux-image-3.16.0-70-generic (= 3.16.0-70.90~14.04.1) but it is not going to be installed
Run Code Online (Sandbox Code Playgroud)

做一些谷歌搜索,我发现这可能是由于引导分区上的空间不足造成的(果然,df显示/boot为 100%)。但是,每当我尝试apt-get在接受的答案中运行命令时,都会遇到与上述相同的错误。

寻找另一个没有使用的解决方案apt-get,我遇到了这篇文章,它建议使用诸如sudo dpkg --purge linux-image-4.2.0-15-generic旧的、未使用的内核之类的东西。

dpkg -l | tail -n +6 | grep -E 'linux-image-[0-9]+' | grep -Fv $(uname -r)(来自上述帖子)显示我有几个处于pi状态的旧内核(需要清除,状态是根据安装的)

uname -r告诉我我正在运行的内核是 3.16.0-62-generic,所以我认为我应该可以安全地删除这些旧内核。但是,尝试这样做会sudo dpkg --purge linux-image-3.16.0-49-generic导致:

dpkg: error processing package linux-image-3.16.0-49-generic (--purge):
 dependency problems - not removing
Errors were encountered while processing:
 linux-image-3.16.0-49-generic
Run Code Online (Sandbox Code Playgroud)

嘎嘎!我不知所措,超出了我的深度(对 dpkg 或 apt-get 不太了解),所以我需要一些帮助。

问题:

  1. 为什么我不能卸载旧内核dpkg

  2. 如果这个问题不能直接解决,我想最终我想知道:我需要做什么才能进入可以再次安装新软件包的状态?


我尝试过的其他事情

  • sudo apt-get autoremove : 导致关于未满足的依赖项的原始错误
  • sudo apt-get -f autoremove : 结果是:
解压 linux-image-3.16.0-70-generic (3.16.0-70.90~14.04.1) ...
dpkg: 错误处理存档 /var/cache/apt/archives/linux-image-3.16.0-70-generic_3.16.0-70.90~14.04.1_amd64.deb (--unpack):
 无法将“./boot/vmlinuz-3.16.0-70-generic”的提取数据复制到“/boot/vmlinuz-3.16.0-70-generic.dpkg-new”:写入失败(设备上没有剩余空间)
没有写入报告,因为错误消息指示磁盘已满错误
                                                                              dpkg-deb:错误:子进程粘贴被信号杀死(断管)
检查 /etc/kernel/postrm.d 。
运行部分:执行 /etc/kernel/postrm.d/initramfs-tools 3.16.0-70-generic /boot/vmlinuz-3.16.0-70-generic
运行部分:执行 /etc/kernel/postrm.d/zz-update-grub 3.16.0-70-generic /boot/vmlinuz-3.16.0-70-generic
处理时遇到错误:
 /var/cache/apt/archives/linux-image-3.16.0-70-generic_3.16.0-70.90~14.04.1_amd64.deb
E:子进程/usr/bin/dpkg返回错误码(1)

注意:我已经从“Unix & Linux Stack Exchange”迁移了这个问题

wal*_*tor 4

用于uname -r显示当前正在运行的内核。不要删除具有此版本号的任何内容。

您可以找到内核属于哪些包/boot

for i in /boot/vmlinuz* ; do 
    dpkg -S $i| egrep -v $(uname -r)
done
Run Code Online (Sandbox Code Playgroud)

您可以使用sudo apt-get purge packagename ...删除这些包。

您可以通过查找具有相同版本号的其他软件包来找到更多与要删除的内核相关的软件包:

要提取版本号:

for i in /boot/vmlinuz* ; do 
    dpkg -S $i | egrep -v $(uname -r)
done |cut -d- -f3-4  
Run Code Online (Sandbox Code Playgroud)

要查找具有相同版本号的其他软件包:

for j in $(
    for i in /boot/vmlinuz* ; do 
        dpkg -S $i| egrep -v $(uname -r)
    done |cut -d- -f3-4 ) ; 
do 
     dpkg -l "*$j*" | egrep '^ii|^rc'
done  
Run Code Online (Sandbox Code Playgroud)

要自动删除当前内核以外的所有内核,以及其版本与已删除内核匹配的所有软件包(Danger,Wil Robinson):

只需附加

| awk '{print $2}' | xargs sudo apt-get --dry-run purge
Run Code Online (Sandbox Code Playgroud)

到前面的代码片段。当您确定它可以满足您的要求时,请删除--dry-run.

如果您的包太满而无法删除包,您可以通过删除最旧的文件来/boot腾出一些空间,/boot/boot/initrd.img*