気の向くままに辿るIT/ICT/IoT
システム開発

/var/lib/dpkg/infoうっかり丸ごと削除からの復旧・解決策

ホーム前へ次へ
*BSD/PC-UNIX/Linuxって?

/var/lib/dpkg/infoうっかり丸ごと削除からの復旧・解決策

/var/lib/dpkg/infoうっかり丸ごと削除からの復旧・解決策

2019/11/20

 Debianでのとある作業中、未だかつてないドジを踏み、/var/lib/dpkg/infoディレクトリをまるごと削除してしまいました...。

 こんなことをしでかしたのは、自分だけだろうな...と思ったら、過去にもいた模様、が、解決に至ったケースは限られ、これならいける!っていう決定打がないような...。

debian:~$ sudo mkdir /var/lib/dpkg/info
debian:~$ sudo touch /var/lib/dpkg/info/format-new
debian:~$ for package in `dpkg -l | awk '/^ii/ {print $2}'`;do sudo apt -y --reinstall install $package;done
debian:~$ for package in `sudo dpkg --audit | awk '{print $1}'`;do sudo apt purge -y $package;sudo apt autoremove -y;done;sudo apt update
...
debian:~$

 そこで試行錯誤した結果として生まれた解決策が、このワンライナーというかツーライナー。

 その前に何かと後述のエラーが出ると思うので削除したinfoディレクトリを、また、そこにformat-newファイルを作成しておきます。

 そして、ワンライナー2つ。

 まずは、dpkg -l(インストール済みパッケージ)の情報を使ってreinstall。

 続いてdpkg --audit(インストールされている模様も問題がありそうなパッケージを抽出する検査)の情報を使ってapt purge。

 これらというか、前者は、マシンスペックやインストール済みパッケージの数等に応じて相当な時間がかかるので覚悟が必要です。

 自身の場合、IntelデュアルコアCPU/RAM:4GBのPCで前者に約5時間半かかりました...、後者は計測しませんでしたが、覚悟した割には肩透かしをくらったようにすぐに終わった印象です。

 apt purgeは、[apt(-get) remove --purge]と等価、[dpkg -P]も同様のようです。

 単なるremoveがパッケージのみ削除するのと異なり、purgeは、対象パッケージだけでなく、インストール時に展開された設定ファイル類も削除します。

 purge、というか、removeにおいては、どうやらパッケージによって、それを削除するならこれを代わりに入れとくぞ的なインストールが含まれることもあるようです。

(Debian Busterでたまたま確認したのは、EmpathyとPidginとか)

 何が言いたいかというと、この時、削除済みパッケージの構成ファイルが残っていた(単にパッケージのみを削除するapt removeしたパッケージがあった)場合、構成ファイルを上書きする前に確認を求められることがあるので-yを渡したからと言って放置はできない可能性もある点に注意が必要ということです。

 これで解決したわけですが、実行中は、削除されるものもあれば、「パッケージ xxx はインストールされていないため削除もされません」といったものもある一方、インストール済みだったパッケージの?インストールもしているようでデータベース登録数(「現在 xxx 個のファイルとディレクトリがインストールされています」)の数が、だんだん増えていっています。

 解決直後に保存してあったdpkg --auditされたファイル群の一部をapt-cache searchしてみると存在するものもあれば、存在しないものもありました。

 また、システムやメニューを眺めてもインストールしてあったものが消えているということもなさげでした。

 つまりは、ないはずのものがあることになってた、かつ、/var/lib/dpkg/infoディレクトリに必要な(命名規則の拡張子を持つ)ファイル群がなかったから整合性がとれなかったということだったようで、対策が削除するだけって必要なものもなくなっちゃうんじゃ?という心配は要らないようです。

 当然、この対策を行なっているPCは、任意のパッケージのインストール・アンインストール、依存関係の調整・構築などが行われているのでマシンスペックによっては他の作業が厳しくなる可能性はもとより、その時点で起動しないアプリなどもあり、作業内容によっては、別マシンを使うことになるでしょう。

 これは、あくまで/var/lib/dpkg/infoを削除してしまった場合の対策の一例です。

 大丈夫なはずですが、ことがことだけに実行にあたっては、置かれている状況をよく見回し、確かめた上、自己責任で。

解決策にたどり着くまでの試行錯誤

 任意のパッケージのインストールやアンインストールをしようにもできない、見た目なんともなさそうで起動もできるソフトウェアの動作も変な気がしなくもない。

 /var/lib/dpkg/infoディレクトリを削除してしまった自覚はなかったが、端末の履歴を見て愕然、意に反し、見事なまでに削除してしまってる...。

 このディレクトリは、一体何なのか調べてみると、Debian 管理者ハンドブック 5.2.2. 設定スクリプトによると「インストール済みパッケージの設定スクリプト」が全て含まれており、第2章 Debian パッケージ管理 2.5.9. dpkg コマンドによると「dpkgが作成するファイル」としてパッケージ名.conffiles/.list/.md5sums/.preinst/.postinst/.prerm等があるとのこと。

