yum updateのエラー対処

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

~ 中略 ~

完了しました!

実際には、実行していないのでうまくいけばいいのですが…

もし削除されていないものがあれば、個別に削除していけばいいかと思います。

いいね! & シェア お願いします。

コメントは受け付けていません。