miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

yum 実行時に「Error performing checksum」エラー

この中で kernel.org の yum リポジトリから git を入れるくだりがありましたが、いつからかこんなエラーになってました。

[root@localhost ~]# yum install git-1.5.6.1-1 --enablerepo=rpmforge
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: ftp.yz.yamagata-u.ac.jp
 * base: ftp.yz.yamagata-u.ac.jp
 * extras: ftp.yz.yamagata-u.ac.jp
 * rpmforge: apt.sw.be
 * updates: ftp.yz.yamagata-u.ac.jp
git/primary                                                        | 144 kB     00:02
http://www.kernel.org/pub/software/scm/git/RPMS/i386/repodata/primary.xml.gz: [Errno -3] Error performing checksum
Trying other mirror.
Error: failure: repodata/primary.xml.gz from git: [Errno 256] No more mirrors to try.

このエラーについて、調べたことを色々と。

(2011-04-06 追記)
元 URL には追記していますが、CentOS で Git をインストールしたいだけであれば、kernel.org から入れずに Webtatic.com から入れたほうが楽ですし、バージョンも新しいものが入ります。うろ覚えですが、当時 rpmforge から入れずにわざわざ kernel.org から入れていたのは、rpmforge でインストールされるバージョンにドキュメントが付加されていなかったからだったと思います。
(追記ここまで)

解決方法

先に解決方法を書いておくと、Python の hashlib をインストールするとエラーが発生しなくなります。(i386 の部分は環境に合わせて変えてください。)

wget http://skvidal.fedorapeople.org/hashlib/python-hashlib-20081119-2.i386.rpm
rpm -ivh python-hashlib-20081119-2.i386.rpm

環境によっては、hashlib を入れても

http://www.kernel.org/pub/software/scm/git/RPMS/i386/repodata/primary.xml.gz: [Errno -1] Metadata file does not match checksum
Trying other mirror.
Error: failure: repodata/primary.xml.gz from git: [Errno 256] No more mirrors to try.

こんなエラーになってしまうケースがありましたが、

yum clean all

すると解決しました。

また、別の環境では、

No package git-1.5.6.1-1 available.
Nothing to do

こんなメッセージが出たりしたので、この場合は kernel.org の priority を上げてやるとよいです。

/etc/yum.repos.d/git.repo の末尾に

priority=1

を追加して、/etc/yum.repos.d/rpmforge.repo の末尾に

priority=10

を追加する感じで。

もう少し細かい情報

エラーの原因

問題解決の糸口はここでした。

Dealing with yum checksum errors

  • 「Error performing checksum」エラーは repomd.xml で指定されたアルゴリズムに対応していない場合に発生する
  • Fedora 11 では createrepo のデフォルトが sha256 になっているが、CentOS 5.3 の yum はこれに対応していない

とのことで。今回のエラーも似たような現象のような気がします。

ソースを読んでみる

上記のページ読んで初めて知ったんですが、yum って Python で書かれてたんですね。Python であればその場でソース読んで書き換えられるので、もう少しちゃんと調査してみます。

/usr/lib/python2.4/site-packages/yum/yumRepo.py の 1469 行目付近に、

        except Errors.RepoError, e:
            if check_can_fail:
                return None
            raise URLGrabError(-3, 'Error performing checksum')

こんな処理があったので、raise する直前に、

            import traceback
            print traceback.format_exc()

こんな処理を追加してみる。すると・・・

Traceback (most recent call last):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 366, in _checksum
    return misc.checksum(sumtype, file, CHUNK)
  File "/usr/lib/python2.4/site-packages/yum/misc.py", line 290, in checksum
    data = Checksums([sumtype])
  File "/usr/lib/python2.4/site-packages/yum/misc.py", line 215, in __init__
    raise MiscError, 'Error Checksumming, bad checksum type %s' % sumtype
MiscError: Error Checksumming, bad checksum type sha256

こんな感じで例外の詳細が出力されます。先ほどのページと同様、SHA256 に対応してないのが原因のようです。

また、エラーになっているファイル primary.xml.gz を解凍して primary.xml を見ると

<package type="rpm">
  <name>git</name>
  <arch>i386</arch>
  <version epoch="0" ver="1.5.6.1" rel="1"/>
  <checksum type="sha256" pkgid="YES">4824d70bbe5d523f2c83d2b25884e59444f1dd3087df9f522c4342fd383e6d8f</checksum>

