Linux 命令之 rpm -- RPM 软件包的管理工具

文章目录

一、命令介绍

rpm 命令是 Red Hat Package Manager(RPM软件包管理器)的缩写, 该命令是用于管理基于 RPM 的 Linux 的软件包的工具。基于 RPM 的 Linux 操作系统,几乎所有的软件可以通过 rpm 进行安装、卸载及管理等操作。

rpm 原本是 Red Hat Linux 发行版专门用来管理各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。

Red Hat 于 1995 年引入了 RPM。RPM 现在是 Linux Standard Base (LSB) 中采用的包管理系统。应该注意 rpm 是操作 RPM 的主要命令,而 .rpm 是 RPM 文件使用的扩展名。所以 “一个 rpm” 或 “某某 rpm” 一般是指 RPM 文件,而 rpm 通常指命令。

概括的说,rpm 命令包含了五种基本功能:安装、卸载、升级、查询和验证。

二、语法结构

语法格式:rpm [选项] [参数]

参数:指定要操纵的RPM软件包。

三、常用选项

rpm 命令选项分为三组:查询和检查包,安装、升级和删除包以及执行其他功能。

用于查询和检查包

选项说明
-a查询所有已经安装的套件(即软件包)
-f查询拥有指定文件的套件(即软件包),即查询文件或命令属于哪个软件包
-dDocument. 只列出文本文件,本参数需配合 -l 参数使用
-c只列出组态配置文件,本参数需配合 -l 参数使用
-iInformation. 后面如果跟着软件名,没有后缀 .rpm,可以查看该软件的有关信息,需要配合选项 -q 才能使用
-lList. 显示套件(即软件包)的文件列表
-pPackage. 查询指定的 RPM 套件档,即查询指定的RPM软件包
-qQuery. 表示查询
-R显示套件的关联性信息,即显示软件包的依赖关系
-sStatus. 显示文件状态,本参数需配合-l参数使用
-v笼统地显示指令执行过程
-vv比较详细地显示指令执行过程,便于排错
-vvv更加详细地显示指令执行过程
-h--hash软件包安装的时候列出哈希标记(和 -v 一起使用效果更好),以"#"号显示程序执行进度
-V--verify-y对与指定 RPM 软件包相关的文件进行校验。若无输出,则表示已安装的软件没有被修改;若软件被修改,则会输出信关信息
-Va校验所有的 RPM 软件包
-?--help显示帮助信息
--usage显示简短的使用说明

用于安装、升级和删除包

选项说明
-e--erase卸载软件包
-h--hash套件安装时列出标记,即安装软件包时列出标记,显示安装进度
-i 或者 --install安装指定的套件档,即安装软件包
-U--upgrade升级指定的套件档(即软件包),后面接的套件若没有安装过,则系统将直接安装该套件
-F升级指定的套件档,后面接的套件若没有安装过,则该套件不会安装。升级或刷新已经安装的包
--nodeps忽略依赖关系警告,当要安装的 rpm 包依赖其他包时,即使其他包没有安装,也可以安装这个包
--force强制安装,即使覆盖属于其他包的文件也要安装
--ignorearch忽略主机构架
--test仅作测试,不真正执行,可用于测试安装,测试卸载
--replacepkgs重新安装。替换原有的安装
--initdb新建RPM的数据库
--rebuilddb重建RPM的数据库
--percentPrint percentages as files are unpacked from the package archive.

用于执行其他功能

选项说明
-b-t设置包装套件的完成阶段,并指定套件档(即软件包)的文件名称

四、命令示例

(一)查询和检查包

1. 查看一个已安装包的信息(版本、用途等)

[root@htlwk0001host ~]# rpm -qi openssh-server-8.0p1-4.el8_1.x86_64
Name        : openssh-server
Version     : 8.0p1
Release     : 4.el8_1
Architecture: x86_64
Install Date: 2020年07月17日 星期五 09时54分09秒
Group       : System Environment/Daemons
Size        : 1461534
License     : BSD
Signature   : RSA/SHA256, 2020年02月05日 星期三 08时08分05秒, Key ID 05b555b38483c65d
Source RPM  : openssh-8.0p1-4.el8_1.src.rpm
Build Date  : 2020年02月05日 星期三 00时01分36秒
Build Host  : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager    : CentOS Buildsys <bugs@centos.org>
Vendor      : CentOS
URL         : http://www.openssh.com/portable.html
Summary     : An open source SSH server daemon
Description :
OpenSSH is a free version of SSH (Secure SHell), a program for logging
into and executing commands on a remote machine. This package contains
the secure shell daemon (sshd). The sshd daemon allows SSH clients to
securely connect to your SSH server.

