ファイルが見つからない/破損しているパッケージを再インストールする


17

異常なシャットダウンとカラフルなfsckの後、大量のファイルが失われました。「rpm -Va」の出力は数百行の長さです(主にファイルが欠落していますが、チェックサムやその他の不一致もあります)。ファイルが見つからないか破損しているパッケージを再インストールする簡単な方法はありますか?

問題のOSはFedora 22です。


3
確かに可能ですが、出力を解析し、各ファイルについてそのファイルを含むパッケージを照会するのはかなり面倒で、おそらく時間がかかります。すべてのパッケージを単純に再インストールしないのはなぜですか?yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000

また、私は間違っていない、まだによるFedoraの上でデフォルトで有効になっている場合は、プリリンクによって引き起こされるすべての追加の問題を除外するためにかなり醜いかもしれないfedorahosted.org/fesco/ticket/1183
doktor5000

問題は、私はDNFのためにキープキャッシュを有効にするのを忘れていたことだった、それはパッケージの2ギガバイトの上にダウンロードしてしまった(と私はインターネットを頂いたしている) -私は確かにすべてを再インストールして終了しました
jaymmer -復活モニカ

回答:


16

参照と完全性のために、最初に要求されたことを達成できるコマンドの1つは次のようなものです(すばやく調整されていますが、機能しています)

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

さまざまな部分の簡単な説明を次に示します。

rpm -Va 2>&1

rpmデータベースに現在インストール/リストされているすべてのパッケージで完全な検証を実行します。また、stderrをstdoutにリダイレクトします。ここで、私のボックスでは、prelinkが有効になっていることによって引き起こされるいくつかのエラーがエラーとして報告されますが、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;)を付けてください。
doktor500015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.