前端要知道的Linux 的 RPM 和 YUM 包管理[每日前端夜话0x5D]

介绍包管理

许多 Linux 程序以源代码形式发行,用户可将它连同所需的手册页、配置文件等一起构建到需要的程序或程序集中。现在,大部分 Linux 发行商都使用预先构建的程序或称为 的程序集,这些包已准备好安装在该发行版上。在本教程,你将学习可帮助安装、更新和删除包的包管理工具。本教程将重点介绍 Red Hat 开发的 Red Hat Package Manager (RPM),以及最初在杜克大学物理系开发的用来管理 Red Hat Linux 系统的 Yellowdog Updater Modified (YUM)

前提条件

要从本系列教程中获得最大收获,你应该拥有 Linux 的基本知识和一个正常工作的 Linux 系统,你可以在这个系统上实践本教程中涵盖的命令。有时程序的不同版本会得到不同的输出格式,所以你的结果可能并不总是与这里给出的清单和图完全相同。具体地讲,我展示的许多输出都高度依赖于我们的系统上已安装的包。你自己的输出可能非常不同,但你应该能够发现一些重要共性。除非另行说明,本教程中的示例使用的是 Fedora 20 系统。

包管理器

RPM、YUM 和 APT(用于 Debian 系统)有许多相似之处。它们都能安装和删除包。有关已安装包的信息保留在数据库中。所有工具都拥有基本的命令行功能,而其他一些工具可以提供对用户更友好的接口。所有工具都能从互联网检索包。

安装 Linux 系统时,通常会安装大量包。可针对系统的目标用途而自定义这个包集合,比如用作服务器、桌面或开发人员工作站。有时,可能还需要安装新包来添加新功能,更新已有的包,甚至删除不再需要的或已被新包淘汰的包。我们看看如何执行这些任务,并解决一些相关的难题,比如找到哪个包可能包含某个特定命令。

RPM

Red Hat 于 1995 年引入了 RPM。RPM 现在是 Linux Standard Base (LSB) 中用于打包的包管理系统。rpm 命令选项分组为 3 个小组:

  • 查询和验证包
  • 安装、升级和删除包
  • 执行其他功能

本教程将重点介绍前两组命令选项。在 RPM 的手册页中可以找到其他功能的信息。

我们还应注意到,rpm 是用于 RPM 的主要命令的命令名称,而 .rpm 是用于 RPM 文件的扩展名。所以 “一个 rpm” 或 “xxx rpm” 通常指一个 RPM 文件,而 rpm 通常指该命令。

YUM

YUM 向 RPM 系统添加了自动更新和包管理,包括依赖项管理。除了了解系统上已安装的包之外,YUM 与 Debian Advanced Packaging Tool (APT) 很相似,因为它使用了存储库,存储库是一种包集合,通常可通过连接网络进行访问。

安装 RPM 包

假设你希望编译一个 Fortran 程序,一位同事告诉你使用 gfortran 命令。你可以尝试使用 gfortran --help,也可以尝试使用 which gfortran,或者尝试使用 type gfortran。但是,如果系统无法找到 gfortran,你可能会看到类似 中所示的输出。

缺少 gfortran 命令
 1[ian@attic-f21 ~]$ gfortran --help
 2bash: gfortran: command not found
 3
 4[ian@attic-f21 ~]$ gfortran --help
 5bash: gfortran: command not found...
 6Install package 'gcc-gfortran' to provide command 'gfortran'? [N/y] n
 7
 8
 9[ian@attic-f21 ~]$ which gfortran
10/usr/bin/which: no gfortran in (/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:
11/home/ian/.local/bin:/home/ian/bin)
12
13[ian@attic-f21 ~]$ type gfortran
14bash: type: gfortran: not found

如果您没有从 中的第二个输出表单中获得有帮助的建议,可以与您的同事核对一下,确定要安装哪个包。否则,可以推测 gfortran 命令在 gfortran 包中。这通常是一种合理的推测,但并不总是对的,至少在本例中是不正确的。我们稍后会了解如何找到正确的包。假设您知道它实际上在 gcc-gfortran 包中,而且您已下载或获取了该包的副本,您可以尝试使用 rpm 命令和 -i(表示安装)选项来安装它,如 中所示。

使用 rpm - take 1 安装 gcc-gfortran
1[root@attic-f21 ~]# rpm -i  gcc-gfortran-4.9.2-6.fc21.x86_64.rpm 
2error: Failed dependencies:
3    libquadmath-devel = 4.9.2-6.fc21 is needed by gcc-gfortran-4.9.2-6.fc21.x86_64

rpm 命令知道该包有一个依赖项,但不幸的是,它不会帮助您解析该依赖项。您需要获取一个或多个依赖包,再次尝试,看看是否有其他依赖项 — 一直这样做,直到已满足所有依赖关系。一个便捷的方法是,您可以向 rpm 命令提供一个要安装的包列表,如果所有依赖关系都得到满足,它会按正确的顺序安装所有这些包。所以您至少不需要按正确的顺序手动安装每个包。

如果您使用过 Debian 的 APT,现在您可能希望拥有类似 apt-get 的命令,该命令会查找您需要的资源(包括依赖项)并进行安装。对于基于 RPM 的系统,YUM(或 Yellowdog Updater Modified)提供了这样的功能。 展示了如何使用 yum 命令和 install 选项安装 gcc-gfortran 和所需的必备依赖项。

