rpm -qa 是 RPM 系统查已安装包的最权威命令,直接读取本地数据库,不依赖缓存或网络;需先用 rpm --version 确认系统支持,再配合 rpm -q、-ql、-qi 等深入查询。

rpm -qa 是最直接可靠的命令
只要系统用的是 RPM 包管理器(RHEL/CentOS/Fedora/openSUSE 等),rpm -qa 就是查所有已安装 RPM 包名的底层权威命令。它不依赖 yum/dnf 缓存,不走网络,直接读取本地 RPM 数据库,结果最真实。
常见错误现象:有人在 CentOS 上跑 apt list --installed,或在 Ubuntu 上硬套 rpm -qa,结果要么报错,要么返回空——不是命令写错了,是包管理器根本不匹配。
-
rpm -qa输出的是完整包名(如nginx-1.20.1-10.el9.x86_64),含版本和架构,适合做精确比对 - 想快速过滤某个软件?用
rpm -qa | grep -i nginx,注意加-i忽略大小写更稳妥 - 如果输出极长,加
| less或| head -20分页/截断,避免终端卡住
rpm -qa 和 dnf list installed 有本质区别
dnf list installed(或旧版 yum list installed)看起来更“友好”,带源信息、状态标记,但它依赖 dnf/yum 的元数据缓存。一旦缓存过期、损坏,或你手动用 rpm -ivh 绕过 dnf 安装了包,dnf list installed 就可能漏掉它。
而 rpm -qa 不管你是用 dnf 装的、yum 装的、还是直接 rpm -ivh 强装的,只要进了 RPM 数据库,它就列得出来。
- 查是否真装了某个包?优先用
rpm -q nginx(只输包名,不带版本),返回包全名说明存在;返回package nginx is not installed就真没装 -
dnf list installed适合看包来自哪个 repo(比如@anaconda或@epel),但不能替代rpm -qa做完整性校验 - 运维排查时,若发现
dnf list installed | grep nginx没结果,但nginx -v能运行,大概率是 rpm 直装或源码编译,此时必须回退到rpm -qa或which nginx追踪路径
查不到包?先确认系统真用 RPM
别急着调参数,先验证当前系统底层是不是 RPM 系。执行 rpm --version,有输出才说明 rpm -qa 有效。如果没输出,可能是 Debian/Ubuntu(用 dpkg -l)、Arch(用 pacman -Q)或 Alpine(用 apk info)。
有人看 /etc/os-release 里写着 “CentOS Stream”,就默认能用 rpm,结果在某些容器镜像里 rpm 被精简掉了——这种情况下 rpm --version 直接报 command not found,得换思路。
- 安全做法:依次跑
dpkg --version、rpm --version、pacman --version、apk --version,第一个有输出的才是你该用的命令 - 别信
which yum或which dnf,有些镜像预装了这些命令但底层不用它们管理包 - 容器环境尤其要小心:
rpm -qa在最小化镜像里可能根本不存在,得靠ls /usr/bin或cat /proc/1/cmdline辅助判断
查到包名后,下一步常需要看文件路径或详情
光有包名不够,多数时候你要知道它装了啥、配置在哪、有没有冲突。这时候 rpm -ql 和 rpm -qi 就派上用场了。
rpm -ql nginx 列出所有文件路径,包括二进制、配置、文档;rpm -qi nginx 显示描述、大小、安装时间、License 等元信息。这两个命令都要求输入准确的包名(即 rpm -qa 输出里的名字,不含 .rpm 后缀)。
- 查某个具体文件属于哪个包?用
rpm -qf /usr/sbin/httpd,注意必须给绝对路径 - 想确认包是否被篡改?
rpm -V nginx校验权限、大小、MD5 等,但默认不检查文件内容(需额外参数) - 输出太杂?加
--queryformat自定义格式,例如rpm -qa --queryformat '%{NAME}-%{VERSION}\n'只取名字+版本
实际用的时候,rpm -qa 这条命令本身很简单,但它的可靠性高度依赖你对系统包管理事实的判断——漏掉“先确认 rpm 是否可用”这步,后面所有操作都可能白忙。











