重新安装缺少/损坏的文件的软件包


17

不正常的关机和色彩斑f的fsck之后,一堆文件丢失了。'rpm -Va'的输出长度为几百行(主要是丢失的文件,而且还有一些校验和和其他不匹配项)。有没有简单的方法可以重新安装缺少文件和/或损坏的软件包?

有问题的操作系统是Fedora 22。


3
解析输出和对每个文件查询进行解析当然是可能的,但也很繁琐,其中包含该文件的包可能要花费一些时间。为什么不简单地重新安装所有软件包?yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000

如果我没记错的话,过滤掉所有由预链接引起的其他问题可能也很丑陋,根据fedorahosted.org/fesco/ticket/1183
doktor5000

我确实确实确实完成了所有内容的重新安装-问题是我忘记为dnf启用保留缓存,最终下载了超过2gb的软件包(并且我已经封顶了互联网)
jaymmer-恢复莫妮卡2015年

Answers:


16

为了参考和完整性起见,一个能够实现最初要求的命令将是这样的(迅速摆弄,但它正在工作)

rpm -qf $(rpm -Va 2>&1 | grep -vE '^$|prelink:' | sed 's|.* /|/|') | sort -u

这是各个部分的简短说明:

rpm -Va 2>&1

将对rpm数据库中当前安装/列出的所有软件包运行完整的验证。它还会将stderr重定向到stdout,因为在我的方框中,由于启用了预链接而导致的一些错误被报告为错误,但我们希望它们在stdout上出现。
注意:需要以root用户身份运行才能检查所有文件,权限和所有者/组。

grep -vE '^$|prelink:'

禁止显示显示emtpy线和这样的预链接错误的(这样的错误的示例:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1

sed 's|.* /|/|')

将过滤rpm -Va输出以仅显示文件名

rpm -qf $()

将查询所有包含文件包的文件名,并输出文件包名称和版本

| sort -u

将取消重复的软件包名称/版本组合。

总共您将收到未通过验证的软件包列表。

rpm -Va可能仍会显示一些不相关的问题,因为它还会检查软件包之间的依赖关系,可能需要通过添加来抑制它们 --nodeps


2

我最近在openSUSE 13.2上丢失文件时遇到了类似的问题,并使用以下方法进行了修复:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime\
| awk -e '($1=="missing") && ($2=="d") {system("rpm -qf "$3);}; ($1=="missing") && ($2!="d") && ($2!="c") {system("rpm -qf "$2);}'\
| sort -u | xargs zypper in -f

在我的情况下,rpm选项和对awk的调用旨在节省时间,因为没有发生损坏。


1
如果没有文件损坏,您甚至可以添加文件,--nofiles因此基本上可以执行相同的操作,yum check dependencies因为它只会检查所有已安装的rpm软件包中的相关性问题。--nofiles这将为非SSD安装节省大量时间,但您也将省略对丢失文件的检查。...仅出于完整性考虑。并且请记住,如果您对英文字符串进行grep LC_ALL=C
编码
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.