redhat系列linux系统的yum,有时会出现错误的依赖,用linux早期,遇到该类问题简直是束手无策,无奈之下会在yum的“教唆“下使用“--skip-broken”参数,有时确实可以解决问题,但有时的后果,可以把系统玩儿坏,下次启动无法启动,或出现其它莫名其妙的问题。
列一个典型的错误依赖消息如下:
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libva1-1.3.1-11.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libmad0-0.15.1b-4.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 librtmp0-2.3-1.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libx264_142-0.142-20_20140406.2245.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libxvidcore4-1.3.2-15.el7.x86_64 需要
.......
错误:软件包:libmad0-0.15.1b-4.el7.x86_64 (@atrpms)
需要:/usr/sbin/ldconfig
正在删除: glibc-2.17-55.el7_0.1.i686 (@updates)
未找到
更新,由: glibc-2.17-55.el7_0.3.i686 (updates)
未找到
错误:软件包:librtmp0-2.3-1.el7.x86_64 (@atrpms)
需要:/usr/sbin/ldconfig
正在删除: glibc-2.17-55.el7_0.1.i686 (@updates)
未找到
更新,由: glibc-2.17-55.el7_0.3.i686 (updates)
未找到
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest
看到了最后两行了吧,通常别听信它,小心!
为了优雅的处理类似错误依赖的问题,要搞先了解一下该问题的原因。通常是在自己手动安装了一些非官方rpm包,或使用了多个yum源所致。尤其是升级安装了新版本的包。例如,在centos里为了安装某些软件而使用fedora里的包升级了系统自带的包。
个人经验如下:
先移除/etc/yum.repo.d/下非系统官方的源,备份到其它目录里,处理好问题后还移回来继续用。
yum list 查看系统都有哪些源的包,除了@base @anaconda @updates 之外的,都要留意一下,按“靠谱”程度从低到高逐渐移除。这里的“靠谱程度”,要凭一些经验的。 如本文前面列出错误依赖的这个例子,本人用了好多个源的包,@epel @atrpms @nux-dextop @google-chrome 等这几个第三方源,epel是很高质量的,google-chrome 只有chrome浏览器,其它几个就是不太靠谱的,先移除它们。
检查yum list列出的包名,是否用了fedora,或非本机架构的等的包(如x64系统下686的包),yum erase移除它们。卸载包时,注意着,别把重要的系统包卸载了。千万别这样带-y 参数据 yum erase {包名} -y,yum erase 卸载某个包时,系统提示会提示都移除哪些包,如果看着不对劲就按 N
最后,你会找到出问题的那个包名,即提示错误依赖的信息
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libbluray1-0.4.0-6.el7.x86_64 需要
--> 解决依赖关系完成
错误:软件包:libbluray1-0.4.0-6.el7.x86_64 (@atrpms)
需要:/usr/sbin/ldconfig
正在删除: glibc-2.17-55.el7_0.1.x86_64 (@updates)
未找到
更新,由: glibc-2.17-55.el7_0.3.x86_64 (updates)
未找到
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest
会类似上面所示,只是少数一两个包,尝试卸载一下看看
[root@fsc ~]# rpm -e libbluray1-0.4.0-6.el7.x86_64
错误:依赖检测失败:
libbluray.so.1()(64bit) 被 (已安?) gvfs-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-fuse-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-afc-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-gphoto2-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-goa-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-mtp-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-smb-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-afp-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) gvfs-archive-1.16.4-7.el7.x86_64 需要
libbluray.so.1()(64bit) 被 (已安?) libbluray-0.4.0-6.el7.x86_64 需要
libbluray1 = 0.4.0-6.el7 被 (已安?) libbluray-0.4.0-6.el7.x86_64 需要
那查查系统里该包是什么版本吧 rpm -q {包名}
上面例子里,该包是atrpms源的包,比centos源里的包新。回忆时当时为了安装smplayer,装了一系列atrpms的包。而印象中,atrpms源有时会升级centos的包,所以就造成了yum update 升级系统时造成错误依赖。到centos镜像里下载这个rpm包,rpm --force -Uvh {包文件路径}覆盖安装一下,然后再yum更新试试。
如果没有问题,那就好了。再把yum 源的配置文件移回去,重新yum makecache,然后根据刚才卸载的包的记录,把它们安装上;可参考history 命令的记录.