使用 yum 安装 gcc-gfortran
 1[root@attic-f21 ~]# yum install gcc-gfortran
 2Loaded plugins: langpacks
 3Resolving Dependencies
 4--> Running transaction check
 5---> Package gcc-gfortran.x86_64 0:4.9.2-6.fc21 will be installed
 6--> Processing Dependency: libquadmath-devel = 4.9.2-6.fc21 for package: gcc-gfortran-4.9.2-6.fc21.x86_64
 7--> Running transaction check
 8---> Package libquadmath-devel.x86_64 0:4.9.2-6.fc21 will be installed
 9--> Finished Dependency Resolution
10
11Dependencies Resolved
12
13================================================================================
14 Package                 Arch         Version               Repository     Size
15================================================================================
16Installing:
17 gcc-gfortran            x86_64       4.9.2-6.fc21          updates       7.7 M
18Installing for dependencies:
19 libquadmath-devel       x86_64       4.9.2-6.fc21          updates        37 k
20
21Transaction Summary
22================================================================================
23Install  1 Package (+1 Dependent package)
24
25Total download size: 7.7 M
26Installed size: 18 M
27Is this ok [y/d/N]: y
28Downloading packages:
29(1/2): libquadmath-devel-4.9.2-6.fc21.x86_64.rpm            |  37 kB  00:00     
30(2/2): gcc-gfortran-4.9.2-6.fc21.x86_64.rpm                 | 7.7 MB  00:04     
31--------------------------------------------------------------------------------
32Total                                              1.6 MB/s | 7.7 MB  00:04     
33Running transaction check
34Running transaction test
35Transaction test succeeded
36Running transaction (shutdown inhibited)
37  Installing : libquadmath-devel-4.9.2-6.fc21.x86_64                        1/2 
38  Installing : gcc-gfortran-4.9.2-6.fc21.x86_64                             2/2 
39  Verifying  : libquadmath-devel-4.9.2-6.fc21.x86_64                        1/2 
40  Verifying  : gcc-gfortran-4.9.2-6.fc21.x86_64                             2/2 
41
42Installed:
43  gcc-gfortran.x86_64 0:4.9.2-6.fc21                                            
44
45Dependency Installed:
46  libquadmath-devel.x86_64 0:4.9.2-6.fc21                                       
47
48Complete!

YUM 在名为 “updates” 的存储库中找到了 gcc-gfortran 和 libquadmath-devel 的 x86_64 版本(稍后会更详细地进行介绍),并确定了总下载大小。在回复 “Y” 同意该事务后,它会下载这两个包,然后安装依赖项,最后安装 gcc-gfortran。您会在本教程后面进一步了解依赖项。

备注:在 中,YUM 找到了 gcc-gfortran 包的最新版本,该恰好具有与我们尝试在 中安装的版本相同的级别 (4.9.2-6)。您通常想安装包的最新版本,但如果需要更早的版本,或者需要 i686 版而不是 x86_64 版,可以提供附加的限定条件。请参阅 yum 命令的手册页中介绍指定包名称的部分。

包位置

在上一节中,你学习了如何安装 RPM 包。不过这些包来自何处?yum 如何知道从何处下载包?可将 /etc/yum.repos.d/ 目录作为起点,它通常包含一些存储库 文件。这是存放存储库信息的默认位置,但也可以在 YUM 配置文件(通常为 /etc/yum.conf)中指定其他位置。 显示了与我们从中将 gcc-gfortran 安装在 Fedora 21 系统上的位置对应的 fedora-updates.repo。

典型的存储库文件分为 3 个部分,一部分用于正常的包,一部分用于调试包,最后一部分用于源包。通常,会在不同位置或镜像 提供一个发行版的包的多个副本。所以存储库文件告诉 yum 在何处查找每部分的最新镜像列表。请注意,发行版的版本级别和机器架构已被参数化,所以 yum 会从 https://mirrors.fedoraproject.org/metalink?repo=updates-released-f21&arch=x86_64 下载针对我的 x86_64 Fedora 21 系统的列表。

除了存储库位置之外,存储库文件还会告知某个特定存储库是否已启用,是否应使用 GPG 签名检查下载的包。

