壊れたRPMのデータベース(DB)を修復

LINEで送る
Pocket

前回記事 rpm パッケージの設定ファイルを初期の設定に戻したい2

rpm パッケージのインストールを繰り返しているととまれに rpm のデータベースが壊れる事がある。パッケージインストール時にマシンが落ちたり、rpm コマンドがクラッシュしたり、フリーズしたり理由はいろいろあるかもしれないが、以下のメッセージが出力され続けるとパッケージの削除もアップデートもままならなくなる。

# rpm -ivh httpd-2.4.6-67.el7.centos.6.x86_64.rpm
pmdb: unable to join the environment
エラー: db4 エラー (11) (dbenv->open において): リソースが一時的に利用できません
エラー: Packages インデックスを db3 でオープンできません - リソースが一時的に利用できません (11)
エラー: /var/lib/rpm にある Package データベースをオープンできません。

rpm のデータベースは、/var/lib/rpm/ に Berkeley DB というデータベースの形式で保存されている。これらのファイルが壊れると上記メッセージが表示されてしまいます。

$  file /var/lib/rpm/*
/var/lib/rpm/Basenames:    Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Conflictname: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Dirnames:     Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Group:        Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Installtid:   Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Name:         Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Obsoletename: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Packages:     Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Providename:  Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Requirename:  Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sha1header:   Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sigmd5:       Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Triggername:  Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/__db.001:     Applesoft BASIC program data
/var/lib/rpm/__db.002:     386 pure executable not stripped
/var/lib/rpm/__db.003:     386 pure executable not stripped

しかし rpm には、–rebuilddb というオプションが用意されており、rpm のデータベースを再構築してくれるのである。

# rpm --rebuilddb

この方法で概ね上記エラーメッセージは表示されなくなるのですが、ファイルシステムが壊れたり、誤って /var/lib/rpm/ ディレクトリを削除してしまったりした場合はデータベースの再構築は不可能となります。そうなってしまった場合はシステムを再インストールする事をお勧めしますが、現在の環境でどうしても運用し続けたいというのであれば、–initdb を使用し rpm のデータベースを新規に再作成しましょう。なおデータベスの情報は新規に作成され、依存関係などの情報はもちろん空となっているので、パッケージをインストールする場合は、全て強制インストール(–nodeps)する以外方法はありません。

# rpm --initdb
#  rpm -Uvh httpd-2.4.6-67.el7.centos.6.x86_64.rpm --force
警告: httpd-2.4.6-67.el7.centos.6.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
エラー: 依存性の欠如:
	/etc/mime.types は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	system-logos >= 7.92.1-1 は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	httpd-tools = 2.4.6-67.el7.centos.6 は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	/usr/sbin/useradd は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	/usr/sbin/groupadd は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	systemd-units は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	/bin/sh は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	libapr-1.so.0()(64bit) は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
	libaprutil-1.so.0()(64bit) は httpd-2.4.6-67.el7.centos.6.x86_64 に必要とされています
          :
# rpm -ivh httpd-2.4.6-67.el7.centos.6.x86_64.rpm --force --nodeps
警告: httpd-2.4.6-67.el7.centos.6.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID f4a80eb5: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:httpd-2.4.6-67.el7.centos.6      ################################# [100%]

–rebuilddb : インストールされているパッケージのへッダーから rpm のデータベースを再作成する。
–initdb : 新たに rpm のデータベースを作成する。

LINEで送る
Pocket

  • このエントリーをはてなブックマークに追加

アマゾン

LINEで送る
Pocket

記事が面白かった。為になったと思ったら。下記リンクより商品を購入頂くと筆者は喜び記事を更新致します。


LINEで送る
Pocket

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください