Linux rpm 命令详解
CentOS 系统上使用rpm命令管理程序包
功能:
安装、卸载、升级、查询、校验、数据库维护
1. rpm 命令常用选项说明
1.1 功能模式选项
命令 | 解释 |
---|---|
-i --install | 安装软件,例:rpm -ivh tree-1.6.0-10.el7.x86_64.rpm |
-U --upgrade | 安装或升级软件,安装有旧版软件包,则升级,如果不存在旧版软件包,则执行安装此软件包 |
-F --freshen | 升级软件 ,安装有旧版软件包,则升级,如果不存在旧版软件包,则不执行升级操作 |
-e --erase | 卸载软件 |
-q --query | 查询模式,如:查看是否安装 tree 包 rpm -q tree |
-V --verify | 验证模式 |
1.2 通用选项
安装
rpm {-i|--install} [install-options] PACKAGE_FILE...
选项
命令 | 解释 |
---|---|
-v --verbose | 显示附加信息 |
-vv | 比 -v 显示更多的信息 |
-h | 以 ### 显示程序包管理执行进度 |
常用组合
rpm -ivh PACKAGE_FILE ...
1.3 适用于安装、升级、卸载的常用子选项
命令 | 解释 |
---|---|
--test | 测试,但不真正执行,可以用来查看是否有依赖的软件包关系 |
--nodeps | 忽略依赖关系。有可能导致软件无法正常工作 |
--replacepkgs | 强制重新安装已经安装的软件包 |
--replacefiles | 如果要安装的软件包中有文件已在安装其他包时被安装,并不会继续安装,使用此选项可以覆盖此文件 |
--oldpackage | 如果使用 -I 选项想要安装一个比当前版本更低的版本的软件包,则会提示已经安装并失败。可使用此选项 |
--nosignature | 不检查来源合法性 |
--nodigest | 不检查包完整性 |
--force | 强制安装、升级、卸载 |
--noscripts | 不执行软件包内的所有脚本 |
--nopre | 不执行软件包内的安装前脚本 |
--nopost | 不执行软件包内的安装后脚本 |
--nopreun | 不执行软件包内的卸载前脚本 |
--nopostun | 不执行软件包内的卸载后脚本 |
--justdb | 在 RPM 数据库受损或某些原因产生错误时,此选项用来更新软件在数据库内的相关信息 |
1.4 适用于查询模式的常用子选项
命令 | 解释 |
---|---|
-a | 列出所有通过 rpm 或 yum 安装在本机的软件名称 |
-i | 列出已经安装在本机的指定软件的详细信息 |
-l | 列出指定的软件包安装后生成的所有文件 |
-c | 列出已经安装在本机的指定软件在 /etc 下的配置文件 |
-d | 列出已经安装在本机的指定软件包含的文档 |
--scripts | 列出已经安装在本机的指定软件的安装时的脚本 |
-p | 针对尚未安装的软件包文件做查询操作,可以在 p 后跟上上面的选项,选项后面跟软件包文件名 |
-f 文件名 | 列出该文件来自哪个已经安装的软件包 |
1.5 适用于验证模式的常用子选项
命令 | 解释 |
---|---|
-a | 列出系统中所有在安装后被修改过的文件 |
-f | 列出某个文件所属的包文件包含的哪些文件在安装后被修改过 |
-p | 列出指定 rpm 软件包文件包含的哪些文件被修改过 |
2. 升级和降级
rpm包升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
对应选项:
upgrade:安装有旧版程序包,则"升级",如果不存在旧版程序包,则"安装"
freshen:安装有旧版程序包,则"升级", 如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force: 强制安装
常用组合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升级注意项:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老 版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
3. 包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
# 和CAPABILITY相关
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY
常用查询用法
-qa
-q PACKAGE
-qi PACKAGE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-q --scripts PACKAGE
-qf FILE
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE, ...
4. 包卸载
格式
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test]
PACKAGE_NAME ...
注意:当包卸载时,对应的配置文件不会删除, 以 FILENAME.rpmsave 形式保留
强行删除rpm包,并恢复
[root@centos7 ~]#rpm -e rpm --nodeps
# 重启进入rescue模式
# mkdir /mnt/cdrom
# mount /dev/sr0 /mnt/cdrom
# rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage
# reboot
5. 包校验
在安装包时,系统也会检查包的来源是否是合法的
检查包的完整性和签名
rpm -K|--checksig rpmfile
在检查包的来源和完整性前,必须导入所需要公钥
示例
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa "gpg-pubkey*"
示例:CentOS 8
[root@centos8 ~]#rpm -K /misc/cd/AppStream/Packages/httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64.rpm
/misc/cd/AppStream/Packages/httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64.rpm: digests SIGNATURES NOT OK
[root@centos8 ~]#cat /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
......
=kkH7
-----END PGP PUBLIC KEY BLOCK-----
[root@centos8 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[root@centos8 rpm-gpg]#rpm -K /misc/cd/AppStream/Packages/httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64.rpm
/misc/cd/AppStream/Packages/httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64.rpm: digests signatures OK
[root@centos8 ~]#rpm -qa "gpg-pubkey*"
gpg-pubkey-8483c65d-5ccc5b19
[root@centos8 ~]#rpm -qi gpg-pubkey-8483c65d-5ccc5b19
Name
Version
Release
Architecture: (none)
Install Date: Wed 08 Apr 2020 10:06:20 AM CST
Group : Public Keys
......
-----END PGP PUBLIC KEY BLOCK-----
示例:校验包文件
[root@centos8 ~]#rpm -K /misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm
/misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm: digests signatures OK
[root@centos8 ~]#cp /misc/cd/BaseOS/Packages/tree-1.7.0-15.el8.x86_64.rpm /data
[root@centos8 ~]#cd /data
[root@centos8 data]#ll
total 60
-r--r--r-- 1 root root 60780 Apr 8 10:11 tree-1.7.0-15.el8.x86_64.rpm
[root@centos8 data]#echo >>tree-1.7.0-15.el8.x86_64.rpm
[root@centos8 data]#ll tree-1.7.0-15.el8.x86_64.rpm
-r--r--r-- 1 root root 60781 Apr 8 10:11 tree-1.7.0-15.el8.x86_64.rpm
[root@centos8 data]#cd
[root@centos8 ~]#rpm -K /data/tree-1.7.0-15.el8.x86_64.rpm
/data/tree-1.7.0-15.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录至rpm相关的数 据库中,可以用来检查包中的文件是否和当初安装时有所变化
rpm {-V|--verify} [select-options] [verify-options]
#示例:
[root@centos8 ~]#rpm -V centos-release
S.5....T. c /etc/issue
S file Size differs
M Mode differs (includes permissions and file type) 5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P capabilities differ
. (点) 表示当前位置代表的字符含义一致
c 所在的位置表示文件类型
c 配置文件
d 文件数据文件
g 该文件不属于某个文件(少数情况)
l 许可证文件(license file)
r 自述文件(READ ME)
6. 数据库维护
RPM 自身维护了一个数据库(默认存放目录 /var/lib/rpm),用于记录所有通过 RPM 安装的软件包及其文件信息等元数据。RPM 数据库提供多种形式的查询功能,同时也提供软件包和相关文件的验证功能。因此,这个数据库十分重要,下面我们结合一些实际的例子来重点介绍 RPM 数据库备份与恢复
查看 RPM 数据库相关文件
[root@centos /tmp]#ls -lh /var/lib/rpm
total 55M
-rw-r--r--. 1 root root 1.7M Mar 27 11:34 Basenames
-rw-r--r--. 1 root root 8.0K Mar 24 16:16 Conflictname
-rw-r--r--. 1 root root 600K Mar 27 11:34 Dirnames
-rw-r--r--. 1 root root 8.0K Mar 24 12:19 Enhancename
-rw-r--r--. 1 root root 8.0K Mar 24 12:19 Filetriggername
-rw-r--r--. 1 root root 12K Mar 27 11:34 Group
-rw-r--r--. 1 root root 12K Mar 27 11:34 Installtid
-rw-r--r--. 1 root root 28K Mar 27 11:34 Name # 包名查询
-rw-r--r--. 1 root root 16K Mar 24 16:16 Obsoletename
-rw-r--r--. 1 root root 49M Mar 27 11:34 Packages # 包含了每个软件包的信息,rpm -qa/qi 等命令的结果来源
-rw-r--r--. 1 root root 2.7M Mar 27 11:34 Providename
-rw-r--r--. 1 root root 8.0K Mar 24 12:19 Recommendname
-rw-r--r--. 1 root root 144K Mar 27 11:34 Requirename
-rw-r--r--. 1 root root 40K Mar 27 11:34 Sha1header
-rw-r--r--. 1 root root 24K Mar 27 11:34 Sigmd5
-rw-r--r--. 1 root root 8.0K Mar 24 16:00 Suggestname
-rw-r--r--. 1 root root 8.0K Mar 24 12:19 Supplementname
-rw-r--r--. 1 root root 8.0K Mar 24 16:00 Transfiletriggername
-rw-r--r--. 1 root root 8.0K Mar 24 14:15 Triggername
-rw-r--r-- 1 root root 264K Mar 27 14:08 __db.001 # rpm 数据库文件,这些文件可以使用 rpm 、rpmdb 命令进行重建
-rw-r--r-- 1 root root 80K Mar 27 14:08 __db.002
-rw-r--r-- 1 root root 1.3M Mar 27 14:08 __db.003
[root@centos /tmp]#
可以重建数据库
rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
7. 常用示例
7.1 安装 rpm -i 需要安装的包文件名
rpm -i example.rpm # 安装 example.rpm 包;
rpm -iv example.rpm # 安装 example.rpm 包并在安装过程中显示正在安装的文件信息;
rpm -ivh example.rpm # 安装 example.rpm 包并在安装过程中显示正在安装的文件信息及安装进度;
示例
# 查看是否安装 vsftpd 包
[root@centos /]#rpm -q vsftpd
package vsftpd is not installed
[root@centos /]#ls
bin dev home media proc sbin sys var
boot etc lib mnt root software tmp vsftpd-3.0.3-32.el8.x86_64.rpm
data f1.txt lib64 opt run srv usr z.txt
# 安装 vsftpd 包并在安装过程中显示正在安装的文件信息及安装进度;
[root@centos /]#rpm -ivh vsftpd-3.0.3-32.el8.x86_64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:vsftpd-3.0.3-32.el8 ################################# [100%]
[root@centos /]#
7.2 查看软件包的说明信息
[root@centos /]#rpm -qi vsftpd
Name : vsftpd
Version : 3.0.3
Release : 32.el8
Architecture: x86_64
Install Date: Sat Mar 27 11:34:49 2021
Group : System Environment/Daemons
Size : 351530
License : GPLv2 with exceptions
Signature : RSA/SHA256, Wed Apr 29 00:08:42 2020, Key ID 05b555b38483c65d
Source RPM : vsftpd-3.0.3-32.el8.src.rpm
Build Date : Mon Apr 27 10:04:03 2020
Build Host : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager : CentOS Buildsys <bugs@centos.org>
Vendor : CentOS
URL : https://security.appspot.com/vsftpd.html
Summary : Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.
[root@centos /]#
7.3 查询包中包含的文件列表
[root@centos /]#rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
...省略部分...
/var/ftp
/var/ftp/pub
[root@centos /]#
7.4 查看是否安装某个包
[root@centos /]#rpm -q wget
wget-1.19.5-10.el8.x86_64
# 如果不记得软件包的准确名称,可以使用如下命令组合查询
[root@centos /]#rpm -qa | grep get
selinux-policy-targeted-3.14.3-54.el8_3.2.noarch
gettext-libs-0.19.8.1-17.el8.x86_64
gettext-0.19.8.1-17.el8.x86_64
wget-1.19.5-10.el8.x86_64
[root@centos /]#
# 系统中安装了那些rpm软件包
rpm -qa
7.5 查询系统内指定文件来自哪个软件包
某个程序是哪个软件包安装的,或者哪个软件包包含这个程序
[root@centos /]#rpm -qf `which tree`
tree-1.7.0-15.el8.x86_64
[root@centos /]#rpm -qf /etc/passwd
setup-2.12.2-6.el8.noarch
[root@centos /]#rpm -qlf `which tree`
/usr/bin/tree
/usr/lib/.build-id
/usr/lib/.build-id/d8
/usr/lib/.build-id/d8/6d516d7cb07fb9334cb268af808119e33a5ac5
/usr/share/doc/tree
/usr/share/doc/tree/LICENSE
/usr/share/doc/tree/README
/usr/share/man/man1/tree.1.gz
[root@centos /]#
[root@centos /]#
7.6 查询指定的 rpm 软件包文件中自带的脚本
[root@centos /]#rpm -qp --scripts vsftpd-3.0.3-32.el8.x86_64.rpm
postinstall scriptlet (using /bin/sh): # 安装后脚本
if [ $1 -eq 1 ] ; then
# Initial installation
systemctl --no-reload preset vsftpd.service &>/dev/null || :
fi
preuninstall scriptlet (using /bin/sh):
if [ $1 -eq 0 ] ; then
# Package removal, not upgrade
systemctl --no-reload disable --now vsftpd.service &>/dev/null || :
fi
if [ $1 -eq 0 ] ; then
# Package removal, not upgrade
systemctl --no-reload disable --now vsftpd.target &>/dev/null || :
fi
postuninstall scriptlet (using /bin/sh):
if [ $1 -ge 1 ] ; then
# Package upgrade, not uninstall
systemctl try-restart vsftpd.service &>/dev/null || :
fi
[root@centos /]#
7.7 查询指定已经安装的软件的配置文件存放路径
[root@centos /]#rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
[root@centos /]#
7.8 查询一个文件被哪些软件依赖
[root@centos /]#rpm -q --whatrequires /bin/bash
grub2-common-2.02-90.el8_3.1.noarch
iptables-1.8.4-15.el8_3.3.x86_64
iptables-ebtables-1.8.4-15.el8_3.3.x86_64
platform-python-3.6.8-31.el8.x86_64
... 省略部分内容 ...
[root@centos /]#
7.9 查询一种功能来自哪个软件包提供
[root@centos /]#rpm -q --whatprovides acl
acl-2.2.53-1.el8.x86_64
[root@centos /]#rpm -q --whatprovides wget
wget-1.19.5-10.el8.x86_64
[root@centos /]#rpm -q --whatprovides vsftpd
vsftpd-3.0.3-32.el8.x86_64
[root@centos /]#rpm -q --whatprovides tree
tree-1.7.0-15.el8.x86_64
[root@centos /]#
7.10 提取 rpm 软件包内指定文件
# 使用 rpm2cpio 命令,将 rpm 软件包转换为 cpio 格式的文件
# 先查询 rpm 包所有的文件是否有自己需要的
[root@centos /tmp]#pwd
/tmp
[root@centos /tmp]#rpm -qpl vsftpd-3.0.3-32.el8.x86_64.rpm
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd # 这是需要取出的文件
[root@centos /tmp]#rpm2cpio vsftpd-3.0.3-32.el8.x86_64.rpm | cpio -ivd ./etc/vsftpd
./etc/vsftpd
706 blocks
[root@centos /tmp]#
# 此时,文件会在运行 cpio -ivd 命令的目录下,目录结构被完整的提取出来
[root@centos /tmp]#pwd
/tmp
[root@centos /tmp]#ls /tmp/
etc vsftpd-3.0.3-32.el8.x86_64.rpm
[root@centos /tmp]#ls /tmp/etc/
vsftpd
[root@centos /tmp]#
提示:cpio 提供支持文件通配符,比如下面示例
rpm2cpio vsftpd-3.0.3-32.el8.x86_64.rpm | cpio -ivd *.mo
7.11 查看软件包安装后产生的文件是否发生变化
[root@centos /tmp]#vim /etc/vsftpd/vsftpd.conf
[root@centos /tmp]#
[root@centos /tmp]#rpm -V vsftpd
S.5....T. c /etc/vsftpd/vsftpd.conf
[root@centos /tmp]#
上面每个位置的字符表示含义如下
字符 | 含义 |
---|---|
S | 表示对应文件的大小(Size)不一致 |
M | 表示对应文件的类型或属性不一致 |
5 | 表示对应文件的(MD5)哈希值不一致 |
D | 表示文件的 major 和 minor 号不一致 |
L | 表示文件的符号连接内容不一致 |
U | 表示文件的所有者(owner)不一致 |
G | 表示文件的所属组(group)不一致 |
T | 表示文件的修改时间不一致 |
. |
表示当前位置代表的字符含义一致 |
c
所在的位置表示文件类型
字符 | 含义 |
---|---|
c | 配置文件 |
d | 文件数据文件 |
g | 该文件不属于某个文件(极少情况) |
l | 许可证文件(license file) |
r | 自述文件(READ ME) |
注意:如果一个二进制文件校验不一致,就要注意是否被篡改,需要仔细的检查是否被入侵
7.12 卸载软件
rpm -e --nodeps 要卸载的软件包
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686