rpm -qr 仅对已安装包有效,只显示构建时声明的直接 requires(如库、路径、虚拟包),不递归展开依赖,也不校验当前是否真实可用。

直接看结论:别用 rpm -qR 查未安装包,也别只靠 ldd 判断运行时依赖是否满足——它不检查版本约束,也不管包管理器怎么解析依赖树。
查已安装 RPM 包的直接依赖用 rpm -qR
这个命令只对已安装的包有效,输出的是该包在构建时声明的 Requires 字段内容,包括共享库符号(如 libssl.so.10()(64bit))、二进制路径(如 /bin/bash)和虚拟包(如 systemd)。
- 它不展开递归依赖,比如 A → B → C,
rpm -qR A不会显示 C - 它不校验这些依赖当前是否真实可用,只告诉你“当时打包时写了要这些”
- 若看到类似
rpmlib(PayloadIsXz) 这种,是 RPM 自身元数据要求,不用管
查未安装 RPM 包的依赖必须先下载再 rpm -qpR
想看一个还没装的 .rpm 文件依赖什么?rpm -qR 会报错 package xxx is not installed。正确流程是:
- 用
yumdownloader或dnf download先把包拉下来(例如:dnf download tcpdump) - 再执行
rpm -qpR tcpdump-*.rpm—— 注意-p参数表示“对文件而非已安装包操作” - 如果系统没装
yumdownloader,先dnf install yum-utils
查谁依赖某个已安装包:用 dnf repoquery --whatrequires(RHEL/Fedora)或 apt-cache rdepends(Debian/Ubuntu)
这是排查“删掉这个包会不会影响其他服务”的关键动作。比如想确认删 openssl-libs 是否安全:
- RHEL 8+:
dnf repoquery --whatrequires openssl-libs --alldeps --recursive——--recursive很重要,否则只显示一级依赖 - Ubuntu:
apt-cache rdepends --installed libssl1.1,注意包名可能和dpkg -l显示的不一致,得先用dpkg -S /usr/lib/x86_64-linux-gnu/libssl.so.1.1反查提供者 -
rpm -q --whatrequires在旧版 RHEL/CentOS 上基本不可靠,常漏掉间接依赖,别信
ldd 只能看动态链接路径,不能替代包级依赖分析
运行 ldd /usr/bin/curl 能列出它加载的 .so 路径,但容易误导:
- 它不告诉你哪个 RPM 包提供了
libcurl.so.4,得配合dnf provides */libcurl.so.4或dpkg -S libcurl.so.4 - 它不验证符号版本是否匹配,比如程序需要
GLIBC_2.34,而系统只有GLIBC_2.32,ldd仍显示“found”,运行时才崩 - 静态链接的二进制(如某些 Go 编译程序)根本不出现在
ldd输出里,但它可能仍依赖特定配置文件或 systemd unit
真正麻烦的永远是隐式依赖:比如一个脚本硬编码调用 /usr/bin/python3,但没在 RPM 的 Requires 里声明;或者两个包都提供 mail-transport-agent 虚拟包,却互相冲突。这种时候,dnf --debuglevel=10 或 apt-get install -o Debug::pkgProblemResolver=true 才是救命稻草。










