ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

CentOS7 yum, rpmdb復旧でも直らないのを解決する方法

CentOS7
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。※ CentOSのロゴはcentos.orgの商標です。当サイトがCentOS公認を示すものではありません。

yumコマンドが使えなくなったとき、よく見るrpmdbを復旧する方法をしてみたんですがダメでした。

いろいろ検索かけても解決方法は見つからず自力でなんとかした記録です。

(やってることはシンプルなんだけど、全部自分で意味を考えながらやったのでどっと疲れた。)

CentOS7.8.2003
作業OSのバージョン

CentOSは、パッケージ(アプリ)の追加・更新・削除でyumコマンドを使います。

どうやらrpmdbが壊れたようで実行できません。そこでそれを修正しました。

(エラーログもあり。)

HDDがそろそろ寿命なのか、

またrpmdbが壊れる。

rpmdbを直す。

しばらくして、またrpmdbが壊れる。

の無限ループ。そしてしまいには、

yum update
読み込んだプラグイン:fastestmirror
Determining fastest mirrors


 One of the configured repositories failed (不明),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/$releasever/x86_64

こんなエラーが出てrpmdb復旧ではどうにもならなくなりました。

出ているメッセージの内容は、

『リポジトリがおかしいから、無効化して原因を探ってね?』

そしてもうひとつ、

『base/$releasever/x86_64のリポジトリが見つからない。』

ウソーーん。CentOSの根幹中の根幹のリポジトリが見つからないって。どういうこと?

リポジトリ・リストを見てみる

リポジトリを見てみろっていうので、リポジトリのリストを出してみます。

yum repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
リポジトリー ID                                リポジトリー名                                                        状態
base/$releasever/x86_64                        CentOS-$releasever - Base                                             0
epel/x86_64                                    Extra Packages for Enterprise Linux $releasever - x86_64              0
extras/$releasever/x86_64                      CentOS-$releasever - Extras                                           0
groonga-centos/$releasever/x86_64              Groonga for CentOS $releasever - x86_64                               0
kusanagi                                       KUSANAGI RPM packages                                                 0
mariadb                                        MariaDB                                                               0
mongodb-org-4.2/$releasever                    MongoDB Repository                                                    0
updates/$releasever/x86_64                     CentOS-$releasever - Updates                                          0
zabbix/x86_64                                  Zabbix Official Repository - x86_64                                   0
zabbix-non-supported/x86_64                    Zabbix Official Repository non-supported - x86_64                     0
repolist: 0

おかしいのは2点。

リポジトリの状態が0。リポジトリ・リスト数が0

変数$releaseverの値が出てない。変数もろ出し。

まったくリポジトリにアクセスできてません。ここで原因を予想しました。

『$releaserverの値が取れてないからエラーになってるんじゃないか?』

yumでOSバージョンを確認

変数$releaseverの値を確認します。

yum info centos-release
読み込んだプラグイン:fastestmirror
Determining fastest mirrors


 One of the configured repositories failed (不明),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/$releasever/x86_64

OSのバージョンが取れてない。また同じメッセージが。ここで、$releaseverが犯人だと特定しました。

(100%の確証ではないが。)

どうやって解決するか?

じゃあ、どうやって直すか? ここで矛盾があることに気づきます。

$releaseverが取れてないからリポジトリ・リストが作れない。

リポジトリがおかしいから 'yum info centos-release'が表示されない。($releaseverに値が入らない。)

『DBのデッドロックみたいになってるじゃん。直せねーよ。』

ここでボクは逃げました。3週間の放置。システムイメージのバックアップからOS丸ごと切り替えようかと考える始末。

(DBのリカバリも必要でけっこう大掛かりだったので放置という結果に...)

ボクの感想と態度はどうでもいいですね?

結果、OSのドキュメントに書いていない、ネットで探しても見つからなかった方法で解決しました。

リポジトリ設定ファイルの変更

『もし$releaseverが犯人なら、リポジトリ設定で$releaseverを使わなければいいじゃん』ってことで、リポジトリの設定を変更します。

変更ファイル/etc/yum.repos.d/CentOS-Base.repo

ファイルのバックアップを取っておきましょう。あとで元に戻します。

CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

CentOSってbaseurlを使わないんですね? コメント化されてます。

baseurlのコメントを外して、$releaseverに直接OSのバージョンを入れます。

変更後の設定
[base]
name=CentOS-7 - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://mirror.centos.org/centos/7/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

バージョンはgpgkeyに書いてあるところから判断してもいいですが、きちんとするならバージョンファイルを確認します。

バージョンファイル/etc/centos-release
centos-release
CentOS Linux release 7.8.2003 (Core)

updates, extras, centosplusも同じように変更して、リポジトリ・リストを表示します。

yum repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
リポジトリー ID                                リポジトリー名                                                        状態
base/7/x86_64                                  CentOS-7 - Base                                                         10,072
epel/x86_64                                    Extra Packages for Enterprise Linux 7 - x86_64                        13,484+1
extras/7/x86_64                                CentOS-7 - Extras                                                          448
groonga-centos/$releasever/x86_64              Groonga for CentOS $releasever - x86_64                                      0
kusanagi                                       KUSANAGI RPM packages                                                      350
mariadb                                        MariaDB                                                                     43
mongodb-org-4.2/$releasever                    MongoDB Repository                                                           0
updates/7/x86_64                               CentOS-7 - Updates                                                         775
zabbix/x86_64                                  Zabbix Official Repository - x86_64                                        456
zabbix-non-supported/x86_64                    Zabbix Official Repository non-supported - x86_64                            4
repolist: 28,774

リポジトリ・リストが取れてる。ほかにも$releaseverを使ってるリポジトリがあるので、同じように変更します。

/etc/yum.repos.d/groonga-centos.repoOSのリポジトリ
/etc/yum.repos.d/MongoDB.repo自作。

バージョンが取れてるか確認します。

yum info centos-release
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
インストール済みパッケージ
名前                : centos-release
アーキテクチャー    : x86_64
バージョン          : 7
リリース            : 9.2009.1.el7.centos
容量                : 44 k
リポジトリー        : installed
提供元リポジトリー  : updates
要約                : CentOS Linux release file
ライセンス          : GPLv2
説明                : CentOS Linux release files

直ってますね?

変更したリポジトリファイルはすべて元に戻しましょう。$releaseverも取れてるので大丈夫です。

やってみると簡単だったのに、なんかどっと疲れた。

前の投稿
CentOS7, yum updateでrpmdbが壊れたのを直す方法
CentOSは8の早期終了で運用では使えなくなるか?今後はCentOS Streamに一本化。
次の投稿
コメントを残す

*