说明:只能使用 -qi,而且必须按这个顺序,使用 -iq 还不行,仅使用 -i 也不行,真 tmd 奇葩!已安装的软件包,不能使用后缀名 .rpm,否则报错。

2. 查看与指定程序相关的所有安装文件

例如,查看与 MySQL 相关的所有安装文件:

[root@htlwk0001host bin]# rpm -qal|grep mysql
/etc/logrotate.d/mysql
/usr/bin/mysql_install_db
/usr/bin/mysql_plugin
/usr/bin/mysql_secure_installation
/usr/bin/mysql_ssl_rsa_setup
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysqld_pre_systemd
/usr/bin/mysqldumpslow
/usr/lib/systemd/system/mysqld.service
/usr/lib/systemd/system/mysqld@.service
/usr/lib/tmpfiles.d/mysql.conf

3. 查看一个已经安装的 rpm 包的配置文件列表

[root@htlwk0001host mysql]# rpm -qc mysql-community-server-5.7.31-1.el7.x86_64
/etc/logrotate.d/mysql
/etc/my.cnf

4.查看所有需要依赖指定 rpm 包的软件包列表

[root@htlwk0001host mysql]# rpm -q --whatrequires mysql-community-server-5.7.31-1.el7.x86_64.rpm # mysql-community-server-5.7.31-1.el7.x86_64.rpm 是被依赖者
没有软件包需要 mysql-community-server-5.7.31-1.el7.x86_64.rpm

5. 查看哪个包提供某一功能

使用 rpm 查明哪个包提供 gcl-selinux(x86-64) 功能:

[ian@echidna ~]$ rpm -q --whatprovides 'gcl-selinux(x86-64)'
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64

6. 查看安装/删除指定的软件包期间所执行的脚本

[root@htlwk0001host mysql]# rpm -q --scripts mysql-community-server-5.7.31-1.el7.x86_64.rpm

7. 查询指定文件所属的软件包,即查询文件或命令属于哪个软件包

[root@htlwk0001host mysql]# rpm -qf /etc/httpd/conf/httpd.conf
httpd-2.4.37-21.module_el8.2.0+382+15b0afa8.x86_64

注意:这里要使用文件的绝对路径。

你可以使用命令 which 查询命令的绝对路径:

[root@htlwk0001host ~]# which mysql
/usr/bin/mysql

再查询该文件所属的软件包:

[root@htlwk0001host ~]# rpm -qf /usr/bin/mysql
mysql-community-client-5.7.31-1.el7.x86_64

你也可以把这两条命令连起来写:

[root@htlwk0001host ~]# rpm -qf `which mysql`
mysql-community-client-5.7.31-1.el7.x86_64

which mysql 这条命令是由两个“反撇号”引起来的,这代表引用反引号里面的命令所产生的结果。

也可以使用如下的形式查询:

[root@htlwk0001host ~]# rpm -qf $(which mysql)
mysql-community-client-5.7.31-1.el7.x86_64

8. 确认一个 rpm 包的完整性

[root@htlwk0001host mysql]# rpm --checksig package.rpm

9. 查询一个包是否安装

[root@htlwk0001host ~]# rpm -q mysql-community-server
mysql-community-server-5.7.31-1.el7.x86_64

10. 确认一个 rpm 包还未安装

[root@htlwk0001host mysql]# rpm -Vp package.rpm 

11. 检验已安装的软件包是否被修改过

检查软件包 package_name 是否被修改过,检查的项目包括:文件尺寸、 许可、类型、所有者、群组、MD5以及最后修改时间等。

[root@htlwk0001host mysql]# rpm -V package_name 

如果包没有被修改过,这个命令没有输出。

12. 检查系统中所有已安装的 rpm 包(小心使用 !!)

[root@htlwk0001host mysql]# rpm -Va 

13. 查看系统中所有已经安装的 rpm 包

[root@htlwk0001host mysql]# rpm -qa
perl-Pod-Perldoc-3.28-396.el8.noarch
os-prober-1.74-6.el8.x86_64
biosdevname-0.7.3-2.el8.x86_64
python3-pip-wheel-9.0.3-16.el8.noarch
perl-CPAN-Meta-2.150010-396.el8.noarch

建议用下面这个组合命令:

[root@htlwk0001host ~]# rpm -qa | sort | less

