破損したdpkgステータスファイルを再構築するにはどうすればよいですか?


26

入力してsudo apt-get removeからTabオートコンプリートのキーを押すたびに、次のメッセージが表示されます。

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

ステータスファイルの行15945に特に奇妙なものはありません。これは、モノラルライブラリパッケージの説明フィールドにあるドット文字であり、コロンを挿入しても役に立ちませんでした。ドットを含む行の削除も機能しませんでした。ファイルをstatus-oldで上書きすると、同じメッセージが表示されました。

ステータスファイルを再構築する方法はありますか?


3
statusファイルを完全に再構築できるとは思いません。ファイルは主な情報源であり、その多くは冗長ですが、すべてではありません。ただし、ファイルを手動で修復することはおそらく可能です。ポスト問題のある行の周りのファイルのチャンク、少なくとも一つを含む20〜40行と言うPackage:ライン15945.前後のラインを
ジル「SO-停止されて悪」

その後、モノをアンインストールしようとしましたが、エラーとして報告される行番号を変更するだけでした。貼り付けリンクをたどると、問題の行番号は25、「セクション:python」 paste.ubuntu.com/501929-
ラモン

ラモンので、@ apt-getdpkgと友人はまだ正常に動作し、自動補完が何であるかをerroringされているのですか?
リッカルドムリ

正しい。オートコンプリートを使用している場合にのみステータスファイルの解析に問題があるようです。そうでなければ、明らかなエラーなしでパッケージをインストールおよび削除できます。
ラモン

同じ問題を取得します。aptのデータベースの古いバージョンを盲目的に使用することは、この問題の修正に関係なく、ここで行う正しいことだとは思いません。
オリ

回答:


7

私はついにこのシステムを修正しました。ステータスファイルのバックアップを復元することは、私が長い間問題を抱えていたため機能しませんでした。それはすべてのバックアップにあります。

修正には、実際のフォーマットの区切りをgrepして手動で修正することが含まれます。思ったほど難しくありません。

http://thepcspy.com/read/fixing-dpkg-status-corruption/


解決策を見つけてくれてありがとう、Oliと共有してくれてありがとう。私の場合、問題のあるLexmark debに加えて、Webmin debの記述も不正な形式でしたが、その場合、オートコンプリートを実行するときに解析の問題は発生しませんでした。奇妙な。
ラモン

3
@Oliはライセンスの所有者ですか?ここに書いていただけますか?
Braiam

これは本当です、あなたの投稿を読んで良かったです。私は持っていて、missing package name見つけた時間を無駄にしない方がおかしい理由で、Packaga: landscape-commonオルソグラフィックに修正されて問題が解決した行があることを知りました。事は、私はこのファイルに触れたことがないし、他の誰にも触れたことがない。コンピュータはどのようにスペルミスを台無しにできますか?
セベロラズ14

リンクのみの回答(「Package:」に先行しない空白行からのエラーの場合は、.その空白行にa を追加する)を避けるため、実際の回答もここにある必要があります。
Xen2050

20

以前の既知の正常なステータスファイルで作業し、そこから更新できるはずです。インストールまたは更新を行うたびに、ステータスファイルは/ var / backupsの下のgzip圧縮されたバックアップに保存されます。こうのls -l dpkgのディレクトリショーに*を:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

status-oldという名前の/ var / lib / dpkg /ディレクトリに作成されたファイルのバックアップもあります。こうLS -lステータスをディレクトリショーで*:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

したがって、破損から回復するには、次のことを実行できる必要があります。

1.破損したステータスファイルのバックアップを作成します

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2.上記のソースのいずれかから最新のdpkgステータスファイルを所定の場所にコピーします。

どちらか

cp /var/lib/dpkg/status-old /var/lib/dpkg/status

または

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

3.次に、apt-get updateを実行します。

sudo apt-get update

それはそれを行う必要があります。


2
/ var / backupsに保存されているステータスファイルについては知りませんでした。これは、再び発生した場合に役立つ情報です。ありがとう、ジム。
ラモン

