CentOS7.9でyum update時に「の複製です」などのエラーで処理が失敗した際の対処備忘録です。

◆エラー内容
# yum update ~ 略 ~ エラー: パッケージ: glibc-devel-2.17-323.el7_9.x86_64 (@updates) 要求: glibc-headers = 2.17-323.el7_9 削除中: glibc-headers-2.17-323.el7_9.x86_64 (@updates) glibc-headers = 2.17-323.el7_9 次のものにより更新された: : glibc-headers-2.17-324.el7_9.x86_64 (updates) glibc-headers = 2.17-324.el7_9 利用可能: glibc-headers-2.17-317.el7.x86_64 (base) glibc-headers = 2.17-317.el7 利用可能: glibc-headers-2.17-322.el7_9.x86_64 (updates) glibc-headers = 2.17-322.el7_9 問題を回避するために --skip-broken を用いることができます。 ** Found 22 pre-existing rpmdb problem(s), 'yum check' output follows: 7:device-mapper-1.02.170-6.el7_9.3.x86_64 は次の要求が不足ています: device-mapper-libs = ('7', '1.02.170', '6.el7_9.3') 7:device-mapper-1.02.170-6.el7_9.4.x86_64 は 7:device-mapper-1.02.170-6.el7_9.3.x86_64 の複製です 7:device-mapper-1.02.170-6.el7_9.4.x86_64 は次の要求が不足ています: device-mapper-libs = ('7', '1.02.170', '6.el7_9.4') 7:device-mapper-1.02.170-6.el7_9.5.x86_64 は 7:device-mapper-1.02.170-6.el7_9.4.x86_64 の複製です 7:device-mapper-event-1.02.170-6.el7_9.3.x86_64 は次の要求が不足ています: device-mapper-event-libs = ('7', '1.02.170', '6.el7_9.3') 7:device-mapper-event-1.02.170-6.el7_9.4.x86_64 は 7:device-mapper-event-1.02.170-6.el7_9.3.x86_64 の複製です 7:device-mapper-event-1.02.170-6.el7_9.4.x86_64 は次の要求が不足ています: device-mapper-event-libs = ('7', '1.02.170', '6.el7_9.4') 7:device-mapper-event-1.02.170-6.el7_9.5.x86_64 は 7:device-mapper-event-1.02.170-6.el7_9.4.x86_64 の複製です glibc-devel-2.17-323.el7_9.x86_64 は次の要求が不足ています: glibc = ('0', '2.17', '323.el7_9') glibc-devel-2.17-324.el7_9.x86_64 は glibc-devel-2.17-323.el7_9.x86_64 の複製です glibc-devel-2.17-324.el7_9.x86_64 は次の要求が不足ています: glibc-headers = ('0', '2.17', '324.el7_9') glibc-headers-2.17-323.el7_9.x86_64 は次の要求が不足ています: glibc = ('0', '2.17', '323.el7_9') kexec-tools-2.0.15-51.el7_9.2.x86_64 は kexec-tools-2.0.15-51.el7_9.1.x86_64 の複製です libwbclient-4.10.16-9.el7_9.x86_64 は次の要求が不足ています: samba-client-libs = ('0', '4.10.16', '9.el7_9') libwbclient-4.10.16-13.el7_9.x86_64 は libwbclient-4.10.16-9.el7_9.x86_64 の複製です 7:lvm2-2.02.187-6.el7_9.3.x86_64 は次の要求が不足ています: lvm2-libs = ('7', '2.02.187', '6.el7_9.3') 7:lvm2-2.02.187-6.el7_9.4.x86_64 は 7:lvm2-2.02.187-6.el7_9.3.x86_64 の複製です 7:lvm2-2.02.187-6.el7_9.4.x86_64 は次の要求が不足ています: lvm2-libs = ('7', '2.02.187', '6.el7_9.4') 7:lvm2-2.02.187-6.el7_9.5.x86_64 は 7:lvm2-2.02.187-6.el7_9.4.x86_64 の複製です mdadm-4.1-7.el7_9.x86_64 は mdadm-4.1-6.el7.x86_64 の複製です systemd-219-78.el7_9.2.x86_64 は次の要求が不足ています: systemd-libs = ('0', '219', '78.el7_9.2') systemd-219-78.el7_9.3.x86_64 は systemd-219-78.el7_9.2.x86_64 の複製です
◆原因
パッケージの複数バージョンが重複(duplicate)しているのが原因のようです。
◆対処方法
結果として、複数あるもの削除して1つ(通常は、最新バージョン)にする。
今回は試行錯誤の上、解決したので色々と実施しています。
下記、詳細では実際の実施順に書いています。
そんな中で、どう対処するのがベストなのかを考えたいと思います。
◆詳細
エラー内容で表示されたパッケージを上から対処して行きます。
・glibc-develの削除
# rpm -qa | grep glibc glibc-2.17-324.el7_9.x86_64 glibc-common-2.17-324.el7_9.x86_64 glibc-headers-2.17-323.el7_9.x86_64 glibc-devel-2.17-324.el7_9.x86_64 glibc-devel-2.17-323.el7_9.x86_64 # rpm -e --nodeps --allmatches --justdb glibc-devel # rpm -q glibc-devel パッケージ glibc-devel はインストールされていません。
1行目:「rpm」コマンドの問い合わせで「glibc」関連パッケージを表示
5,6行目:「glibc-devel」が複数バージョンあるのを確認
8行目:「-e」オプションで削除するが、併せて「–nodeps」で依存関係を無視し、「–allmatches」でパッケージ名に一致するすべてのバージョンを削除し、「–justdb」でデータベースを更新するオプションを追加
9行目:確認
・glibc-develの再インストール
# yum list glibc-devel 読み込んだプラグイン:langpacks, versionlock 利用可能なパッケージ glibc-devel.i686 2.17-324.el7_9 updates glibc-devel.x86_64 2.17-324.el7_9 updates # yum install glibc-devel.x86_64
1行目:「glibc-devel」を削除したため、リストで確認
6行目:利用可能パッケージを確認し、再インストール
・重複確認コマンド
# yum check duplicates 読み込んだプラグイン:langpacks, versionlock 7:device-mapper-1.02.170-6.el7_9.4.x86_64 は 7:device-mapper-1.02.170-6.el7_9.3.x86_64 の複製です 7:device-mapper-1.02.170-6.el7_9.5.x86_64 は 7:device-mapper-1.02.170-6.el7_9.4.x86_64 の複製です 7:device-mapper-event-1.02.170-6.el7_9.4.x86_64 は 7:device-mapper-event-1.02.170-6.el7_9.3.x86_64 の複製です 7:device-mapper-event-1.02.170-6.el7_9.5.x86_64 は 7:device-mapper-event-1.02.170-6.el7_9.4.x86_64 の複製です 7:lvm2-2.02.187-6.el7_9.4.x86_64 は 7:lvm2-2.02.187-6.el7_9.3.x86_64 の複製です 7:lvm2-2.02.187-6.el7_9.5.x86_64 は 7:lvm2-2.02.187-6.el7_9.4.x86_64 の複製です mdadm-4.1-7.el7_9.x86_64 は mdadm-4.1-6.el7.x86_64 の複製です systemd-219-78.el7_9.3.x86_64 は systemd-219-78.el7_9.2.x86_64 の複製です エラー: check ['duplicates']
1行目:rpmdbをチェックして、重複しているリストを出力する
「glibc-devel」は、解決したので出力されなくなりました。
# package-cleanup --dupes
「yum-utils」をインストールしていると、同じようにこのコマンドでも確認ができます。
「yum-utils」は、yumに関する管理などに役立つユーティリティパッケージです。
・重複パッケージの削除
# yum remove device-mapper-1.02.170-6.el7_9.3.x86_64 device-mapper-1.02.170-6.el7_9.4.x86_64 # yum remove lvm2-2.02.187-6.el7_9.3.x86_64 lvm2-2.02.187-6.el7_9.4.x86_64 # yum remove mdadm-4.1-6.el7.x86_64 systemd-219-78.el7_9.2.x86_64
「glibc-devel」の要領だと同名のパッケージをすべて削除し、再度インストールしていたので手間がかかります。
今回は、重複パッケージもそれほど多くないので、それぞれを削除していきます。
要領として、重複確認で出力されたリストから、「〇〇は△△の複製です」とある「△△」のパッケージ名を削除します。
そうすることで、最新のバージョンのみが残ることになります。
・重複確認
# yum check duplicates 読み込んだプラグイン:langpacks, versionlock check ['duplicates']
解決され、出力されなくなりました。
・アップデート
# yum update ~ 中略 ~ 完了しました!
再度yum updateを実行し、無事完了しました。
◆対処方法の再考
今回、取り急ぎ対処したので効率のよくない方法でした。
後で色々調べると「yum-utils」に便利なコマンドがありました。
途中でも紹介した重複確認の別法「package-cleanup」です。
# package-cleanup -- --all --disableexcludes --errorlevel --nogpgcheck --randomwait --assumeno --disableincludes --exclude --noplugins --releasever --assumeyes --disableplugin --exclude-bin --noscripts --rpmverbosity --cacheonly --disablerepo --exclude-devel --obsoletes --setopt --cleandupes --downloaddir --help --oldkernels --showduplicates --color --downloadonly --installroot --orphans --skip-broken --config --dupes --keepdevel --problems --tolerant --count --enableplugin --leaf-regex --queryformat --verbose --debuglevel --enablerepo --leaves --quiet --version
「package-cleanup」で入力補完すると「–」が保管されもう一度「Tab」補完すると引数の一覧が表示されます。
先ほど使用した「dupes」は重複の確認ができる引数でしたが、「cleandupes」引数を使用すると重複の確認をしたうえで、古いバージョンを削除までしてくれるというものです。
この引数で実行していたらすぐに解決していたことと思います。
順序として、次のとおり実施するといいと思います。
1 エラー発生
# yum update エラー: ~ 中略 ~ 問題を回避するために --skip-broken を用いることができます。 ** Found XX pre-existing rpmdb problem(s), 'yum check' output follows: XXXXX は XXXXX の複製です
2 重複確認と削除
# package-cleanup --cleandupes 読み込んだプラグイン:langpacks, versionlock ~ 略 ~
3 重複確認
# package-cleanup --dupes 読み込んだプラグイン:langpacks, versionlock
4 再度アップデート
# yum update ~ 中略 ~ 完了しました!
実際には、実行していないのでうまくいけばいいのですが…
もし削除されていないものがあれば、個別に削除していけばいいかと思います。