软件管理 - RPM工具管理RPM包

1. RPM包管理概述

RPM是RPM Package Manager缩写, 由红帽开发用于软件包的安装升级卸载与查询。

1.1 软件包类型

软件包类型 说明 特点
源码包 源代码形式的软件包 需要编译安装
二进制包 编译好的软件包 直接安装使用
RPM包 RedHat系列系统的二进制包 扩展名.rpm

1.2 常见的软件包

  • 源码包: .tar.gz, .tar.bz2, .tar.xz
  • 二进制包: .rpm (RedHat/CentOS), .deb (Debian/Ubuntu)

注意: 不管是源码包,还是二进制包,安装时都可能会有依赖关系!

1.3 RPM获取途径

  1. RedHat光盘或官方网站
  2. RPM查询官网网站 (https://rpmfind.net/)
  3. Nginx软件官方网站 (https://nginx.org/)

1.4 RPM软件包命名规则

RPM包命名以-将软件分成了若干部分

示例: bash-4.2.46-28.el7.x86_64.rpm

命名格式: name-version-release.arch.rpm

部分 说明 示例
name 软件包名称 bash
version 版本号 4.2.46
release 发布版本 28.el7
arch 系统平台 x86_64

版本号说明:

  • 主版本: 重大更新
  • 次版本: 子功能更新
  • 修订号: 修复bug

发布版本说明:

  • el6: Enterprise Linux 6
  • el7: Enterprise Linux 7
  • 查看系统版本: hostnamectl

架构说明:

  • i386: 32位系统
  • x86_64: 64位系统
  • 查看系统架构: hostnamectluname -m

1.5 rpm包的组成

  • 安装释放的文件: 软件的实际文件
  • 软件包的元数据: 版本,发布号,架构,描述,要求,更改日志等
  • 脚本: 安装前执行的脚本和安装后的脚本

1.6 查看系统光驱中RPM软件包

如果你的系统中还有系统的安装盘,首先我们让虚拟机链接上我们的系统安装盘,然后我们可以通过 mount /dev/cdrom /mnt命令把光驱挂载到/mnt目录下,那么你会在/mnt/Packages目录下看到很多.rpm的包文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 挂载光驱
[root@localhost ~]# mount /dev/cdrom /mnt/
mount: block device /dev/sr0 is write-protected, mounting read-only

# 查看挂载内容
[root@localhost ~]# ls /mnt/
CentOS_BuildTag Packages RPM-GPG-KEY-CentOS-Security-6
EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6
GPL repodata TRANS.TBL
images RPM-GPG-KEY-CentOS-6
isolinux RPM-GPG-KEY-CentOS-Debug-6

# 查看RPM包列表
[root@localhost ~]# ls /mnt/Packages/|head

1.1 RPM包安装

使用rpm命令安装软件包, 需要了解如下参数:

1.1.1 安装参数

参数 功能 说明
-i 安装 install
-v 详细信息 verbose
-h 安装进度 hash marks
--test 测试是否能够安装成功 不实际安装
--force 强制重新安装 覆盖已安装的包
--nodeps 忽略依赖关系 不检查依赖

1.1.2 安装示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装软件包, 需要指定软件包绝对路径
[root@liyanzhao ~]# rpm -ivh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm
[root@liyanzhao ~]# rpm -ivh /mnt/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm

# 在软件包所在目录下可以不指定绝对路径
[root@liyanzhao ~]# cd /mnt/Packages/
[root@liyanzhao Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm

# 测试一个软件包是否能在该系统上安装
[root@liyanzhao ~]# rpm -ivh --test /mnt/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm

# 如果软件包存在, 强制再次安装
[root@liyanzhao ~]# rpm -ivh --force /mnt/Packages/tree-1.5.3-3.el6.x86_64.rpm

# 安装samba服务需要依赖其他组件, 使用--nodeps可重新强制安装
[root@liyanzhao ~]# rpm -ivh --nodeps /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm

1.1.3 安装常见问题

问题1: 依赖关系

1
2
3
4
5
6
# 错误:缺少依赖
error: Failed dependencies:
libc.so.6 is needed by tree-1.6.0-10.el7.x86_64

# 解决:安装依赖包或使用--nodeps(不推荐)
rpm -ivh --nodeps package.rpm

问题2: 软件包已安装

1
2
3
4
5
# 错误:软件包已安装
package tree-1.6.0-10.el7.x86_64 is already installed

# 解决:使用--force强制安装或先卸载
rpm -ivh --force package.rpm

1.2 RPM包查询

使用rpm命令查询已安装好的rpm包, 需要了解如下参数:

1.2.1 查询参数

参数 功能 说明
-q 查看指定软件包是否安装 query
-qa 查看系统中已安装的所有RPM软件包列表 query all
-qi 查看指定软件的详细信息 query info
-ql 查询指定软件包所安装的目录、文件列表 query list
-qc 查询指定软件包的配置文件 query config
-qd 查询指定软件包的帮助文档 query doc
-qf 查询文件或目录属于哪个RPM软件 query file
-q --scripts 查询rpm包安装前和安装后执行的脚本 query scripts

1.2.2 查询已安装的软件包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查询vsftpd这个rpm包是否安装
[root@liyanzhao ~]# rpm -q vsftpd

# 模糊查找系统已安装的rpm包
[root@liyanzhao ~]# rpm -qa |grep ftp

# 查询vsftpd软件包的相关信息
[root@liyanzhao ~]# rpm -qi vsftpd

# 查询rpm包所安装的文件
[root@liyanzhao ~]# rpm -ql vsftpd

# 查询rpm包相关的配置文件
[root@liyanzhao ~]# rpm -qc vsftpd

# 查询配置文件或命令来自于哪个rpm包
[root@liyanzhao ~]# rpm -qf /etc/vsftpd/vsftpd.conf
[root@liyanzhao ~]# rpm -qf /usr/sbin/vsftpd

1.2.3 查询未安装的软件包

1
2
3
4
5
# 查询未安装的软件包会产生哪些文件
[root@liyanzhao ~]# rpm -qlp /mnt/Packages/samba-3.6.23-41.el6.x86_64.rpm

# 查询未安装的软件包详细信息
[root@liyanzhao ~]# rpm -qip /mnt/Packages/samba-3.6.23-41.el6.x86_64.rpm

1.2.4 查询脚本

1
2
# 查询rpm包安装前和安装后执行的脚本
[root@liyanzhao ~]# rpm -q --scripts vsftpd

1.2.5 查询实战示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查询所有已安装的软件包
rpm -qa

# 查询特定软件包
rpm -qa |grep nginx

# 查询软件包详细信息
rpm -qi nginx

# 查询软件包安装的文件
rpm -ql nginx

# 查询命令属于哪个软件包
rpm -qf /usr/bin/vim
which vim |xargs rpm -qf

# 查询配置文件属于哪个软件包
rpm -qf /etc/passwd

1.3 RPM包升级

1.3.1 升级参数

参数 功能 说明
-U 升级或安装 如果老版本不存在,就全新安装,如果存在有新版即升级
-F 仅升级 老版本必须存在

1.3.2 升级示例

1
2
3
4
5
# 如果有新版则升级, 软件升级不要跨操作系统主版本号
[root@liyanzhao ~]# rpm -Uvh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm

# 仅升级(如果不存在则不安装)
[root@liyanzhao ~]# rpm -Fvh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm

1.3.3 升级注意事项

  1. 不要跨操作系统主版本号升级: 例如不要从CentOS 6升级到CentOS 7
  2. 备份重要数据: 升级前备份配置文件和数据
  3. 测试升级: 使用--test参数测试升级是否成功
  4. 查看变更日志: 了解新版本的变更内容

1.3.4 升级与安装的区别

操作 命令 说明
安装 rpm -ivh 如果已安装会报错
升级 rpm -Uvh 如果已安装则升级,未安装则安装
仅升级 rpm -Fvh 仅升级已安装的包

1.4 RPM包卸载

卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。

1.4.1 卸载参数

参数 功能 说明
-e 卸载 erase
--nodeps 忽略依赖关系 强制卸载(危险)

1.4.2 卸载示例

1
2
3
4
5
6
7
8
9
10
11
# 先查询, 然后卸载
[root@liyanzhao ~]# rpm -qa |grep sh
zsh-5.0.2-28.el7.x86_64

[root@liyanzhao ~]# rpm -e zsh

# 卸载指定版本的软件包
[root@liyanzhao ~]# rpm -e tree-1.6.0-10.el7.x86_64

# 强制卸载(忽略依赖,危险操作)
[root@liyanzhao ~]# rpm -e --nodeps package_name

1.4.3 卸载常见问题

问题1: 依赖关系

1
2
3
4
5
# 错误:有其他软件包依赖
error: Failed dependencies:
tree is needed by (installed) other-package

# 解决:先卸载依赖的软件包,或使用--nodeps(不推荐)

问题2: 系统必需软件包

1
2
# 某些系统核心软件包不能卸载,否则会导致系统无法启动
# 例如:glibc, systemd等

1.5 RPM包校验

软件相关的数据库存放于/var/lib/rpm目录

1.5.1 校验命令

1
2
3
4
5
6
# 校验软件包
[root@liyanzhao ~]# rpm -V vsftpd
S.5....T. c /etc/pam.d/vsftpd
.......T. c /etc/vsftpd/ftpusers
S.5....T. c /etc/vsftpd/vsftpd.conf
.M....... /var/ftp/pub

1.5.2 校验结果说明

字符 说明 含义
S Size 文件的容量大小是否被改变
M Mode 文件的类型或者文件的属性是否被修改
5 MD5 MD5这一种指纹加密的内容已经不同
D Device 装置的主/次代码已经改变
L Link 路径已经被改变
U User 文件的所属主已被修改
G Group 文件的所属组已被修改
T Time 文件的创建时间已被改变
. 正常 该属性未改变
c config 配置文件
d doc 文档文件

1.5.3 校验示例

1
2
3
4
5
6
7
8
9
10
11
# 校验指定软件包
rpm -V vsftpd

# 校验所有软件包
rpm -Va

# 校验指定文件
rpm -Vf /usr/bin/vim

# 校验并显示详细信息
rpm -Vv vsftpd

1.5.4 校验实战

1
2
3
4
5
6
7
8
# 检查系统关键文件是否被修改
rpm -Va |grep "^..5"

# 检查配置文件是否被修改
rpm -Vc vsftpd

# 检查所有配置文件
rpm -Va |grep "^..5.*c"

1.6 RPM包小结

1.6.1 常见问题解答

问题1: 如何查询 util-linux 软件包安装了哪些文件?

1
2
3
4
5
# 查询已安装的软件包文件列表
rpm -ql util-linux

# 查询未安装的软件包文件列表
rpm -qlp /path/to/util-linux.rpm

问题2: 如何查询 mkdir 命令是由哪个 RPM 软件包安装的?

1
2
3
4
5
6
7
8
# 方法1: 使用rpm -qf
rpm -qf /usr/bin/mkdir

# 方法2: 使用which和rpm -qf
which mkdir |xargs rpm -qf

# 方法3: 如果命令不在PATH中
rpm -qf $(which mkdir)

问题3: 安装 .rpm 软件包时,-i、-U、-F选项有何区别?

选项 命令 说明
-i rpm -ivh 安装:如果已安装会报错
-U rpm -Uvh 升级或安装:如果已安装则升级,未安装则安装
-F rpm -Fvh 仅升级:仅升级已安装的包,未安装则不安装

1.6.2 RPM命令总结

安装相关

命令 功能 示例
rpm -ivh 安装软件包 rpm -ivh package.rpm
rpm -Uvh 升级或安装 rpm -Uvh package.rpm
rpm -Fvh 仅升级 rpm -Fvh package.rpm
rpm -e 卸载软件包 rpm -e package_name

查询相关

命令 功能 示例
rpm -q 查询软件包 rpm -q package_name
rpm -qa 查询所有软件包 rpm -qa
rpm -qi 查询软件包信息 rpm -qi package_name
rpm -ql 查询软件包文件列表 rpm -ql package_name
rpm -qc 查询配置文件 rpm -qc package_name
rpm -qf 查询文件属于哪个包 rpm -qf /path/to/file

校验相关

命令 功能 示例
rpm -V 校验软件包 rpm -V package_name
rpm -Va 校验所有软件包 rpm -Va
rpm -Vf 校验文件 rpm -Vf /path/to/file

1.6.3 RPM数据库

1
2
3
4
5
6
7
8
# RPM数据库位置
/var/lib/rpm/

# 重建RPM数据库(如果数据库损坏)
rpm --rebuilddb

# 初始化RPM数据库
rpm --initdb

1.6.4 RPM最佳实践

  1. 安装前检查: 使用--test测试安装
  2. 查询依赖: 安装前了解软件包的依赖关系
  3. 备份配置: 升级前备份配置文件
  4. 定期校验: 定期使用rpm -Va校验系统文件
  5. 使用yum: 对于依赖关系复杂的软件包,建议使用yum安装

2. RPM与YUM对比

2.1 对比说明

特性 RPM YUM
依赖处理 需要手动解决 自动解决
软件源 本地文件 远程仓库
安装速度 相对慢(需要下载)
适用场景 离线安装、单个包 在线安装、批量安装

2.2 使用建议

  • RPM: 适用于离线环境、单个软件包安装、精确控制版本
  • YUM: 适用于在线环境、批量安装、自动解决依赖

3. 实战案例

3.1 案例1: 从光盘安装软件

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 挂载光盘
mount /dev/cdrom /mnt

# 2. 查找软件包
ls /mnt/Packages/ |grep tree

# 3. 安装软件包
rpm -ivh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm

# 4. 验证安装
rpm -q tree
tree --version

3.2 案例2: 查询软件包信息

1
2
3
4
5
6
7
8
9
10
11
# 查询nginx软件包信息
rpm -qi nginx

# 查询nginx安装的文件
rpm -ql nginx

# 查询nginx的配置文件
rpm -qc nginx

# 查询nginx命令属于哪个包
rpm -qf $(which nginx)

3.3 案例3: 软件包升级

1
2
3
4
5
6
7
8
9
10
11
# 1. 查询当前版本
rpm -q vsftpd

# 2. 测试升级
rpm -Uvh --test vsftpd-new.rpm

# 3. 执行升级
rpm -Uvh vsftpd-new.rpm

# 4. 验证升级
rpm -q vsftpd

3.4 案例4: 系统文件校验

1
2
3
4
5
6
7
8
# 校验所有系统文件
rpm -Va > /tmp/rpm_verify.log

# 查看被修改的文件
grep "^..5" /tmp/rpm_verify.log

# 校验特定软件包
rpm -V vsftpd