从损坏的系统做恢复,要查询一些文件归属于哪个 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