しかし、古いバージョンを使用しても安全ですか?つまり、このファイルを使用するのはオートコンプリートだけではなく、古いパッケージ情報を含む古いバージョンを使用すると、他のはるかに重要なこと... apt自体などが台無しになります。
オリ

@Oliよく分かりません。私はこれを一度だけしなければならなかった。問題の原因となったアプリを再インストールする必要があったと思いますが、今後は機能しました。インターネットに関するすべてのアドバイス(または、少なくともインターネットに関する私からのアドバイス)と同様に、これはうまくいきました。それは必ずしもあなたのために働くだろうという意味ではありません。私はそれを保証なしで、そしてそれがあなたのシステムでどのように振る舞うかについての明確な知識なしで提供します。あなたのマイレージは異なる場合があります。ご自身の責任でお試しください。
ジム

この解決策は私の問題を解決したようです。古いステータスファイルを使用して問題が発生した場合は更新します。
マシュー

古いファイルには、システムに対して行われたパッケージの変更が欠落している場合がありますが、ほとんどは問題ありません。これsudo apt update && sudo apt dist-upgradeにより、古いstatusファイルが引き起こす可能性のあるほとんどの問題が修正されます。システムの混乱が大きい場合、sudo aptitude dist-upgrade代わりにsudo apt ...破損を修正するより良い方法を提案することがあります。
ミッコランタライネン

6

ステータスファイルのエントリが破損しているパッケージを削除することで、この問題を修正できました。

sudo dpkg -r handbrake-cli

pcregrepを介して受け入れられたソリューションは機能しませんでした(pcregrepは何も見つかりませんでした)。


そんなにそれは私のために動作し、実際には感謝正しいアプローチでいただきありがとうございます
user2671192

6

問題のあるパッケージに対して「dpkg -P」を試してください。これにより、ローカルリポジトリから削除され、すべてのトレースが削除されます。私のシステムでは、そのエラーを引き起こした削除済み(まだパージされていない)パッケージの修正でした。


5

この場合、破損した/var/lib/dpkg/statusファイルをバックアップしてから、次の情報を使用して手動で修正します(1888行と9550行付近)。

apt-cache show libssl0.9.8
apt-cache show udev

わかった。apt-getがスムーズに実行されるようになりました。
エンドリューク


2

息子の...

さて、実際のエラーは15266行目にありましたが、さらに700行下が報告されています。ステータスファイルの問題のあるエントリの原因は、Lexmarkプリンタをずっと前に動作させるためにインストールしたdebでした。エントリはパッケージ用でしたlexmark-inkjet-08-driver。説明フィールドには.、改行の場所がありませんでした。これにより、解析エラーが発生しました。

これを見つけるために、私はショットガンのトラブルシューティング方法に頼り、ほとんどランダムに試行し始めました。私の間抜けな試みの1つは、grep-status -P eeがアルファベットの中で最も一般的な文字であると考えることでした。馬鹿げた、私は知っているが、コロンがないことを訴える前に印刷された最後のステータスレコードはlexmarkパッケージのものであり、私.は画面を見つめて数分後に文字の欠如に気づいた。

可能であれば、将来同様の問題が発生した場合に、この種の問題を見つけるためのより良い方法を説明できる別の回答をお願いします。ありがとう。


grep-status -r -P ^常にすべてのパッケージに一致する必要があるため、ファイル全体を解析し、解析できない場合は中止する必要があります。
ミッコランタライネン

2

私のステータスは、apt-get update

これは私にとってかなりうまくいきました:

(ルートとして)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

このコマンドは、trコマンドに-cおよび-d引数を使用して、単一引用符で囲まれたASCII 8進値以外のすべての文字を入力ストリームから削除します。このコマンドは、特に次の文字がこのUnixフィルターを通過することを許可します。

8進数11:タブ

8進数12:改行

8進数15:復帰

8進数40から8進数176:すべての「良い」キーボード文字

他のすべてのバイナリ文字(ファイル内の「ガベージ」文字)は、この変換プロセス中に削除されます。

クレジット:http : //alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

何が変わったのか、どこにダメージがあるのか​​知りたい場合:(おそらく長い)

diff /var/lib/dpkg/{status-old,status} |less
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.