产生原因

  1. 定制本地yum源的时候漏了几个依赖包,导致软件无法安装
  2. 配置的仓库包不完整,下载的软件的时候缺少几个包
  3. 由于网络环境,无法配置外网源,只能导入rpm包,但是缺少了几个依赖

很多场景下,是不允许配置yum源的

一个简单的栗子

  • 安装zabbix的时候缺少依赖
1
rpm -ivh zabbix-server-mysql-3.4.4-1.el7.x86_64.rpm

报错如下

1
2
3
4
5
6
7
error: Failed dependencies:
libOpenIPMI.so.0()(64bit) is needed by zabbix-server-mysql-3.4.4-1.el7.x86_64
libOpenIPMIposix.so.0()(64bit) is needed by zabbix-server-mysql-3.4.4-1.el7.x86_64
libevent-2.0.so.5()(64bit) is needed by zabbix-server-mysql-3.4.4-1.el7.x86_64
libiksemel.so.3()(64bit) is needed by zabbix-server-mysql-3.4.4-1.el7.x86_64
libnetsnmp.so.31()(64bit) is needed by zabbix-server-mysql-3.4.4-1.el7.x86_64
libodbc.so.2()(64bit) is needed by zabbix-server-mysql-3.4.4-1.el7.x86_64

显然是机器导入的rpm缺少依赖包导致的,但我们只能看到文件,无法看到这个文件在什么包

  • 查询在哪个rpm包
1
yum whatprovides libOpenIPMI.so.0

结果如下,可以看到这文件是OpenIPMI-libs提供的,我们可以直接yum安装,或者由于网络问题,可以下载了导入机器

1
2
3
4
5
Loaded plugins: langpacks, product-id, search-disabled-repos, versionlock
OpenIPMI-libs-2.0.27-1.el7.i686 : The OpenIPMI runtime libraries
Repo : base
Matched from:
Provides : libOpenIPMI.so.0
  • 安装

    • 直接安装

      1
      yum install -y OpenIPMI-libs-2.0.27-1.el7.i686
    • 下载导入

      1
      yumdownloader --destdir=.   OpenIPMI-libs-2.0.27-1.el7.i686

优化解决依赖手法1

除了yum whatprovides libOpenIPMI.so.0这种粗暴方式,其实我们有更好的方法

1
yum deplist  zabbix50-5.0.21-1.el7.x86_64.rpm

输出如下.可以看到什么包需要什么,由谁提供

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Loaded plugins: langpacks, product-id, search-disabled-repos, versionlock
package: zabbix50.x86_64 5.0.21-1.el7
dependency: config(zabbix50) = 5.0.21-1.el7
provider: zabbix50.x86_64 5.0.21-1.el7
dependency: libc.so.6()(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.11)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.14)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.15)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.17)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.2.5)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.3)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.3.4)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.4)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libc.so.6(GLIBC_2.7)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libcrypto.so.10()(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libcrypto.so.10(OPENSSL_1.0.2)(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libcrypto.so.10(libcrypto.so.10)(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libcurl.so.4()(64bit)
provider: libcurl.x86_64 7.29.0-59.el7_9.1
dependency: libdl.so.2()(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libm.so.6()(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libm.so.6(GLIBC_2.2.5)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libpcre.so.1()(64bit)
provider: pcre.x86_64 8.32-17.el7
dependency: libpthread.so.0()(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libpthread.so.0(GLIBC_2.2.5)(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libresolv.so.2()(64bit)
provider: glibc.x86_64 2.17-326.el7_9
dependency: libssl.so.10()(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libssl.so.10(libssl.so.10)(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libz.so.1()(64bit)
provider: zlib.x86_64 1.2.7-20.el7_9
dependency: libz.so.1(ZLIB_1.2.0)(64bit)
provider: zlib.x86_64 1.2.7-20.el7_9
dependency: logrotate
provider: logrotate.x86_64 3.8.6-19.el7
dependency: rtld(GNU_HASH)
provider: glibc.x86_64 2.17-326.el7_9
provider: glibc.i686 2.17-326.el7_9

优化解决依赖手法2

配置一台和生产测试一样的虚拟机

1
yum install zabbix50-5.0.21-1.el7.x86_64.rpm

使用yum install会自己查询依赖,如下所示,我们可以直接得到需要的依赖关系

1
2
3
4
5
6
7
8
正在安装
ansible
为依赖而安装
python-babel
python-httplib2
python-jinja2
python-paramiko
python2-jmespath

我们再次用yumdownloader命令进行下载包

优化解决依赖手法3

我常用的方法,但需要注意的是,使用yumdownloader的时候,他会检测本机的rpm包,然后下载软件缺失的依赖包,那么就是说,如果我本机和目的rpm列表有出入,可能我本机的包更多,那么我下载的依赖可能更少,那么导入目标机器结果依赖可能还是没解决,所以我们这个手法还是需要保持俩台机器的环境一致

1
yumdownloader --destdir=/root/Desktop/rpms --resolve ansible

小工具-rpmreaper

本来是用作清理系统中无用以及它们所依赖的包,它有很直观的ncurses界面来展示已安装的包和它们依赖关系的树形图

  • 安装
1
yum install rpmreaper
  • 运行
1
rpmreaper

rpmrepater会向用户显示已安装包的列表

  1. 你可以使用上/下箭头来滚动屏幕

  2. 你可以在指定包上使用”r”键来显示其依赖关系,循环在指定包上按下”r”键可以展示出余下的信息

  3. “L”标志的意思是说这个包是一片“孤叶”,意思说说没有任何包依赖它

  4. “o”标志是说这个包是整个依赖链的中间部分

  5. 按下”b”键会显示其他依赖于该包的其他包

小工具-yumex

yum Extender (简称 yumex ) , 是 yum 的图形化操作界面。可以通过 yumex 方便的查看软件包,安装、卸载软件包。对于对命令行不熟的人简直就是神奇,管理软件包很方便

  • 安装
1
yum install yumex
  • 使用
1
yumex --root