CentOS6 を CentOS7 に強制アップデートしたり、 パッケージのインストール、アンインストール時にrpm オプションの–nodeps(依存関係を無視) オプションを多用していると RPM のデータベースがおかしくなる事があります。
# rpm -q vsftpd vsftpd-3.0.2-21.el7.x86_64 vsftpd-3.0.2-22.el7.x86_64
こんな時に、有効なのが package-cleanup コマンドです。package-cleanup を –dupes オプションを使用し実行すると、ダブってインストールされているパッケージを表示してくれます。
# package-cleanup --dupes 読み込んだプラグイン:fastestmirror vsftpd-3.0.2-21.el7.x86_64 vsftpd-3.0.2-22.el7.x86_64 # rpm -q vsftpd vsftpd-3.0.2-21.el7.x86_64 vsftpd-3.0.2-22.el7.x86_64
package-cleanup –cleandupes で古いパッケージを自動削除してくれますが、まれにアンインストール出来ない場合があります。
# package-cleanup --cleandupes Setting up yum Loaded plugins: refresh-packagekit I will remove the following old duplicate packages: vsftpd-3.0.2-21.el7.x86_64 Is this ok [y/N]: y /var/tmp/rpm-tmp.M40TcK: line 5: abc: コマンドが見つかりません error: %preun(vsftpd-3.0.2-21.el7.x86_64) scriptlet failed, exit status 127 <- アンインストールスクリプトのエラー
ログを見ると、パッケージアンインストール時に実行されるスクリプト(%preun pre uninstall )が異常終了しアンインストールが失敗しています。そんなときは、rpm の –noscripts を使用し、アンインストール時に実行されるスクリプトを抑制し、アンインストールを行う事が出来ます。
# rpm -e vsftpd-3.0.2-21.el7.x86_64 --noscripts # rpm -q vsftpd vsftpd-3.0.2-22.el7.x86_64
次に RPM データベースの依存関係をわざと壊してみましょう。まず bind-libs のアンインストールを試みます。しかし依存関係の問題でアンインストールが出来ませんが、–nodeps を使用し、強制的にアンインストールを行います。その後、RPM データベースの問題箇所を自動検出してくれる –problems オプションを使用し package-cleanup を実行すると、rpm -e bind-libs で表示された問題が package-cleanup –problems でも表示される事が分かります。
# rpm -e bind-libs エラー: 依存性の欠如: bind-libs = 32:9.9.4-51.el7_4.1 は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libbind9.so.90()(64bit) は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libdns.so.100()(64bit) は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libisc.so.95()(64bit) は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libisccc.so.90()(64bit) は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libisccfg.so.90()(64bit) は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています liblwres.so.90()(64bit) は (インストール済み)bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています # rpm -e bind-libs --nodeps # package-cleanup --problems 読み込んだプラグイン:fastestmirror Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: bind-libs = ('32', '9.9.4', '51.el7_4.1') Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: libbind9.so.90()(64bit) Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: libdns.so.100()(64bit) Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: libisc.so.95()(64bit) Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: libisccc.so.90()(64bit) Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: libisccfg.so.90()(64bit) Package 32:bind-9.9.4-51.el7_4.1.x86_64 は次の要求が不足ています: liblwres.so.90()(64bit)