CentOSで破損したRPMデータベースを再構築する方法


RPM データベースは、 CentOS /var/lib/rpm/ディレクトリおよびなどの他のエンタープライズLinuxディストリビューションの下のファイルで構成されています。 > RHEL openSUSE Oracle Linux など。

RPM データベースが破損していると、 RPM が正しく機能しなくなり、システムにアップデートを適用できなくなります。YUMパッケージマネージャでシステム上のパッケージをアップデートする際にエラーが発生します。最悪のシナリオは、rpmと yum コマンドを正常に実行できないことです。

不完全な以前のトランザクション、特定のサードパーティ製ソフトウェアのインストール、特定のパッケージの削除など、RPMデータベースの破損につながる可能性のある要素は多数あります。

この記事では、破損したRPMデータベースを再構築する方法を説明します。これにより、CentOSのRPMデータベースの破損から回復することができます。これにはrootユーザー特権が必要です。それ以外の場合は、sudoコマンドを使用してそれらの特権を取得します。

CentOSで破損したRPMデータベースを再構築する

次のコマンドを使用して、先に進む前に現在のRPMデータベースをバックアップすることから始めます(将来必要になるかもしれません)。

# mkdir /backups/
# tar -zcvf /backups/rpmdb-$(date +"%d%m%Y").tar.gz  /var/lib/rpm

次に、マスターパッケージのメタデータファイル/var/lib/rpm/Packages の整合性を確認します。これは再構築が必要なファイルですが、以下のコマンドを使用して古いロックを防ぐために/var/lib/rpm/__ db * ファイルを最初に削除します。

# rm -f /var/lib/rpm/__db*		
# /usr/lib/rpm/rpmdb_verify /var/lib/rpm/Packages

上記の操作が失敗した場合、まだエラーが発生することを意味しているので、新しいデータベースをダンプしてロードする必要があります。次のようにして、新たにロードされたPackagesファイルの整合性も確認します。

# cd /var/lib/rpm/
# mv Packages Packages.back
# /usr/lib/rpm/rpmdb_dump Packages.back | /usr/lib/rpm/rpmdb_load Packages
# /usr/lib/rpm/rpmdb_verify Packages

データベースのヘッダーを確認するには、 -q および -a フラグを使用してすべてのインストール済みパッケージをクエリし、に送信されたエラーを慎重に確認しますstderror

# rpm -qa >/dev/null	#output is discarded to enable printing of errors only

大事なことを言い忘れましたが、次のコマンドを使ってRPMデータベースを再構築してください。

# rpm -vv --rebuilddb

RPMデータベースを検出して修正するためにdcrpmツールを使用する

また、RPMデータベースの破損に関連した既知の問題の特定と修正に使用される dcrpm (rpmの検出と修正)コマンドラインツールも発見しました。それはあなたがオプションなしで実行することができるシンプルで使いやすいツールです。効果的で信頼できる使い方のために、あなたはcronを通してそれを定期的に実行するべきです。

あなたはソースからそれをインストールすることができます。ソースツリーをダウンロードして、 setup.py pypi から psutil 依存関係を取得する必要があります)を使用してインストールします。

# git clone https://github.com/facebookincubator/dcrpm.git
# cd dcrpm
# python setup.py install

dcrpm をインストールしたら、図のように実行します。

# dcrpm

最後に、失敗したrpmコマンドまたはyumコマンドをもう一度実行して、すべてが正常に機能しているかどうかを確認します。

RPMデータベースのリカバリページからより多くの情報を見つけることができます。

それで全部です!この記事では、CentOSで破損したRPMデータベースを再構築する方法を説明しました。このガイドについて質問したり、考えを共有したりするには、以下のフィードバックフォームを使用してください。