坑啊,rpm 的 –dbpath 参数竟然必须使用 / 开头有绝对路径,否则查询结果是安静的空行

从损坏的系统做恢复,要查询一些文件归属于哪个 rpm 包, rpm –dbpath 的参数非常有用:从损坏系统的 /var/lib/rpm 复制出 rpmdb ,并通过 –dbpath 指定到该目录

但,奇怪的是,完全没有结果,甚至修复了这个目录 rpm –dbpath tmp/rpmdb/ –rebuilddb ,也没报错,所有都正常。

原因,只在于,做 rpm 查询时,–dbpath 参数必须使用绝对路径,以 / 开头的地址,否则就是无言的罢工。

rpm 手册里,对此也没有做任何说明。

坑啊!坑啊!坑啊!

根据 chatGPT 提供的信息,未核实真实性,但可做参考。反正,永远记住, –dbpath 参数使用绝对地址,这就对了。

如下,

是的,--dbpath 对路径解析规则极不直观。它“表面上接受相对路径”,但实际行为非常不可靠。
在 CentOS/RHEL 7 中,相对路径往往会导致 rpm 找不到正确的数据库文件,最终表现为查询结果为空或报错。
因此,在实际使用中必须使用绝对路径。

原因是,

CentOS 7 / RHEL 7 / Fedora <22 上广泛使用的 rpm 4.11,采用 Berkeley DB (BDB)。
--dbpath 的路径被内部当成 rpmdb 根目录路径字符串,并与硬编码的相对文件名(如 Packages、Basenames 等)拼接。
rpm 不会像 POSIX 程序那样帮你把相对路径转换为绝对路径。

在此之后新的 RHEL 8 / CentOS 8 / Fedora ≥22(rpm 4.14+)改为采用基于 SQLite 的 rpmdb
--dbpath 的行为上确实有改进,但“只部分改善”,但依然不建议使用相对路径。

Last Updated on 2025/12/12

发表评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理