【问题标题】:How can I fix this corrupted rpmdb?如何修复这个损坏的 rpmdb?
【发布时间】:2018-10-14 03:40:25
【问题描述】:

我的 rpmdb 已损坏,修复它的常规程序似乎不起作用。

这是错误:

cris@PolariSuse [~]$ rpm -qa > /dev/null
error: rpmdbNextIterator: skipping h#   64697
Header V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD
Header SHA1 digest: BAD (Expected bf167126ecaa67d16fee74af17096529278aad8d != cd4a91ad1f0d65d360cce5dacffea553e358b550)

如果我尝试修复它,我会得到:

cris@PolariSuse [~]$ sudo rpmdb --rebuilddb
[sudo] password for root:
error: cannot add record originally at 64697
warning: failed to rebuild database: original database remains in place

我什至针对 Packages 文件尝试了 db_dump 和随后的 db_load:它显然有效,但新生成的 Packages 文件有相同的错误。

但是,我看到 rpm 在列出软件包时遇到错误后,它仍然能够继续列出后续软件包,所以理想情况下我想重建 Packages 文件以跳过损坏的记录。 不幸的是,我还没有找到任何能够做到这一点的实用程序。

有人知道修复这个损坏的数据库的另一种方法吗?

【问题讨论】:

    标签: linux rpm corruption berkeley-db corrupt-data


    【解决方案1】:

    删除标题并重新安装。

    请参阅 rpm 手册页了解如何删除给定的标头 #(您发布的消息中的 64697)。

    您可能需要 --nosignature --nodigest 来禁用失败的检查

    【讨论】:

    • 杰夫,谢谢您的回复!但是,如果您能详细说明这一点,我将不胜感激。我查看了手册页,但我看不到任何与标题 # 相关的内容,尤其是在擦除操作的选项下。我也尝试了 --hdrid 和 --pkgid 选项,但都回答了相同的错误:“error: malformed pkgid: 64697”。
    • Grrrr ... rpmdb --rebuilddb 已更改为在出现错误时停止。
    • 删除记录的一种方法是将 db_dump 的输出保存在 Packages 上,然后使用文本编辑器编辑掉记录。 db_dump 格式是下一行后面跟着值的键(即 rpm 标头)。关键是十六进制的 hdrid。使用模式匹配查找键,然后删除该键和值。然后继续将文件提供给 db_load。
    • 杰夫,再次感谢您的提示。我用 db_dump 导出了我的数据库。我不明白的是,我是否必须查找密钥 ID(即 3dbdc284)或标头的十六进制表示(64697)。如果是后者:我是否必须将 64697 作为数字并将其转换为十六进制?还是我必须转换 6-4-6-9-7 字符并使用它们的十六进制表示?如果您不介意,我从导出的数据库中推断出所有密钥,它们都可用here。请您看看它们并告诉我哪些是我必须删除的?
    • 将 64697 数字,而不是 as ii 字符)从十进制转换为 8 位十六进制:这是 db_dump 输出中的主键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多