如果apt在安装某个包需要往/boot里装新内核,但是/boot又满了,那么apt在执行install, purge, remove, autoremove等命令时就会报依赖不满足的错。
可以采用这里的方案解决:https://askubuntu.com/a/906046
思路是先删除/boot里的旧内核,然后再apt --fix-broken install,重新安装这个包,即可解决问题。
由于旧内核是用apt安装的,不能直接rm删除,而是要先dpkg --purge删除,再rm删除。比如要删掉内核5.13.0-40,先找到对应的包:
apt list --installed | grep 5.13.0-40
输出:
linux-headers-5.13.0-40-generic/focal-updates,focal-security,now 5.13.0-40.45~20.04.1 amd64 [installed,automatic]
linux-hwe-5.13-headers-5.13.0-40/focal-updates,focal-updates,focal-security,focal-security,now 5.13.0-40.45~20.04.1 all [installed,automatic]
linux-image-5.13.0-40-generic/focal-updates,focal-security,now 5.13.0-40.45~20.04.1 amd64 [installed,automatic]
linux-modules-5.13.0-40-generic/focal-updates,focal-security,now 5.13.0-40.45~20.04.1 amd64 [installed,automatic]
linux-modules-extra-5.13.0-40-generic/focal-updates,focal-security,now 5.13.0-40.45~20.04.1 amd64 [installed,automatic]
然后一次性全purge掉(逐个purge可能会出现循环依赖的问题):
dpkg --purge linux-headers-5.13.0-40-generic linux-hwe-5.13-headers-5.13.0-40 linux-image-5.13.0-40-generic linux-modules-5.13.0-40-generic linux-modules-extra-5.13.0-40-generic
但是不知道为什么这一步并不会把内核文件删掉,因此再手动把文件删掉:
rm /boot/config-5.13.0-40-generic /boot/System.map-5.13.0-40-generic /boot/initrd.img-5.13.0-40-generic /boot/vmlinuz-5.13.0-40-generic
rm -r /usr/lib/modules/5.13.0-40-generic
然后更新grub:
{spa.hosen-school.com]
{spa.58hww.com]
{spa.landanwang.com]
{spa.nchxm.com]
{spa.easy318.com]
{spa.zhiy1.com]
{spa.intruderecu.com]
{spa.ccsyhjd.com]
update-grub
然后apt --fix-broken install就可以了。
讨论
其实如果能取消需要往/boot里安装新内核的包的安装更好:https://askubuntu.com/questions/525088/how-to-delete-broken-packages-in-ubuntu
sudo dpkg --remove --force-remove-reinstreq package_name
sudo apt-get update
但是不知道为什么虽然apt update是成功了,但是此后使用apt install的时候还是会报以前的错,就好像apt不知道那个包已经被删掉了一样。
而且下面的评论有人说--force-remove-reinstreq是个非常危险的选项。