yumコマンドが使えなくなったとき、よく見るrpmdbを復旧する方法をしてみたんですがダメでした。
いろいろ検索かけても解決方法は見つからず自力でなんとかした記録です。
(やってることはシンプルなんだけど、全部自分で意味を考えながらやったのでどっと疲れた。)
CentOS | 7.8.2003 |
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 |
ファイルのバックアップを取っておきましょう。あとで元に戻します。
[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 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.repo | OSのリポジトリ |
/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も取れてるので大丈夫です。
やってみると簡単だったのに、なんかどっと疲れた。