注:sort 默认会按字母大小排序,然后输出给命令 less 显示。

14. 查看与 MySQL 有关的已安装的软件包列表

[root@htlwk0001host bin]# rpm -qa|grep mysql
mysql-community-server-5.7.31-1.el7.x86_64
mysql-community-common-5.7.31-1.el7.x86_64
mysql57-community-release-el7-10.noarch
mysql-community-client-5.7.31-1.el7.x86_64
php-mysqlnd-7.2.24-1.module_el8.2.0+313+b04d0a66.x86_64
mysql-community-libs-5.7.31-1.el7.x86_64

15. 查看与某个程序有关的所有已安装的软件包

例如,查看已安装的与 mysql 有关的软件包名称:

[root@htlwk0001host mysql]# rpm -qa | grep mysql
mysql-community-server-5.7.31-1.el7.x86_64
mysql-community-common-5.7.31-1.el7.x86_64
mysql57-community-release-el7-10.noarch
mysql-community-client-5.7.31-1.el7.x86_64
php-mysqlnd-7.2.24-1.module_el8.2.0+313+b04d0a66.x86_64
mysql-community-libs-5.7.31-1.el7.x86_64

例如,显示所有名称中包含 httpd 字样的 rpm 包:

[root@htlwk0001host mysql]# rpm -qa | grep httpd 
httpd-tools-2.4.37-21.module_el8.2.0+382+15b0afa8.x86_64
httpd-filesystem-2.4.37-21.module_el8.2.0+382+15b0afa8.noarch
centos-logos-httpd-80.5-2.el8.noarch
httpd-2.4.37-21.module_el8.2.0+382+15b0afa8.x86_64

16. 查看一个尚未安装的 rpm 包的文件列表

[root@htlwk0001host mysql]# rpm -qlp package.rpm

17. 查看一个已经安装的 rpm 包的文件列表

[root@htlwk0001host mysql]# rpm -ql mysql-community-server-5.7.31-1.el7.x86_64
/etc/logrotate.d/mysql
/etc/my.cnf
/etc/my.cnf.d
/usr/bin/innochecksum
/usr/bin/lz4_decompress
/usr/bin/my_print_defaults
/usr/bin/myisam_ftdump

18. 查看指定的 rpm 软件包所包含的文件

没有安装过的软件包,使用如下的命令语句:

[root@htlwk0001host mysql]# rpm -qlp mysql-community-libs-5.7.31-1.el7.x86_64.rpm

注:-p 表示后面指定具体的 rpm 包,ppackage 的首字母。

已经安装过的软件包,使用如下的命令语句:

[root@htlwk0001host mysql]# rpm -ql mysql-community-libs-5.7.31-1.el7.x86_64

注:查看已经安装过的软件包,不需要选项 -p,所以软件包的名称后面不要写后缀名 .rpm

19. 查看一个软件包的信息(版本、用途等)

没有安装过的软件包,使用如下命令语句:

[root@htlwk0001host mysql]# rpm -qip  package_name.rpm

已经安装过的软件包,使用如下命令语句:

[root@htlwk0001host mysql]# rpm -qi mysql-community-libs-5.7.31-1.el7.x86_64
Name        : mysql-community-libs
Version     : 5.7.31
Release     : 1.el7
Architecture: x86_64
Install Date: 2020年08月23日 星期日 15时46分46秒
Group       : Applications/Databases
Size        : 9928453
License     : Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Under GPLv2 license as shown in the Description field.
Signature   : DSA/SHA1, 2020年06月03日 星期三 18时07分52秒, Key ID 8c718d3b5072e1f5
Source RPM  : mysql-community-5.7.31-1.el7.src.rpm
Build Date  : 2020年06月02日 星期二 19时48分16秒
Build Host  : siv27.no.oracle.com
Relocations : (not relocatable)
Packager    : MySQL Release Engineering <mysql-build@oss.oracle.com>
Vendor      : Oracle and/or its affiliates
URL         : http://www.mysql.com/
Summary     : Shared libraries for MySQL database client applications
Description :
This package contains the shared libraries for MySQL client
applications.

说明:只能使用 -qi,而且必须按这个顺序,使用 -iq 还不行,奇葩!已安装的软件包,不能使用后缀名 .rpm,否则报错。

20. 查询哪个软件包安装(提供/包含)指定的程序(只能查询指定的程序)

以下命令只适用于查询可执行的程序由哪个软件包所安装:

rpm -qf `which 程序名`    # 返回软件包的全名
rpm -qif `which 程序名`   # 返回软件包的有关信息
rpm -qlf `which 程序名`   # 返回软件包的文件列表

