背景
执行安装软件包命令sudo apt-get install packagename时,提示:The following packages have unmet dependencies
解决方案
无效的解决方案
报错The following packages have unmet dependencies,看起来是依赖项的问题。
ubuntu - How do I resolve `The following packages have unmet dependencies` - Stack Overflow中第一高赞说安装aptitude即可,它管理所有依赖。但是安装这个依赖依然会提示缺少依赖项
对我来说这个方法无效,当然不妨尝试是否可以解决,有人使用该命令可以解决问题。
有效的解决方案
ubuntu - How do I resolve `The following packages have unmet dependencies` - Stack Overflow第二高赞的回答
先执行
sudo apt-get update //同步本地包管理系统的索引文件,与软件源(repository)中的最新版本信息保持一致。不会安装或更改任何软件,只是更新软件包的可用信息
sudo apt-get clean //用于释放磁盘空间,特别是在系统磁盘空间不足时非常有用
sudo apt-get autoremove //这个命令要慎用,它可能会删除一些必要的包,详见文章末尾关于这个命令的坑
如果不行再执行
sudo apt --fix-broken install //修复系统中已安装的软件包依赖关系的错误,尝试下载并安装缺失的依赖软件包,并解决其他软件包冲突问题。
sudo apt-get upgrade //这个命令要慎用,它会更新所有软件到最新版本
sudo dpkg --configure -a //重新配置未成功安装的软件包。
sudo apt-get install -f //修复已安装的软件包依赖关系错误。当某些软件包在安装或卸载过程中出现问题时,可能会导致软件包依赖关系错误,此时可以执行该命令以修复依赖关系错误。需要注意的是,该命令并不会安装新的软件包,它只会修复已安装的软件包依赖关系错误。如果需要安装新的软件包,应该使用sudo apt-get install
命令。
我的步骤
sudo apt-get update
之前已经update了,就三行信息
这里如果报错镜像的,可以考虑更换成其他镜像
清华镜像:ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
阿里镜像 :ubuntu镜像-ubuntu下载地址-ubuntu安装教程-阿里巴巴开源镜像站 (aliyun.com)
安装的时候注意根据服务器版本选择对应镜像,比如16.04版本镜像地址后面为xenial,18.04镜像后面地址为bionic
sudo apt-get clean
sudo apt-get autoremove
可以看到autoremove还是会提示缺少依赖
接着执行
sudo apt --fix-broken install
当执行
sudo apt --fix-broken install
命令时,apt 将会扫描系统中所有已安装的软件包,并尝试修复其中存在的依赖关系错误。如果它发现某个软件包依赖的其他软件包没有安装,则会尝试下载并安装这些软件包。如果它发现系统中存在软件包冲突,则会尝试解决这些冲突。
执行了好几次,都直接Abort了
我尝试了四五次,终于成功了
再次执行安装脚本,成功!
慎用sudo apt autoremove/remove/purge/dist-upgrade
某一天我正开心的执行上述命令来解决依赖问题,执行的命令如下:
1993 sudo apt-get clean
1994 sudo apt-get autoremove
1995 sudo apt --fix-broken install
1996 sudo dpkg --configure -a
1997 sudo apt-get install -f
1998 sudo apt update
接着下午就有人反馈服务器的samba软件不见了,排查了半天发现原因是服务器中的samba包已经被移除了,遂查看日志
zgrep -i 'remove' /var/log/dpkg*
可以看到系统自动执行了删除软件包,而再这几个命令最上面显示`startup packages remove`,这个命令通常是由 `apt autoremove` 等这些删除软件包的命令再执行时留下的记录,因此可以判断是由于之前执行了sudo apt-get autoremove导致samba包被删除了
如何安全使用
加上 --dry-run
参数:
使用以下命令先进行模拟,查看实际会删除什么,不会真正删除:
sudo apt-get autoremove --dry-run
--dry-run
:这是一个选项,表示执行命令时不进行实际的更改。dry-run
模式会模拟命令的执行,显示将要执行的操作,但不真正移除任何软件包。这对于用户在执行实际移除操作前检查哪些软件包会被移除非常有用
或者
sudo apt-get -s autoremove
-s
:这是一个选项,表示apt-get
命令将模拟(simulate)执行。与--dry-run
类似,这会显示将要执行的操作,但不实际执行。
避免误删核心包
如果某些软件是自己安装的,但系统错误地标记为“孤立”,可以用以下命令手动标记为“已安装”:
sudo apt-mark manual <package-name>
慎用remove/purge/dist-upgrade
除了autoremove,dist-upgrade/purge/remove命令也要慎用
- apt-get dist-upgrade 可能移除旧包或安装新包以满足依赖,这可能导致系统不兼容或崩溃,尤其在关键系统上使用时。apt-get dist-upgrade 不仅升级包,还可能移除旧包,这与 apt-get upgrade 的保守策略不同,适合大型系统更新但需谨慎操作
- apt-get autoremove 会清理不再需要的依赖包,但如果用户不熟悉系统,可能误删仍需的软件。
- apt-get purge 不仅移除包,还删除配置文件,适合彻底清理,但可能影响未来重新安装时的配置恢复。
- 关于remove命令的细节,详见apt-get autoremove remove 新手收割者-CSDN博客这篇文章