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 があるようなので、こちらを使うことに。
- python hashlib ≪ journal/notes
- yum, createrepo, hashlib, rhel5/centos5 and sha256sums ≪ journal/notes
で、冒頭の解決方法
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: 2009年12月24日 09時11分01秒 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: 2009年12月24日 09時11分01秒 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」エラーは解決しませんでした。