例如,查看 mysql 是由哪个软件包安装的,如下:

[root@htlwk0001host mysql]# rpm -qf `which mysql`
mysql-community-client-5.7.31-1.el7.x86_64
[root@htlwk0001host mysql]# rpm -qf `which mysqld`
mysql-community-server-5.7.31-1.el7.x86_64

说明: 字符串 `which mysql` 所用的引号不是“单引号”,而是键盘左上角“波浪号” ~ 下面的“捺符号”;-f 表示后面需要指定文件名,且必须是完整的文件路径;which mysql 是一条命令语句,会执行返回结果,即返回指定的命令文件 mysql 的所在路径。

21. 查询哪个软件包安装(包含/提供)指定的文件(能查询所有指定的文件)

👆上面那个只适用于可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。首先你要知道这个文件名,然后查询该文件的完整路径,可以用 whereis 或者 which,然后使用 rpm -qf 查询。

例如,查询命令文件 mysql 的完整路径,使用命令 which,命令语句如下:

[root@htlwk0001host ~]# which mysql
/usr/bin/mysql

注意:which 只能查询命令的所在位置,不能查询非可执行文件的所在位置。

查询命令文件 mysql 的完整路径,使用命令 whereis,如下:

[root@htlwk0001host ~]# whereis mysql
mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz

你还要判断哪个才是命令文件 mysql 的路径,可以通过命令 file 查询,如下:

[root@htlwk0001host ~]# file /usr/bin/mysql
/usr/bin/mysql: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=afd62c3d3b2d3192af0ba4bb66bbc07a3ee3d168, with debug_info, not stripped

如上查询结果所示,ELF 说明是可执行的文件。

查询压缩包文件 mysql.1.gz 所在位置,使用命令 whereis,如下:

[root@htlwk0001host ~]# whereis mysql.1.gz
mysql.1: /usr/share/man/man1/mysql.1.gz

使用命令 rpm -qf 查询文件 mysql.1.gz 是哪个软件包安装的,如下:

[root@htlwk0001host ~]# rpm -qf /usr/share/man/man1/mysql.1.gz
mysql-community-client-5.7.31-1.el7.x86_64

注意:如上查询某个文件属于哪个软件包提供的,需要输入该文件的完整的路径名才行。

如果你仅仅输入文件名称则会提示不存在该文件,如下:

[root@htlwk0001host ~]# rpm -qf mysql.q.gz
error: file /root/mysql.q.gz: No such file or directory

22. 查看指定软件包的依赖关系(查看指定软件包依赖/需要哪些功能)

[root@htlwk0001host ~]# rpm -qR mysql-community-server-5.7.31-1.el7.x86_64
/bin/bash
/bin/sh
/bin/sh
/bin/sh

注:

  1. -R 必须大写,是 requires 的首字母,含义是查询软件包的依赖性。
  2. 如果要查询包文件而不是 RPM 数据库,那么添加 -p 选项并使用完整的 RPM 文件名。

23. 查看一个 rpm 包的修改历史

[root@htlwk0001host mysql]# rpm -q --changelog mysql-community-server-5.7.31-1.el7.x86_64
* 四 9月 05 2019 Bjorn Munch <bjorn.munch@oracle.com> - 5.7.28-1
- Add License Book, remove COPYING

* 三 124 2018 Balasubramanian Kandasamy <balasubramanian.kandasamy@oracle.com> - 5.7.23-1
- Add perl modules for test subpackage

* 三 110 2018 Bjorn Munch <bjorn.munch@oracle.com> - 5.7.22-1
- No longer need to remove obsoleted mysqltest man pages

(二)安装、升级和删除包

1. 安装软件包

  1. 安装当前目录下的一个 rpm 包,并显示安装相关信息:
[root@linuxcool ~]# rpm -ivh package.rpm 
  1. 按绝对路径安装 rpm 包,并显示安装相关信息:
[root@linuxcool ~]# rpm -ivh  /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm 
  1. 安装一个 rpm 包,且忽略依赖关系警告:
[root@linuxcool ~]# rpm -ivh --nodeps package.rpm 

安装过程中可能出现下面的警告或者提示:

... conflict with ...

可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm --force -i强制安装即可

... is needed by ...
... is not installed ...

此包需要的一些软件你没有安装可以用rpm --nodeps -i来忽略此信息,也就是说rpm -i --force --nodeps可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。