のように SHA256 で checksum が書かれているようです。

SHA256 の対応

参考ページの人は自前リポジトリでの話なので SHA1 で createrepo し直したみたいですけど、kernel.org のほうを SHA1 で作り直してもらうわけにはいかないし・・・別の対応が行えないか調べてみます。

checksum を計算しているのは /usr/lib/python2.4/site-packages/yum/misc.py ですが、この先頭に

try:
    import hashlib
    _available_checksums = ['md5', 'sha1', 'sha256', 'sha512']
    _default_checksums = ['sha256']
except ImportError:
    # Python-2.4.z ... gah!
    import sha
    import md5
    _available_checksums = ['md5', 'sha1']
    _default_checksums = ['sha1']

こんな処理が入っていました。

によると、hashlib は Python 2.5 で追加されたモジュールで、SHA256 や SHA512 を使いたい場合はこのモジュールが必要ということらしいです。CentOS 5.4 に入っているのは 2.4.3 なので、SHA256 は使えないと。

Python 2.5 環境を準備してもいいんですが、yum で必要なモジュールを集めるのはそれなりに面倒らしいので、Python 2.4 で SHA256 を計算する方法を調べてみると、
sha, PyCrypto, SHA-256

You can download the python2.5 hashlib module for use with python2.4

とのことで。Python 2.4 に hashlib を入れちゃえばいいみたいです。

ソースから入れる方法もあるようですが、rpm があるようなので、こちらを使うことに。

で、冒頭の解決方法

wget http://skvidal.fedorapeople.org/hashlib/python-hashlib-20081119-2.i386.rpm
rpm -ivh python-hashlib-20081119-2.i386.rpm

に行きつきました。

試したけど効果がなかったもの その1: yum/rpm 関連ファイルの掃除

www.centos.org - Forums - CentOS 5 - General Support - Yum: Error performing checksum
あたりを参考に、

yum clean all
rm -f /var/lib/rpm/__db*
rpm --rebuilddb

も試したんですが、SHA256 の件は何も解決しませんでした。

試したけど効果がなかったもの その2: PGP キーのインポート

№1291 yumでアプリケーションのインストールが出来なくなりました - Web Patio - Fedoraで自宅サーバー構築

GPGキーをインポートしなおすと、正常にインストールを行うことが出来ました。

とのことだったので、GPG キーのインストールとやらをやってみます。

まず、GPG キーをインストールする前の状態で、エラーになっているファイルを取得して・・・

wget http://www.kernel.org/pub/software/scm/git/RPMS/i386/repodata/primary.xml.gz
wget http://www.kernel.org/pub/software/scm/git/RPMS/i386/repodata/primary.xml.gz.sign

PGP のチェックをしてみます。

[root@localhost ~]# gpg --verify primary.xml.gz.sign primary.xml.gz
gpg: ディレクトリー「/root/.gnupg」ができました
gpg: 新しい構成ファイル「/root/.gnupg/gpg.conf」ができました
gpg: 警告: 「/root/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/root/.gnupg/pubring.gpg」ができました
gpg: 20091224091101秒 JSTにDSA鍵ID 517D0F0Eで施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません

署名の検査に失敗していることがわかります。

ここに kernel.org の GPG キーをインストールする手順が書いているので、

[root@localhost ~]# gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
gpg: 鍵輪「/root/.gnupg/secring.gpg」ができました
gpg: 鍵517D0F0Eをhkpからサーバーwwwkeys.pgp.netに要求
gpg: /root/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵517D0F0E: 公開鍵“Linux Kernel Archives Verification Key <ftpadmin@kernel.org>”を 読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg:     処理数の合計: 1
gpg:           読込み: 1

という風にインストールして、再度チェックすると・・・

[root@localhost ~]# gpg --verify primary.xml.gz.sign primary.xml.gz
gpg: 20091224091101秒 JSTにDSA鍵ID 517D0F0Eで施された署名
gpg: “Linux Kernel Archives Verification Key <ftpadmin@kernel.org>”からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E

一応正しい署名ということになりました。

でも、エラーの原因は前述のとおりなので、結局「Error performing checksum」エラーは解決しませんでした。