/etc/yum.repos.d/*.repo
 1[ian@attic-f21 ~]$ cat /etc/yum.repos.d/fedora-updates.repo
 2[updates]
 3name=Fedora $releasever - $basearch - Updates
 4failovermethod=priority
 5#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/
 6metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$
 7basearch
 8enabled=1
 9metadata_expire=6h
10gpgcheck=1
11gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
12skip_if_unavailable=False
13
14[updates-debuginfo]
15name=Fedora $releasever - $basearch - Updates - Debug
16failovermethod=priority
17#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/debug/
18metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&
19arch=$basearch
20enabled=0
21gpgcheck=1
22metadata_expire=6h
23gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
24skip_if_unavailable=False
25
26[updates-source]
27name=Fedora $releasever - Updates Source
28failovermethod=priority
29#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/SRPMS/
30metalink=https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f$releasever&
31arch=$basearch
32enabled=0
33gpgcheck=1
34metadata_expire=6h
35gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
36skip_if_unavailable=False

YUM 和 RPM 使用本地数据库来确定安装了哪些包。存储在本地数据库中的包的元数据是从启用的存储库检索而来的。尽管您很少需要担忧本地数据库,但可以使用命令 yum clean 清除本地存储的信息的各个部分,使用 yum makecache 在本地数据库中为启用的存储库创建信息。举例而言,如果您更改了存储库配置,则可以这么做。

删除 RPM 包

如果想要删除包,可使用 yumremove 选项或 rpm-e 选项。一个使用 rpm -e 删除 gcc-gfortran 的测试运行如 所示。如果该包可以删除,则没有输出。

gcc-gfortran 的删除测试
1[root@attic-f21 ~]# rpm -e --test gcc-gfortran

不同于使用 apt-get 对 Debian 包的模拟删除,RPM 系统不会维护自动添加的包信息,所以无法轻松地确定还删除了哪些依赖项。但是,如果您在单个命令上指定删除多个包,没有依赖项的包会在有依赖项的包之前删除。

使用 rpm 删除包时,在删除包之前没有提示,这与安装包时不同。但是,如果您尝试删除其他某个包需要的包,该操作不会执行,您会获得一条如 所示的错误消息。

使用 rpm 删除依赖包
1[root@attic-f21 ~]# rpm -e libquadmath-devel
2error: Failed dependencies:
3    libquadmath-devel = 4.9.2-6.fc21 is needed by (installed) gcc-gfortran-4.9.2-6.fc21.x86_64

如果使用 yum remove,在执行事务测试后将提示您。如果尝试删除的包是其他某些已安装包的依赖包,YUM 会建议删除这些包和依赖包,如 所示。

使用 yum 删除依赖包
 1[root@attic-f21 ~]# yum remove libquadmath-devel
 2Loaded plugins: langpacks
 3Resolving Dependencies
 4--> Running transaction check
 5---> Package libquadmath-devel.x86_64 0:4.9.2-6.fc21 will be erased
 6--> Processing Dependency: libquadmath-devel = 4.9.2-6.fc21 for package: gcc-gfortran-4.9.2-6.fc21.x86_64
 7--> Running transaction check
 8---> Package gcc-gfortran.x86_64 0:4.9.2-6.fc21 will be erased
 9--> Finished Dependency Resolution
10
11Dependencies Resolved
12
13================================================================================
14 Package                 Arch         Version              Repository      Size
15================================================================================
16Removing:
17 libquadmath-devel       x86_64       4.9.2-6.fc21         @updates        18 k
18Removing for dependencies:
19 gcc-gfortran            x86_64       4.9.2-6.fc21         @updates        18 M
20
21Transaction Summary
22================================================================================
23Remove  1 Package (+1 Dependent package)
24
25Installed size: 18 M
26Is this ok [y/N]: n
27Exiting on user command
28Your transaction was saved, rerun it with:
29 yum load-transaction /tmp/yum_save_tx.2015-07-27.22-01.amzaZh.yumtx

升级 RPM 包

现在您已经知道了如何安装和删除 RPM,让我们看看如何将 RPM 包升级到更高级别。可以使用 yum update 更新整个系统,或者可以指定一个包或一种通配符规范。 展示了如何更新所有名称以 “pop” 开头的包。注意,这里使用了省略符号来阻止 "*" 的 shell 扩展。

使用 yum update 更新
 1[root@attic-f21 ~]# yum update 'pop*'
 2Loaded plugins: langpacks
 3Resolving Dependencies
 4--> Running transaction check
 5---> Package poppler.x86_64 0:0.26.2-3.fc21 will be updated
 6---> Package poppler.x86_64 0:0.26.2-9.fc21 will be an update
 7---> Package poppler-data.noarch 0:0.4.7-1.fc21 will be updated
 8---> Package poppler-data.noarch 0:0.4.7-2.fc21 will be an update
 9---> Package poppler-glib.x86_64 0:0.26.2-3.fc21 will be updated
10---> Package poppler-glib.x86_64 0:0.26.2-9.fc21 will be an update
11---> Package poppler-utils.x86_64 0:0.26.2-3.fc21 will be updated
12---> Package poppler-utils.x86_64 0:0.26.2-9.fc21 will be an update
13--> Finished Dependency Resolution
14
15Dependencies Resolved
16
17==========================================================================
18 Package             Arch         Version             Repository     Size
19==========================================================================
20Updating:
21 poppler             x86_64       0.26.2-9.fc21       updates       798 k
22 poppler-data        noarch       0.4.7-2.fc21        updates       2.2 M
23 poppler-glib        x86_64       0.26.2-9.fc21       updates       141 k
24 poppler-utils       x86_64       0.26.2-9.fc21       updates       171 k
25
26Transaction Summary
27==========================================================================
28Upgrade  4 Packages
29
30Total download size: 3.2 M
31Is this ok [y/d/N]: y
32Downloading packages:
33Delta RPMs reduced 3.1 M of updates to 315 k (89% saved)
34(1/4): poppler-data-0.4.7-1.fc21_0.4.7-2.fc21.noarch. |  70 kB  00:00     
35 ...    
37(4/4): poppler-utils-0.26.2-9.fc21.x86_64.rpm         | 171 kB  00:00     
38Finishing delta rebuilds of 3 package(s) (3.1 M)
39--------------------------------------------------------------------------
40Total                                        142 kB/s | 486 kB  00:03     
41Running transaction check
42Running transaction test
43Transaction test succeeded
44Running transaction (shutdown inhibited)
45  Updating   : poppler-data-0.4.7-2.fc21.noarch                       1/8 
46  ... 
60  Verifying  : poppler-0.26.2-3.fc21.x86_64                           8/8 
61
62Updated:
63  poppler.x86_64 0:0.26.2-9.fc21                                          
64  poppler-data.noarch 0:0.4.7-2.fc21                                      
65  poppler-glib.x86_64 0:0.26.2-9.fc21                                     
66  poppler-utils.x86_64 0:0.26.2-9.fc21                                    
67
68Complete!

如果知道 RPM 文件位于何处,或者已下载它们,还可以使用 rpm 命令更新它们。更新与安装类似,但使用的是 -U-F 选项,而不是 -i 选项。这两个选项之间的区别在于,-U 选项将升级一个现有包或者在该包未安装时安装它,而 -F 选项仅升级或刷新 一个已安装的包。出于这个原因,通常会使用 -U 选项,尤其是在命令行包含一组 RPM 时。这样,将安装未安装的包,升级已安装的包。其他两个选项 -v(详细)和 -h(哈希标记)通常用于提供进度指标。 展示了如何使用 rpm 命令更新 cairo 包和它的 cairo-gobject 依赖项。我们已将 cairo rpm 下载到根用户的主目录,而且需要从一个更新镜像获取 cairo-gobject 包。

使用 rpm 更新包
 1[root@attic-f21 ~]# ls *.rpm
 2cairo-1.14.2-1.fc21.x86_64.rpm
 3[root@attic-f21 ~]# rpm -Uvh *.rpm \
 4> http://download.fedoraproject.org/pub/fedora/linux/updates/21/\
 5> x86_64/c/cairo-gobject-1.14.2-1.fc21.x86_64.rpm
 6Retrieving http://download.fedoraproject.org/pub/fedora/linux/updates/21/x86_64/c/cairo-g
 7object-1.14.2-1.fc21.x86_64.rpm
 8Preparing...                          ################################# [100%]
 9Updating / installing...
10   1:cairo-1.14.2-1.fc21              ################################# [ 25%]
11   2:cairo-gobject-1.14.2-1.fc21      ################################# [ 50%]
12Cleaning up / removing...
13   3:cairo-gobject-1.13.1-0.4.git337ab################################# [ 75%]
14   4:cairo-1.13.1-0.4.git337ab1f.fc21 ################################# [100%]
15

查询 RPM 包

在我们的示例中,您可以看到,使用 rpm 命令安装 rpm 需要包文件的完整名称(或 URL),比如 gcc-gfortran-4.9.2-6.fc21.x86_64.rpm。另一方面,使用 yum 安装或使用任一命令删除 rpm 仅需要包名称,比如 gcc-gfortran。与 APT 一样,RPM 维护着已安装包的内部数据库,允许您使用包名称来处理已安装的包。在本节中,我们使用 rpm 命令的 -q(表示查询)选项或关联的 yum 查询,查看这个数据库中提供的一些信息。

我们将重新安装 gcc-gfortran 包来提供我们的示例。

这个基本查询仅循环查询某个包是否已安装,如果已安装,它的版本是什么。添加 -i 选项,您会获得该包的信息。请注意,您需要拥有根用户权限才能安装、升级或删除包,但非根用户可以对 rpm 数据库执行查询。

显示 gcc-gfortran 的信息
 1[ian@attic-f21 ~]$ yum list gcc-gfortran
 2Loaded plugins: langpacks
 3Installed Packages
 4gcc-gfortran.x86_64                    4.9.2-6.fc21                     @updates
 5Available Packages
 6gcc-gfortran.i686                      4.9.2-6.fc21                     updates 
 7
 8[ian@attic-f21 ~]$ rpm -q gcc-gfortran
 9gcc-gfortran-4.9.2-6.fc21.x86_64
10
11[ian@attic-f21 ~]$ yum info gcc-gfortran
12Loaded plugins: langpacks
13Installed Packages
14Name        : gcc-gfortran
15Arch        : x86_64
16Version     : 4.9.2
17Release     : 6.fc21
18Size        : 18 M
19Repo        : installed
20From repo   : updates
21Summary     : Fortran support
22URL         : http://gcc.gnu.org
23License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and
24            : LGPLv2+ and BSD
25Description : The gcc-gfortran package provides support for compiling Fortran
26            : programs with the GNU Compiler Collection.
27
28Available Packages
29Name        : gcc-gfortran
30Arch        : i686
31Version     : 4.9.2
32Release     : 6.fc21
33Size        : 7.5 M
34Repo        : updates/21/x86_64
35Summary     : Fortran support
36URL         : http://gcc.gnu.org
37License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and
38            : LGPLv2+ and BSD
39Description : The gcc-gfortran package provides support for compiling Fortran
40            : programs with the GNU Compiler Collection.
41
42[ian@attic-f21 ~]$ rpm -qi gcc-gfortran
43Name        : gcc-gfortran
44Version     : 4.9.2
45Release     : 6.fc21
46Architecture: x86_64
47Install Date: Mon 27 Jul 2015 09:36:14 PM EDT
48Group       : Development/Languages
49Size        : 19126083
50License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
51Signature   : RSA/SHA256, Fri 13 Feb 2015 09:02:15 PM EST, Key ID 89ad4e8795a43f54
52Source RPM  : gcc-4.9.2-6.fc21.src.rpm
53Build Date  : Thu 12 Feb 2015 07:40:58 AM EST
54Build Host  : buildhw-08.phx2.fedoraproject.org
55Relocations : (not relocatable)
56Packager    : Fedora Project
57Vendor      : Fedora Project
58URL         : http://gcc.gnu.org
59Summary     : Fortran support
60Description :
61The gcc-gfortran package provides support for compiling Fortran
62programs with the GNU Compiler Collection.

更详细的清单可以显示一些可能与某个 RPM 包关联的标签。您会注意到,rpmyum 以稍微不同的格式显示了稍微不同的信息。对于本教程,我们将坚持使用标准命令选项所提供的基本输出。如果想使用 rpm --queryformat 选项构建自定义查询输出,请参阅手册页。如果想知道您的 rpm 版本支持的所有标签,可以尝试运行 rpm --querytags

查询包文件

上述包命令查询 RPM 数据库中已安装的包。如果您仅下载了一个包并想要同样的信息,可以在查询中使用 -p 选项(表示包文件)并指定(用于安装该包的)包文件 名来获得此信息。 显示了我们之前下载的两个 vim 包的这些信息。我们仅以根用户身份运行它,因为这些文件位于根用户的主目录中。可以添加其他查询选项,比如添加 -l 来列出文件或添加 -i 来列出信息。

显示两个 vim 包的包文件信息
1[ian@attic-f21 ~]$ # Query vim packages
2[ian@attic-f21 ~]$ rpm -qp *.rpm
3vim-common-7.4.475-2.fc21.x86_64
4vim-enhanced-7.4.475-2.fc21.x86_64
5[ian@attic-f21 ~]$ # Query vim configuration files
6[ian@attic-f21 ~]$ rpm -qpc *.rpm
7/etc/vimrc
8/etc/profile.d/vim.csh
9/etc/profile.d/vim.sh

查询所有已安装的包

-a 选项将您的查询应用到所有已安装的包。这可能生成大量输出,所以通常应该将它与一个或多个过滤条件结合使用,比如使用 sort 对清单排序,使用 moreless 分页显示它,使用 wc 获取包或文件数量,或者在不确定名称的时候,使用 grep 搜索包。 显示了以下查询:

  1. 系统上所有包的有序列表
  2. 系统上所有包的总数
  3. 系统上所有包中的所有文件总数
  4. 使用 RPM 安装的所有文档文件总数
  5. 搜索名称包含 “fortran”(不区分大小写)的所有包
查询所有包
 1[ian@attic-f21 ~]$ rpm -qa | sort | more
 2aaajohan-comfortaa-fonts-2.004-4.fc21.noarch
 3aalib-libs-1.4.0-0.26.rc5.fc21.x86_64
 4abattis-cantarell-fonts-0.0.16-2.fc21.noarch
 5abrt-2.3.0-8.fc21.x86_64
 6abrt-addon-ccpp-2.3.0-8.fc21.x86_64
 7abrt-addon-kerneloops-2.3.0-8.fc21.x86_64
 8abrt-addon-pstoreoops-2.3.0-8.fc21.x86_64
 9abrt-addon-python-2.3.0-8.fc21.x86_64
10abrt-addon-python3-2.3.0-8.fc21.x86_64
11abrt-addon-vmcore-2.3.0-8.fc21.x86_64
12abrt-addon-xorg-2.3.0-8.fc21.x86_64
13abrt-cli-2.3.0-8.fc21.x86_64
14abrt-dbus-2.3.0-8.fc21.x86_64
15abrt-desktop-2.3.0-8.fc21.x86_64
16abrt-gui-2.3.0-8.fc21.x86_64
17abrt-gui-libs-2.3.0-8.fc21.x86_64
18abrt-java-connector-1.1.0-2.fc21.x86_64
19abrt-libs-2.3.0-8.fc21.x86_64
20abrt-plugin-bodhi-2.3.0-8.fc21.x86_64
21abrt-python-2.3.0-8.fc21.x86_64
22abrt-python3-2.3.0-8.fc21.x86_64
23abrt-retrace-client-2.3.0-8.fc21.x86_64
24abrt-tui-2.3.0-8.fc21.x86_64
25--More--
26[[ian@attic-f21 ~]$ rpm -qa | wc -l
271540
28[ian@attic-f21 ~]$ rpm -qal | wc -l
29179111
30[ian@attic-f21 ~]$ rpm -qad | wc -l
3147711
32[ian@attic-f21 ~]$ rpm -qa | grep -i fortran
33gcc-gfortran-4.9.2-6.fc21.x86_64
34libgfortran-4.9.2-6.fc21.x86_64

使用 rpm -qa 可简化多个系统的管理。如果您将有序输出重定向到一个机器上的一个文件,然后在另一个机器上执行相同操作,可以使用 diff 程序查找区别。

RPM 依赖项

您之前已经了解到,由于存在依赖项,我们擦除 libquadmath-devel 的尝试失败了。除了文件之外,RPM 包还可以包含其他包可能依赖的任意功能

正如您看到的,这通常没有问题。如果需要一次安装多个包,其中一些包可能会依赖其他包,可以使用 yum,或者向 rpm -Uvh 命令提供整个包列表,它将分析依赖项并按正确的顺序执行安装。

除了尝试安装和擦除包并获得错误消息之外,还可以通过一些方式确定某个包需要或依赖哪些文件或功能。

rpm 命令提供了询问已安装的包或包文件来确定它们依赖或需要 哪些功能的选项。这是 --requires 选项,可以将它缩写为 -R。 显示了 gcc-gfortran 需要的功能。如果想要查询包文件而不是 RPM 数据库,可以添加 -p 选项并使用完整的 RPM 文件名。

gcc-gfortran 需要哪些功能
 1[ian@attic-f21 ~]$ rpm -qR gcc-gfortran
 2/bin/sh
 3/bin/sh
 4/sbin/install-info
 5/sbin/install-info
 6gcc = 4.9.2-6.fc21
 7ld-linux-x86-64.so.2()(64bit)
 8ld-linux-x86-64.so.2(GLIBC_2.3)(64bit)
 9libc.so.6()(64bit)
10libc.so.6(GLIBC_2.11)(64bit)
11libc.so.6(GLIBC_2.14)(64bit)
12libc.so.6(GLIBC_2.2.5)(64bit)
13libc.so.6(GLIBC_2.3)(64bit)
14libc.so.6(GLIBC_2.4)(64bit)
15libdl.so.2()(64bit)
16libdl.so.2(GLIBC_2.2.5)(64bit)
17libgfortran = 4.9.2-6.fc21
18libgfortran.so.3()(64bit)
19libgmp.so.10()(64bit)
20libm.so.6()(64bit)
21libmpc.so.3()(64bit)
22libmpfr.so.4()(64bit)
23libquadmath = 4.9.2-6.fc21
24libquadmath-devel = 4.9.2-6.fc21
25libz.so.1()(64bit)
26rpmlib(CompressedFileNames) <= 3.0.4-1
27rpmlib(FileDigests) <= 4.6.0-1
28rpmlib(PayloadFilesHavePrefix) <= 4.0-1
29rpmlib(PayloadIsXz) <= 5.2-1
30rtld(GNU_HASH)

将功能与提供它们的包匹配可能有点困难。yum 命令和 deplist 选项可在这里派上用场。如果您提供了一个未限定版本的包名称,可能会获得一个包含其他已知版本的清单。 展示了如何获取已安装的 gcc-gfortran 版本的依赖项列表。

RPM 包文件完整性

为了确保完整性,RPM 包通常包含一个摘要(比如 MD5 或 SHA1)并进行了数字签名。经过数字签名的包需要一项验证功能。要检查 RPM 包文件的完整性,可使用 rpm--checksig(缩写为 -K)选项。您通常会发现,添加 -v 选项来获取更详细输出很有用。 显示了 vim-enhanced RPM 的一个例子。

检查 vim-enhanced 包文件的完整性
1[ian@attic-f21 ~]$ rpm -vK vim-enhanced-7.4.475-2.fc21.x86_64.rpm
2vim-enhanced-7.4.475-2.fc21.x86_64.rpm:
3    Header V3 RSA/SHA256 Signature, key ID 95a43f54: OK
4    Header SHA1 digest: OK (696e492a4ee7a672cb3851d220de804dce0c9484)
5    V3 RSA/SHA256 Signature, key ID 95a43f54: OK
6    MD5 digest: OK (6bc225b37f43e7e7075668d04a73b9ea)

您可能获得一个类似 的输出行,这意味着您有一个已签名的包,但 RPM 数据库中没有所需的公钥。不同的 RPM 版本可能提供不同的验证方法。

1[ian@attic-f21 ~]$ rpm -K audacity-freeworld-2.1.1-1.fc21.x86_64.rpm 
2audacity-freeworld-2.1.1-1.fc21.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: 
3(MD5) PGP#6446d859) 
4[ian@attic-f21 ~]$ rpm -vK audacity-freeworld-2.1.1-1.fc21.x86_64.rpm 
5audacity-freeworld-2.1.1-1.fc21.x86_64.rpm:
6    Header V3 RSA/SHA256 Signature, key ID 6446d859: NOKEY
7    Header SHA1 digest: OK (231ac5339a8084ba84a4a25d2a996f5d52434935)
8    V3 RSA/SHA256 Signature, key ID 6446d859: NOKEY
9    MD5 digest: OK (188d9cc3bfa2ac9b87483e387c8e74b6)

验证已安装的包

就像检查 rpm 的完整性一样,也可以使用 rpm -V 检查已安装文件的完整性。这一步可确保文件自 rpm 安装以来未被修改。如 所示,如果该包是正常的,则此命令没有输出,但您可以添加 -v 选项来获得更详细的输出。

验证已安装的 vim-common 包
1[ian@attic-f21 ~]$ rpm -V vim-common

我们切换为根用户,删除 /usr/bin/xxd 并将 /usr/share/vim/vim74/syntax/bindzone.vim 替换为 /bin/bash 来损坏 vim-common 安装。尝试再执行一次验证。结果如 所示。

篡改 vim-common 包
 1[root@attic-f21 ~]# rpm -qf /usr/bin/xxd /usr/share/vim/vim74/syntax/bindzone.vim
 2vim-common-7.4.475-2.fc21.x86_64
 3vim-common-7.4.475-2.fc21.x86_64
 4[root@attic-f21 ~]# rm /usr/bin/xxd
 5rm: remove regular file ‘/usr/bin/xxd’? y
 6[root@attic-f21 ~]# cp /bin/bash /usr/share/vim/vim74/syntax/bindzone.vim
 7cp: overwrite ‘/usr/share/vim/vim74/syntax/bindzone.vim’? y
 8[root@attic-f21 ~]# rpm -V vim-common
 9missing     /usr/bin/xxd
10S.5....T.    /usr/share/vim/vim74/syntax/bindzone.vim

此输出表明,/usr/share/vim/vim74/syntax/bindzone.vim 文件未通过 MD5 校验和、文件大小和 mtime 测试。解决该问题的一种方式是删除该包并重新安装它,但存在其他依赖于 vim-common 的包,这些包已安装且仍运行正常。解决方案是使用 rpm--force 选项或 yumreinstall 函数强制重新安装它。 展示了如何使用 yum 重新安装,然后验证该包现在是正常的,删除的文件已被恢复。

重新安装 vim-common 包
 1[root@attic-f21 ~]# yum reinstall vim-common
 2Loaded plugins: langpacks
 3Resolving Dependencies
 4--> Running transaction check
 5---> Package vim-common.x86_64 2:7.4.475-2.fc21 will be reinstalled
 6--> Finished Dependency Resolution
 7
 8Dependencies Resolved
 9
10================================================================================
11 Package           Arch          Version                    Repository     Size
12================================================================================
13Reinstalling:
14 vim-common        x86_64        2:7.4.475-2.fc21           fedora        5.9 M
15
16Transaction Summary
17================================================================================
18Reinstall  1 Package
19
20Total download size: 5.9 M
21Installed size: 21 M
22Is this ok [y/d/N]: y
23Downloading packages:
24vim-common-7.4.475-2.fc21.x86_64.rpm                        | 5.9 MB  00:03     
25Running transaction check
26Running transaction test
27Transaction test succeeded
28Running transaction (shutdown inhibited)
29  Installing : 2:vim-common-7.4.475-2.fc21.x86_64                           1/1 
30  Verifying  : 2:vim-common-7.4.475-2.fc21.x86_64                           1/1 
31
32Installed:
33  vim-common.x86_64 2:7.4.475-2.fc21                                            
34
35Complete!
36[root@attic-f21 ~]# rpm -V vim-common
37[root@attic-f21 ~]# ls /usr/bin/xxd
38/usr/bin/xxd

如果需要更多权力

包管理系统通常会按顺序保存您的包。但是,如果您设法删除一个包中的某个重要的文件(而且在不删除该包的情况下重新安装它没有修复问题),那么您可能需要在重新安装之前删除该包。对于这种情况,您可能希望删除现有副本并重新安装它,而不是卸载并重新安装所有依赖它的包。为此,在删除包时,可以使用 rpm 命令的 --nodeps 选项绕过依赖项检查。 展示了在意外删除 vim-common 包中包含的 /usr/bin/xxd 文件(像我们之前所做的一样)时,如何使用此方法进行修复。

使用 rpm 更新包
 1[root@attic-f21 ~]# rm /usr/bin/xxd
 2rm: remove regular file ‘/usr/bin/xxd’? y
 3[root@attic-f21 ~]# # Oops! we needed that file
 4[root@attic-f21 ~]# rpm -Fvh vim-common-7.4.475-2.fc21.x86_64.rpm 
 5[root@attic-f21 ~]# ls /usr/bin/xxd
 6ls: cannot access /usr/bin/xxd: No such file or directory
 7[root@attic-f21 ~]# # Oh! Freshening the package didn't replace the missing file
 8[root@attic-f21 ~]# rpm -e vim-common
 9error: Failed dependencies:
10    vim-common = 2:7.4.475-2.fc21 is needed by (installed) vim-enhanced-2:7.4.475-2.fc21.x86_64
11[root@attic-f21 ~]# # Can't remove vim-common because vim-enhanced needs it
12[root@attic-f21 ~]# rpm -e --nodeps vim-common
13warning: file /usr/bin/xxd: remove failed: No such file or directory
14[root@attic-f21 ~]# # Bypassing the dependency check allowed removal
15[root@attic-f21 ~]# # No surprise that /usr/bin/xxd was not found
16[root@attic-f21 ~]# # Update (or install) vim-common again
17[root@attic-f21 ~]# rpm -Uvh vim-common-7.4.475-2.fc21.x86_64.rpm
18Preparing...                          ################################# [100%]
19Updating / installing...
20   1:vim-common-2:7.4.475-2.fc21      ################################# [100%]
21[root@attic-f21 ~]# ls /usr/bin/xxd
22/usr/bin/xxd
23[root@attic-f21 ~]# # And /usr/bin/xxd is back

如果现在发生意外且普通更新过程失败,您已有一些更新或修复方法。请注意,还可以在安装 RPM 时绕过依赖项检查,但这通常不是一个好主意。

从存储库下载 RPM

尽管 yum 将自动从存储库检索包,但您可能想下载 RPM 并保存它们,以便将它们安装在未连网的系统上或检查它们的内容,或者出于其他某种原因。您可以使用 yumdownloader 命令这么做,如 所示。在我们的示例中,gcc-gfortran.x86_64 包已安装,所以不需要下载额外的包。

下载 gcc-gfortran 包
1[ian@attic-f21 ~]$ yumdownloader --resolve gcc-gfortran.x86_64
2Loaded plugins: langpacks
3--> Running transaction check
4---> Package gcc-gfortran.x86_64 0:4.9.2-6.fc21 will be reinstalled
5--> Finished Dependency Resolution
6gcc-gfortran-4.9.2-6.fc21.x86_64.rpm                       | 7.7 MB  00:04

yumdownloader--resolve 选项将导致下载其他所需的包。为了演示这一点, 还使用 --resolve 选项在我们下载 gcc-gfortran 时显示已下载的文件。请注意,我们没有指定架构(x86_64 或 i686),所以默认下载为 i686 版。

下载 gcc-gfortran 包
 1[ian@attic-f21 ~]$ yumdownloader --resolve gcc-gfortran
 2Loaded plugins: langpacks
 3updates/21/x86_64/metalink                                 |  14 kB  00:00     
 4--> Running transaction check
 5-...
41---> Package nss-softokn-freebl.i686 0:3.19.2-1.0.fc21 will be installed
42--> Finished Dependency Resolution
43(1/12): gcc-gfortran-4.9.2-6.fc21.i686.rpm                 | 7.5 MB  00:04     
44(2/12): glibc-2.20-8.fc21.i686.rpm                         | 4.1 MB  00:02     
45(3/12): gmp-6.0.0-9.fc21.i686.rpm                          | 420 kB  00:01     
46(4/12): libgcc-4.9.2-6.fc21.i686.rpm                       |  97 kB  00:00     
47(5/12): libgfortran-4.9.2-6.fc21.i686.rpm                  | 270 kB  00:00     
48(6/12): gcc-gfortran-4.9.2-6.fc21.x86_64.rpm               | 7.7 MB  00:09     
49(7/12): libmpc-1.0.2-3.fc21.i686.rpm                       |  56 kB  00:01     
50(8/12): libquadmath-4.9.2-6.fc21.i686.rpm                  | 243 kB  00:00     
51(9/12): mpfr-3.1.2-8.fc21.i686.rpm                         | 211 kB  00:00     
52(10/12): libstdc++-4.9.2-6.fc21.i686.rpm                   | 314 kB  00:00     
53(11/12): nss-softokn-freebl-3.19.2-1.0.fc21.i686.rpm       | 195 kB  00:00     
54(12/12): zlib-1.2.8-7.fc21.i686.rpm                        |  97 kB  00:00

将已下载包列表与我们在 中构建的列表中的 64 位条目相比较。

查找 RPM

我们之前已经看到,YUM 提供了一项搜索功能,该功能搜索描述和包名称。如果需要确定哪个包包含您还未安装的程序,可采用多种方法:

  • 可推测哪个包可能包含它,下载该包但不安装它。拥有该包后,可以检查它。
  • 可在网络上搜索。
  • 可以使用下面介绍的 command-not-found 功能。

如果无法通过系统工具找到特定 RPM,Rpmfind.Net 服务器是一个查找 RPM 的不错的互联网资源。

命令未找到

当 Bash shell 搜索某个命令但未找到它时,该 shell 会搜索一个名为 command_not_found_handle 的 shell 函数。如果 command_not_found_handle 函数存在,则会使用原始的命令和原始的参数来调用它,该函数的退出状态会变成该 shell 的退出状态。如果该函数未定义,该 shell 会打印一条错误消息并返回退出状态 127。此函数通常在系统中的 /etc/bash.bashrc 文件或另一个配置文件(比如 /etc/profile.d/PackageKit.sh)中设置。 展示了如何搜索 command-not-found 功能。如果该功能尚未安装在您系统上,您现在已经知道了如何安装它。

查找并安装 command-not-found 功能
1[ian@attic-f21 ~]$ yum search command-not-found
2Loaded plugins: langpacks
3======================= N/S matched: command-not-found ========================
4PackageKit-command-not-found.x86_64 : Ask the user to install command line
5                                    : programs automatically
6
7  Name and summary matches only, use "search all" for everything.

展示了如何在安装 PackageKit-command-not-found 后定义函数句柄。如果该函数无法执行搜索,它会模拟标准系统行为,返回 127。

command_not_found_handle
 1[ian@attic-f21 ~]$ type command_not_found_handle
 2command_not_found_handle is a function
 3command_not_found_handle () 
 4{ 
 5    local runcnf=1;
 6    local retval=127;
 7    [[ $- =~ i ]] || runcnf=0;
 8    [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0;
 9    [ ! -x /usr/libexec/packagekitd ] && runcnf=0;
10    if [ $runcnf -eq 1 ]; then
11        /usr/libexec/pk-command-not-found "$@";
12        retval=$?;
13    else
14        echo "bash: $1: command not found";
15    fi;
16    return $retval
17}

在本教程开头,我们展示了来自 gfortran --help 的两种不同的输出。第一种输出展示了一个禁用 command_not_found_handle 的响应,第二种输出中启用了它。您可以返回复习一下 来查看这一区别。

其他工具

除了 yumrpm 之外,您的发行商可能还提供了其他工具来从存储库安装包或更新整个系统。这些工具可能是图形和/或命令行形式的工具。一些示例包括:

  • YaST (SUSE)
  • up2date (Red Hat)
  • Mandrake Software Management (Mandriva)

通常,这些工具将采用自动或半自动方式处理多次包更新。它们可能还提供了显示存储库的内容或搜索包的功能。请参阅您的发行版的文档了解更多细节。

dnf

在 Fedora 22 中,Red Hat 将古老的 yum 替换为了一个名为 dnf(表示时尚的 yum)的新工具。它自 Fedora 18 以来就一直作为技术预览版包含在 Fedora 包中。依据项目页面:

启动 DNF 项目是由于 Yum 的 3 个最重大的缺陷:未文档化的 API、损坏的依赖项解析算法,以及无法重构内部函数。最后提及的问题与文档的缺乏有关。

大部分命令行接口都类似或等同于 yum,而且这些工具也类似或拥有等效的功能。通常可以在使用 dnf的系统上使用 yum 命令,但会出现一个警告表明 yum 命令已过时,您应该使用 dnf

尽管 dnf 尚未包含在 LPI 目标中,但您应知道它可以替代 yum。

PackageKit

如果不提及 PackageKit,针对包安装的任何讨论都不算完整,PackageKit 是一个旨在简化软件的安装和更新的系统。它的目的是统一不同发行版中使用的所有软件图形工具。PackageKit 使用了一个系统激活的守护进程,这意味着该守护进程仅在需要时激活。PackageKit 拥有 Gnome (gnome-packagekit) 和 KDE (KPackageKit) 版本。上面介绍的 command-not-found 句柄也包含在 PackageKit 中。它包含命令 pkconpkmon,前者从控制台执行包管理功能,后者监视包工具箱活动。它还包含用于添加软件包或更新系统的图形工具。 给出了 Gnome PackageKit (/usr/bin/gpk-application) 图形界面的一个示例。

Fedora 21 上的 Gnome PackageKit 图形界面

在编写本文时,最新的 Fedora 版本已将 PackageKit 替换为一个名为 gnome-software 的新软件包。该项目声称:

新工具 gnome-software 是针对应用程序的安装而全新设计的。它将为应用程序提供与用户相关的信息(图标、屏幕截图、评论、描述、评分,等等),而不是与打包器相关的信息(依赖项、包大小、文件列表,等等)。

它不会处理所有包,而是仅按特定时间表检查更新,并要求执行不必要的重启。请参阅 错误 1064717查看关于为什么这样设计的解释。可以安装 gnome-packagekit-installer 和 gnome-packagekit-updater 包来获取 PackageKit 功能。

由于篇幅所限,RPM 和 YUM 包管理系统还有许多内容未在这里介绍。

原文:https://www.ibm.com/developerworks/cn/linux/l-lpic1-102-5/index.html

原文发布于微信公众号 - 前端先锋(jingchengyideng)

原文发表时间:2019-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券