2. 升级软件包

  1. 升级指定的软件包,若没有安装,则会直接安装此软件包:
[root@linuxcool ~]# rpm -U package.rpm # 更新一个rpm包但不改变其配置文件
  1. 升级一个确定已经安装的软件包:
[root@linuxcool ~]# rpm -F package.rpm

通常情况下我们使用 -U 选项进行更新,尤其是在命令行包含 RPM 列表的情况下。这样的话,就会安装未安装的包,升级已经安装的包。常常使用另外两个选项 -v(详细)和 -h(# 标志)提供进度显示。下面的例子中说明了如何使用 rpm 命令更新 vim-common、vim-enhanced 和 vim-minimal 包。我们已经把 vim-common 和 vim-enhanced 包下载到根用户的主目录中,而 vim-minimal 包要从一个更新镜像获取。

[root@echidna ~]# ls *.rpm
vim-common-7.2.411-1.fc12.x86_64.rpm  vim-enhanced-7.2.411-1.fc12.x86_64.rpm
[root@echidna ~]# rpm -Uvh *.rpm http://mirrors.usc.edu/pub/linux/distributions\
> /fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Retrieving http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/updates/12/x86
_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [ 33%]
   2:vim-enhanced           ########################################### [ 67%]
   3:vim-minimal            ########################################### [100%]

3. 卸载 rpm 软件包

使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀 .rpm,比如卸载软件包 proftpd-1.2.8-1,可以使用下列格式:

rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd

不可以是下列格式:

rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1

当使用 rpm 删除包时,如果软件包可以删除,不会有任何的输出和提示,但是,如果试图删除其他包需要的包,它不会执行删除操作,您会看到以下的错误消息:

root@echidna ~]# rpm -e gcl-selinux
error: Failed dependencies:
	gcl-selinux is needed by (installed) gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

这说明这个软件被其他软件需要,不能随便卸载,可以使用选项 --nodeps 强制卸载:

rpm -e --nodeps proftpd-1.2.8-1

4. 安装 .src.rpm 软件包

详见《Linux 如何安装 SRPM 包

5. 修复被破坏的软件包

RPM 包管理系统通常可以通过选项 -F 修复包,但是,如果删除了包中的重要文件,仅仅进行更新或者使用 yum reinstall 重新安装包依旧无法解决问题,那么可能需要在重新安装之前删除包。对于这种情况,可能希望删除现有的拷贝并重新安装,但是不希望卸载和重新安装依赖它的所有包。为此,在删除包时,可以使用 rpm 命令的 --nodeps 选项绕过依赖关系检查。下面的例子中,删除了 vim-common 中的 /usr/bin/xxd 文件,然后演示如何恢复这个包:

[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# # Oops! we needed that file
[root@echidna ~]# rpm -Fvh vim-common-7.2.411-1.fc12.x86_64.rpm 
[root@echidna ~]# ls /usr/bin/xxd
ls: cannot access /usr/bin/xxd: No such file or directory
[root@echidna ~]# # Oh! Freshening the package didn't replace the missing file
[root@echidna ~]# rpm -e vim-common
error: Failed dependencies:
	vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.f
c12.x86_64
[root@echidna ~]# # Can't remove vim-common because vim-enhanced needs it
[root@echidna ~]# rpm -e --nodeps vim-common
[root@echidna ~]# # Bypassing the dependency check allowed removal
[root@echidna ~]# rpm -Uvh vim-common-7.2.411-1.fc12.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [100%]
[root@echidna ~]# # Update (or install) vim-common again
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd
[root@echidna ~]# # And /usr/bin/xxd is back

注意,在安装 RPM 时也可以绕过依赖关系检查,但是这通常不是好做法。

(三)执行其他功能

1. 导入公钥数字证书

[root@htlwk0001host mysql]# rpm --import /media/cdrom/RPM-GPG-KEY

2. 从一个 rpm 包运行可执行文件

rpm2cpio package.rpm | cpio --extract --make-directories *bin*

说明:--extract 表示提取;--make-directories 表示按软件包内的文件原有的路径;*bin* 执行名称中含有关键字 bin 的文件,即可执行文件。

3. 如何在不安装的情况下获取 rpm 包中的文件

使用命令工具 rpm2cpiocpio,对 rpm 包进行提取(包含解包、解压过程)。

rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories

说明: 参数 -i--extract 相同,表示提取文件;-d--make-directory 相同,表示根据包中文件原来的路径建立目录;-m 表示保持文件的更新时间;-v 表示指示执行进程。

五、参考文献

线上工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值