dpkg: error: unable to create new file '/var/lib/dpkg/info/format-new': No such file or directory
...
E: Sub-process /usr/bin/dpkg returned an error code (2)
...

 任意のパッケージをapt installやreinstallなどをしようとすると「dpkg: エラー: 新しいファイル '/var/lib/dpkg/info/format-new' を作成できません: そのようなファイルやディレクトリはありません」というエラーが出た。

 そこで、とりあえず、冒頭の通り、infoディレクトリとそこにformat-newファイルを作成することでエラーを回避。

 が、今度は、「dpkg: 警告: パッケージ 'xxx' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします」という警告が多発。

 この時、任意のパッケージのインストールはできたかに見え、起動もできるものの、メニューや起動後のアイコンなど不完全な状態で登録されているように見える状況に。

debian:~$ for package in $(dpkg -l | awk '/^ii/ {print $2}');do sudo apt -y --reinstall install $package;done
...
debian:~$

 これってインストール済みパッケージを全部再インストールすれば、/var/lib/dpkg/infoも復活するだろうと、dpkg -lを元にしたとあるワンライナーを書いてやってみると、なんと5時間半程度もかかった...割りには解消せず。

 dpkg --configure -aとしてもapt updateしても何も起こらない。

debian:~$ sudo dpkg --audit
以下のパッケージは、データベース中に list 制御ファイルが見つかりません。
再インストールする必要があります:
cpp-6        GNU C preprocessor
gcc-6        GNU C compiler
gcc-6-base:amd64   GCC, the GNU Compiler Collection (base package)
gir1.2-gnomekeyring-1.0 GNOME keyring services library - introspection data
git-core       fast, scalable, distributed revision control system (obso
gksu         graphical front-end to su and sudo
libasan3:amd64   AddressSanitizer -- a fast memory error detector
libavcodec57:amd64 FFmpeg library with de/encoders for audio/video codecs -
libavutil55:amd64  FFmpeg library with functions for simplifying programming
libbonobo2-0:amd64 Bonobo CORBA interfaces library
libbonobo2-common  Bonobo CORBA interfaces library -- support files
libbonoboui2-0:amd64 Bonobo UI library - runtime
libbonoboui2-common Bonobo UI library - common files
libcryptsetup4:amd64 disk encryption support - shared library
libdns-export162   Exported DNS Shared Library
libgcc-6-dev:amd64 GCC support library (development files)
libgdbm3:amd64   GNU dbm database routines (runtime version)
libgksu2-0     library providing su and sudo functionality
libgnome-2-0:amd64 The GNOME library - runtime files
libgnome-keyring-common GNOME keyring services library - data files
libgnome-keyring0:amd64 GNOME keyring services library
libgnome2-common   The GNOME library - common files
libgnomeui-0:amd64 GNOME user interface library - runtime files
libgnomeui-common  GNOME user interface library - common files
libgnomevfs2-0:amd64 GNOME Virtual File System (runtime libraries)
libgnomevfs2-common GNOME Virtual File System (common files)
libgnomevfs2-extra:amd64 GNOME Virtual File System (extra modules)
libgtop-2.0-10:amd64 gtop system monitoring library (shared)
libisc-export160   Exported ISC Shared Library
libisl15:amd64   manipulating sets and relations of integer points bounded
liblogging-stdlog0:amd64 easy to use and lightweight logging library
libmpfr4:amd64   multiple precision floating-point computation
liborbit-2-0:amd64 high-performance CORBA implementation - common libraries
libprocps6:amd64   library for accessing process information from /proc
libsndio6.1:amd64  Small audio and MIDI framework from OpenBSD, runtime libr
libssl1.0.2:amd64  Secure Sockets Layer toolkit - shared libraries
libswresample2:amd64 FFmpeg library for audio resampling, rematrixing etc. - r
libunistring0:amd64 Unicode string library for C
libva-drm1:amd64   Video Acceleration (VA) API for Linux -- DRM runtime
libva-x11-1:amd64  Video Acceleration (VA) API for Linux -- X11 runtime
libva1:amd64     Video Acceleration (VA) API for Linux -- runtime
libvpx4:amd64    VP8 and VP9 video codec (shared library)
libwebpmux2:amd64  Lossy compression of digital photographic images.
libx264-148:amd64  x264 video coding library
libx265-95:amd64   H.265/HEVC video stream encoder (shared library)
linux-headers-4.19.0-5-amd64 Header files for Linux 4.19.0-5-amd64
linux-headers-4.19.0-5-common Common header files for Linux 4.19.0-5
linux-image-4.19.0-5-amd64 Linux 4.19 for 64-bit PCs (signed)
openjdk-8-jre:amd64 OpenJDK Java runtime, using Hotspot JIT
openjdk-8-jre-headless:amd64 OpenJDK Java runtime, using Hotspot JIT (headless)
paman        PulseAudio Manager
partimage      backup partitions into a compressed image file
perl-modules-5.24  Core Perl modules
phoronix-test-suite An Automated, Open-Source Testing Framework
php7.0-cli     command-line interpreter for the PHP scripting language
php7.0-common    documentation, examples and common module for PHP
php7.0-json     JSON module for PHP
php7.0-opcache   Zend OpCache module for PHP
php7.0-readline   readline module for PHP
php7.0-xml     DOM, SimpleXML, WDDX, XML, and XSL module for PHP
swftools       Collection of utilities for SWF file manipulation/creatio
transfig       transitional dummy package for fig2dev
debian:~$

 dpkg --auditしてみたら、検査にひっかかってるパッケージが結構ある。

debian:~$ sudo dpkg -P paman
dpkg: 警告: パッケージ 'linux-headers-4.19.0-5-amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libbonoboui2-0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'gksu' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'liblogging-stdlog0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnome2-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'php7.0-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libasan3:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'swftools' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'git-core' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'php7.0-cli' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'transfig' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'perl-modules-5.24' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libssl1.0.2:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'cpp-6' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libsndio6.1:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgdbm3:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libprocps6:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'gir1.2-gnomekeyring-1.0' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'php7.0-readline' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libva1:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'openjdk-8-jre:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libx264-148:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libunistring0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libbonobo2-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'partimage' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libmpfr4:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libswresample2:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libx265-95:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libbonoboui2-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libisl15:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'php7.0-json' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'linux-headers-4.19.0-5-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libavcodec57:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libbonobo2-0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libva-drm1:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnomevfs2-extra:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgksu2-0' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'openjdk-8-jre-headless:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libavutil55:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'gcc-6-base:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnomeui-0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libisc-export160' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'php7.0-xml' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnomevfs2-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libva-x11-1:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'gcc-6' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnome-keyring0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnomevfs2-0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnomeui-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libcryptsetup4:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgcc-6-dev:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'phoronix-test-suite' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libwebpmux2:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgtop-2.0-10:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libvpx4:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libdns-export162' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'paman' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'liborbit-2-0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnome-keyring-common' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'libgnome-2-0:amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'linux-image-4.19.0-5-amd64' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
dpkg: 警告: パッケージ 'php7.0-opcache' のファイル一覧ファイルがありません。このパッケージには、現在インストールされているファイルがないものとします
(データベースを読み込んでいます ... 現在 306912 個のファイルとディレクトリがインストールされています。)
paman (0.9.4-1+b3) を削除しています ...
debian:~$

 サンプルとしてそこに載っている内、任意のpamanをdpkg -Pしてみたら、例の警告メッセージがズラーッと列挙され、最後に「...を削除しています」と出ているが、途中で終わっている感じ(、と思ったのは、勘違い、apt purgeと同じでこの時点で削除されていたっぽい)。

 代わりに警告メッセージに出ているパッケージをapt reinstall(install --reinstall)すれば良いのかとやってみるが、今度は、「...はダウンロードできないため、再インストールは不可能です。」なんてエラーが表示されてダメ。

 もちろん、回線はつながっているし、apt-cache searchすれば、存在するパッケージ。

 ならばと、apt purge(remove --purge)してみたら、apt --audit結果から消えている!(dpkg -Pの時点で消えてたっぽいから、どっちでもよさ気。)

 いくらでもあるので、その後、いくつか試してみると、やはり、apt --audit結果から消えている!

debian:~$ sudo dpkg --audit
debian:~$

 よっしゃ!ということで冒頭のワンライナーを実行してみるとapt --audit件数は0となり、その後、何事もなく、解決した次第。

(そう見えるだけじゃないよね?)

 よって一通り、インストール済みパッケージをreinstallしてから、その上で検査にひっかかるパッケージをpurgeすればよいと...、というわけで冒頭の解決策にたどり着いた次第。

アホな振る舞い

 ここで、やめておけばよいものを、確認含め人柱的に/var/lib/dpkg/infoをmvしてdpkg -lリストからのreinstallをせずに、dpkg -auditからのpurgeをいきなりやってみました。

 すると、どうやら、このpurge作業も、流れ行くログを見る限り、reinstallもやっているように見受けられました...が、勘違いだったようです。

 なぜか、2時間半程度で終了...したものの、「これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。」「以下のパッケージには満たせない依存関係があります:」といったメッセージが多発...。

 dpkg --auditしてみると実行前と同一か否かは不明も大量にヒット...。

 というわけで、--fix-brokenつけて実行...と思いつつ、その前に何を血迷ったのか[Alt]+[F2]、[r]+[Enter]でメニューを更新したらPCがフリーズ...それもそのはず、この時点でdpkg --auditにはたくさんのパッケージがあったのだから...。

 うーむ、Debianメニューからrecovery modeで入ってCLI起動、果たして再インストールを回避しつつ、復旧できるのか...。

[2019/11/23]

 確認作業で成功例を試さなかったばっかりに結局、インストーラ作ってインストールし直しました。

LINK

ホーム前へ次へ