某个软件包更新即将结束时,主机崩溃了,现在我遇到了一个需要修复的不一致问题:
rpm -Va
抱怨依赖包丢失,但那些包已经安装好了!
但是当我使用时,rpm -qa package_name
我看到同一个包被安装多次(例如三次)。
当我尝试使用删除包时rpm -ve package_name
,rpm
告诉我:
错误:“package_name”指定了多个包:
但请注意,冒号后没有输出。因此,当使用列出软件包时,rpm -qa package_name
我得到了三个相同软件包的列表(相同发行版、相同版本、相同架构)。当我使用完整的软件包名称时rpm -ve
,我再次收到有关多个软件包的消息,但这次列出了完整的软件包名称。
我怎样才能删除重复的包以便重新干净地安装它们?
rpm
版本是4.14.3-150300.46.1.x86_64
SLES 15 SP3
我已经尝试过了rpm -v --rebuilddb
:它没有输出任何东西,也没有改变任何东西。
答案1
在 BtrFS 上配置了自动快照后,我尝试了以下操作:
mkdir /var/lib/rpm/SAVED
mv /var/lib/rpm/* /var/lib/rpm/SAVED/
用于
snapper list
查找最近有用的快照编号。在我的例子中,它是 439。将保存的 RPM 数据库复制回系统。
/var
在 中找到一个空文件后/.snapshots/439/snapshot/var
,我意识到这是一个指向(ie:/var/lib/rpm
的符号链接(顺便说一句,在我看来这是一个愚蠢的概念)。所以我习惯将快照的那部分复制回系统中。../../usr/lib/sysimage/rpm
/usr/lib/sysimage/rpm
cp -a /.snapshots/439/snapshot/usr/lib/sysimage/rpm/* /var/lib/rpm/
接下来我检查
/var/log/zypp/history
发现快照之后被删除的软件包(系统认为这些软件包仍然存在),所以我重新安装了它们以使 RPM 数据库与文件一致。同样,我重复了在线更新(可能在文件系统中,但不在 RPM 数据库中)。请记住:该快照已拍摄前更新失败,因此更新不在数据库中。
最后我跑去
rpm -Va
寻找可疑的输出,可能需要重新安装包。不过看起来还不错!
因此,整个问题似乎在于 RPM 数据库损坏或不一致,但 RPM 本身并未检测到该问题。