![无法清除旧内核(依赖性问题),但 /boot 空间不足](https://linux22.com/image/882183/%E6%97%A0%E6%B3%95%E6%B8%85%E9%99%A4%E6%97%A7%E5%86%85%E6%A0%B8%EF%BC%88%E4%BE%9D%E8%B5%96%E6%80%A7%E9%97%AE%E9%A2%98%EF%BC%89%EF%BC%8C%E4%BD%86%20%2Fboot%20%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3.png)
我正在运行 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
谷歌搜索后我发现这可能是由于启动分区空间不足造成的(果然,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
Garrg!我已经束手无策了,而且力不从心(对 dpkg 或 apt-get 了解不多),所以我需要一些帮助。
问题:
为什么我不能用 卸载旧内核
dpkg
?如果这个问题不能直接解决,我想我最终想知道:我需要做什么才能再次进入可以安装新软件包的状态?
我尝试过的其他方法:
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”:写入失败(设备上没有剩余空间) 没有写入 apport 报告,因为错误消息表明磁盘已满错误 dpkg-deb:错误:子进程 paste 被信号终止(管道断裂) 检查 /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 堆栈交换”
答案1
用于uname -r
显示当前正在运行的内核。请勿删除任何带有此版本号的内容。
您可以找到内核/boot
属于哪些软件包:
for i in /boot/vmlinuz* ; do
dpkg -S $i| egrep -v $(uname -r)
done
您可以使用以下命令删除这些包sudo apt-get purge
包裹名字 ...。
您可以通过查找具有相同版本号的其他软件包来找到更多与要删除的内核相关的软件包:
提取版本号:
for i in /boot/vmlinuz* ; do
dpkg -S $i | egrep -v $(uname -r)
done |cut -d- -f3-4
要查找具有相同版本号的其他软件包:
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
要自动删除当前内核以外的所有内核,以及版本与已删除内核匹配的所有包(危险,威尔罗宾逊):
简单附加
| awk '{print $2}' | xargs sudo apt-get --dry-run purge
到上一个代码片段。当您确定它能完成您想要的操作时,删除--dry-run
。
如果你的/boot
软件包太满,无法删除软件包,你可以/boot
通过删除最旧的/boot/initrd.img*
文件来腾出一些空间,