RPM 依赖机制讲清楚
RPM 用能力(capability)模型表达依赖:每个包提供若干能力(provides),同时声明需要的能力(requires)。安装时解析器把需求匹配到某个包的提供项,匹配不上就报 Failed dependencies。另一类报错是文件冲突(conflict),两个包想装同一路径。处理哲学是补源、找提供者、交给 dnf 统一解析,而不是无脑 --force 或 --nodeps;后者装上去的包在后续升级中极易破碎。
基本信息
| 适用平台 | rpm 系:openEuler、银河麒麟、RHEL/CentOS、Fedora |
|---|---|
| 查依赖 | rpm -qpR 包文件 / rpm -qR 已装包名 |
| 找提供者 | dnf repoquery --whatprovides '能力名' |
| 查文件归属 | rpm -qf 路径 |
| 正确处理 | 优先 dnf install ./包文件,让解析器补齐依赖 |
典型使用场景
- 手工装离线包报缺依赖:定位到底缺哪个能力、由谁提供
- 文件冲突排错:确认路径属于哪个包,判断覆盖还是改包
- 离线环境依赖闭环:把 rpm -qpR 的结果人工凑齐一整套离线包
- 升级失败排查:旧包残留或版本锁死导致解析失败
- 自研包打包:检查自己打的包是否声明了正确的依赖能力
依赖排查
依赖排查
rpm -qpR ./pkg.rpm | head -20 # 看这个包依赖哪些能力
rpm -qR nginx | head -20 # 看已装包的依赖清单
dnf repoquery --whatprovides 'libxx.so*' # 找谁能提供该依赖
dnf repoquery --requires ./pkg.rpm # 用 dnf 解析包文件依赖
rpm -qf /usr/lib64/libxx.so.1 # 反查某文件属于哪个包
dnf install ./pkg.rpm # 交给 dnf 自动补齐依赖
rpm -qp --conflicts ./pkg.rpm # 查看该包声明了哪些冲突报错与处理对照
| 报错 | 含义 | 处理方式 |
|---|---|---|
| Failed dependencies: libxx.so needed | 缺少被依赖的能力 | 找提供者装包,或让 dnf 解析 |
| file /usr/bin/x conflicts | 两个包安装同一路径 | rpm -qf 查归属,决定覆盖或换包 |
| package X is already installed | 同名同版本已存在 | 确认版本后加 --replacepkgs 或先卸载 |
| package X is obsoleted by Y | 被其他包取代 | 装 Y,不要硬装 X |
| nothing provides /usr/bin/python3 | 脚本依赖的文件型能力缺失 | 装对应解释器或提供该文件的能力包 |
| loop in dependency chain | 依赖成环 | 用 dnf 而非 rpm 单独安装 |
文件冲突往往说明两个包职责重叠:先用 rpm -qf 查清路径归属再决定处理方式,不要直接加 --force 覆盖别人的文件。
rpm -qpR 输出里的能力名可能带 ()(64bit) 之类修饰,这是 RPM 的能力语法,搜索时按原样带引号查询才能命中。