やまものブログ

メモ書きブログです (^_^;A

dpkg: 復旧不可能な致命的なエラーです。

Ubuntu 14.04 にて、アプリのインストール、アップデートがいっさいできなくなりました

例えば、GUI からのアップデートはこんなエラーで失敗したり…
イメージ 1

プロンプトから "sudo apt-get install ..."を実行すると、こんなエラーで終了したり…
dpkg: 復旧不可能な致命的なエラーです。中止します:
パッケージ 'ssh-askpass-gnome' のファイル一覧ファイルに最後の改行がありません
E: Sub-process /usr/bin/dpkg returned an error code (2)

最初の GUI でのエラーも詳細をよく見ると、これと同じエラーが原因になっていました。


検索すると、この対策方法であるとほぼ考えられる情報を下記のサイトで見つけました。

上記サイトの対処方法では、最終的に、問題のアプリを Synaptic で再インストールします。ところが、自分の環境には Synaptic が入っていなく、Synaptic を入れようとするとまさしくこのエラーに遭遇するというループに陥ってしまいました


そこで、素人の独断ですが、以下の2つのファイルの手修正で問題を回避出来ました。

① /var/lib/dpkg/info/ssh-askpass-gnome.list
 これを下記のサイトにあったテキストのコピペに入れかえる。
http://packages.ubuntu.com/ja/precise-updates/i386/ssh-askpass-gnome/filelist

② /var/lib/dpkg/info/libgettextpo-dev:amd64.list
 これを下記のサイトにあったテキストのコピペに入れかえる。
https://packages.debian.org/sid/amd64/libgettextpo-dev/filelist


自分が理解できたところを補足しますと、dpkg が管理するファイル一覧の情報は
/var/lib/dpkg/info/
に "*.list" という拡張子の 'ASCII text' ファイルとして保存されているようです。

このため、正常の状態であれば、
$ cd /var/lib/dpkg/info
$ file *.list
とすると、すべてがテキストファイルとして認識されるはずです。

ところが、今回、入れ替えたファイルは破損していたため、data として認識されていました。
ssh-askpass-gnome.list:             data
libgettextpo-dev:amd64.list:   data

強引に対処しましたが、エラーになっていたアップデートは正常終了するようになりました

また、今後同じ問題が発生した場合に備えて、バックアップをとりました。
$ cd /var/lib/dpkg
$ tar zcvf ~/tmp/dpkg_info_150502.tgz info/

最近、正しくシャットダウンできないことがあったので、その際にファイルが壊れたものと思われます。

最後に、以上の対処方法は、開発者でもない素人が苦し紛れに行ったことです。もし、同じ症状をこれで対処される場合は、バックアップをとるなど自己責任にてお願いいたします m(__)m