跳转到内容

RPM 基础

适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x

RPM (Red Hat Package Manager) 是 EL 系统底层的包管理工具。虽然日常操作中更常使用 DNF,但理解 RPM 基础对于查询包信息、验证包完整性以及排查问题非常有帮助。

  • RPM 包的命名格式和结构
  • 使用 rpm 查询已安装的包信息
  • 安装和验证 RPM 文件
  • RPM 与 DNF 的关系
  • GPG 密钥验证机制
  • 一台已安装 EL 9.x 的系统
  • 拥有 sudo 权限的用户账户
  • 了解 DNF 基础操作

每个 RPM 包的文件名遵循固定格式:

名称-版本-发行号.架构.rpm

nginx-1.24.0-1.el9.x86_64.rpm 为例:

部分说明
名称nginx软件名称
版本1.24.0上游软件版本
发行号1.el9打包版本,el9 表示适用于 EL 9
架构x86_64目标 CPU 架构

RPM 的查询功能非常强大,是日常排查的利器。所有查询操作都以 rpm -q 开头。

查询 nginx 是否已安装
$ rpm -q nginx
nginx-1.24.0-1.el9.x86_64

如果未安装,输出:

package nginx is not installed
列出系统中所有已安装的 RPM 包
$ rpm -qa
结合 grep 过滤
$ rpm -qa | grep ssh
openssh-server-8.7p1-38.el9.x86_64
openssh-clients-8.7p1-38.el9.x86_64
openssh-8.7p1-38.el9.x86_64
按安装时间排序(最近安装的在最后)
$ rpm -qa --last | head -20
查看 nginx 包的详细信息
$ rpm -qi nginx

输出示例:

Name : nginx
Version : 1.24.0
Release : 1.el9
Architecture: x86_64
Install Date: Mon 24 Mar 2026 10:00:00 AM CST
Group : System Environment/Daemons
Size : 1918738
License : BSD
Signature : RSA/SHA256, Fri 15 Nov 2025 08:00:00 AM CST, Key ID ...
Source RPM : nginx-1.24.0-1.el9.src.rpm
Build Date : Fri 15 Nov 2025 06:00:00 AM CST
Build Host : build.almalinux.org
URL : https://nginx.org/
Summary : A high performance web server and reverse proxy server
Description : Nginx is a web server and a reverse proxy server...
查看 nginx 包安装了哪些文件
$ rpm -ql nginx

输出示例:

/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/nginx.conf
/usr/lib/systemd/system/nginx.service
/usr/sbin/nginx
/usr/share/nginx/html/index.html
...
查找某个文件属于哪个 RPM 包
$ rpm -qf /usr/sbin/nginx
nginx-1.24.0-1.el9.x86_64
查找配置文件属于哪个包
$ rpm -qf /etc/ssh/sshd_config
openssh-server-8.7p1-38.el9.x86_64
列出 nginx 包的配置文件
$ rpm -qc nginx

输出示例:

/etc/logrotate.d/nginx
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi.conf
/etc/nginx/nginx.conf
...
列出 nginx 包的文档文件
$ rpm -qd nginx
查看 nginx 依赖哪些包
$ rpm -qR nginx
查看哪些包依赖 openssl-libs
$ rpm -q --whatrequires openssl-libs

以上查询命令加上 -p 参数,就可以查询尚未安装的 .rpm 文件:

查看未安装的 RPM 文件信息
$ rpm -qip ./some-package-1.0-1.el9.x86_64.rpm
查看未安装 RPM 文件中包含的文件列表
$ rpm -qlp ./some-package-1.0-1.el9.x86_64.rpm
命令说明
rpm -qa列出所有已安装的包
rpm -q <包名>查询包是否已安装
rpm -qi <包名>查看包的详细信息
rpm -ql <包名>列出包安装的所有文件
rpm -qf <文件路径>查找文件属于哪个包
rpm -qc <包名>列出包的配置文件
rpm -qd <包名>列出包的文档文件
rpm -qR <包名>查看包的依赖关系
rpm -q --last按安装时间列出包
使用 rpm 安装本地 RPM 文件
$ sudo rpm -ivh package-1.0-1.el9.x86_64.rpm

参数说明:

  • -i:安装
  • -v:显示详细信息
  • -h:显示进度条
使用 DNF 安装本地 RPM 文件(自动解决依赖)
$ sudo dnf install ./package-1.0-1.el9.x86_64.rpm
升级已安装的包
$ sudo rpm -Uvh package-1.1-1.el9.x86_64.rpm

-U 参数的行为:如果包已安装则升级,如果未安装则安装。

删除已安装的包
$ sudo rpm -e nginx
验证 nginx 包的文件是否被修改
$ rpm -V nginx

如果所有文件完好,命令没有输出。如果有文件被修改,会显示修改标记:

S.5....T. c /etc/nginx/nginx.conf

标记含义:

标记说明
S文件大小变化
M权限或文件类型变化
5MD5 校验和变化
D设备号变化
L符号链接变化
U属主变化
G属组变化
T修改时间变化
P功能 (capabilities) 变化
验证所有已安装的包
$ rpm -Va

RPM 使用 GPG 签名来确保包的真实性和完整性。

列出系统中已导入的 RPM GPG 密钥
$ rpm -qa gpg-pubkey*
查看某个密钥的详细信息
$ rpm -qi gpg-pubkey-xxxxxxxx-yyyyyyyy
导入仓库的 GPG 公钥
$ sudo rpm --import https://www.example.com/RPM-GPG-KEY-example
导入本地 GPG 公钥文件
$ sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9
验证 RPM 文件的 GPG 签名
$ rpm -K package-1.0-1.el9.x86_64.rpm

输出示例(签名有效):

package-1.0-1.el9.x86_64.rpm: digests signatures OK

输出示例(签名无效或密钥未导入):

package-1.0-1.el9.x86_64.rpm: digests SIGNATURES NOT OK

理解 RPM 和 DNF 的分工很重要:

特性RPMDNF
安装本地 .rpm 文件支持支持
自动解决依赖不支持支持
从仓库下载安装不支持支持
查询包信息支持支持
验证文件完整性支持不支持
GPG 签名验证支持支持(调用 RPM)

简单来说:

  • DNF 是高层包管理器,负责仓库管理、依赖解析和下载
  • RPM 是底层包管理器,负责实际的包安装、查询和验证
  • DNF 在底层调用 RPM 来完成包的安装和卸载

日常推荐使用 DNF 进行安装、更新和删除操作,使用 RPM 进行查询和验证操作。

说明包有未满足的依赖。解决方法:

推荐方法:使用 DNF 安装本地 RPM
$ sudo dnf install ./package.rpm

需要查找某个命令由哪个包提供

Section titled “需要查找某个命令由哪个包提供”
使用 DNF provides 查找
$ dnf provides */bin/dig

输出示例:

bind-utils-9.16.23-14.el9.x86_64 : Utilities for querying DNS name servers
Repo : baseos
Matched from:
Filename : /usr/bin/dig

如何提取 RPM 包中的文件(不安装)

Section titled “如何提取 RPM 包中的文件(不安装)”
使用 rpm2cpio 提取文件
$ rpm2cpio package.rpm | cpio -idmv