Latest News

Home » Linux主機伺服器 » 解決Metadata file does not match checksum錯誤

解決Metadata file does not match checksum錯誤

 解決Metadata file does not match checksum錯誤

在使用yum更新包的時候,常報下面的錯誤:
引用
Reading repository metadata in from local files
primary.xml.gz            100% |=========================| 1.7 MB    02:25
http://www.mirrorservice.org/sites/apt.sw.be/redhat/el4/en/i386/dag/repodata/primary.xml.gz:
[Errno -1] Metadata file does not match checksum
Trying other mirror.

   有時候當置換了幾個對映後就可以了。但經常也會發現最終是失敗的。由於我的系統是依賴yum更新的,若使用國外網路源的時候出這樣的問題,影響挺大的。
   Google搜尋了一下,是一個常見問題,也提供了一些方法。只是後來發現,這些方法要不就是沒有說清楚,要不就是誤解。經由測試,最終基本可以解決了。

一、原因
從該位址找到一段說明:點擊
引用
To reduce load, download.fedora.redhat.com (official host) contains the ~1kB checksum for the metadata. The metadata (usually ~1 – 2 MB) is downloaded off mirrors. After downloading metadata, Yum compares the two to make sure they're one and the same.
Now, think of this: download.fedora.redhat.com updates their metadata and checksums, so you're getting the new checksum. The mirror's cronjobs havn't gone yet, therefore no synching and the metadata isn't the newest, it doesn't match.

The solution is not to makecache; Although it may help it will take forever and still not 100% solve the problem. The main problem is not giving the mirrors enough synch time. Typically, cron runs every hour, and give it a bit of time to download the changes, so I'd say try running maybe 10 minutes after an hour and you'll have no problem (eg 3:10, 4:10, 5:10, etc…). If you get closer to :50 (3:50, :50, etc) you'll start seeing more syncing issues.

Again, this too isn't 100% perfect but more of a guideline. There's a lot of guesswork…

大概的意思是說:
引用
當 生成metadata資料的時候,會一同產生校驗資料。而傳輸的時候,會用該校驗資料判斷metadata是否完整。這時候就會產生一個問 題,mirror對映當從源網路覆制資料回來時,下載了metadata,但還沒下載校驗資料(或由定時任務產生校驗資料,但這時定時任務還沒有執行)。 這時,如果剛好你正使用yum從該對映更新,就會發生Metadata file does not match checksum的問題了。
文中提供的解決方法是,根據大部分的對映都是每小時進行一次資料同步或生成校驗資料的,所以,不要選取接近整點的時候更新資料,而應選取整點過後再更新。但這只是建議,不能保證一定能解決該問題。

參考該文章的內容,我們可以看看yum更新下載的資料: /var/cache/yum,根據你定義的repo.d檔案內容,會分開多層目錄,每層代表一個更新路徑。
引用
例如:/var/cache/yum/rpmforge
其中,primary.xml.gz、filelists.xml.gz、和other.xml.gz就是metadata訊息,而repomd.xml就是校驗資料。其使用的是sha1進行校驗的。

找到原因,解決就不難了。

二、解決
1、清理快取
執行:
# yum clean all

先把就的快取資料都去掉。

2、下載metadata和校驗資料
先進入yum對應的目錄,再下載:
# cd /var/cache/yum/rpmforge
# wget –cache=off http://apt.sw.be/redhat/el4/en/i386/dag/repodata/repomd.xml
# wget –cache=off http://apt.sw.be/redhat/el4/en/i386/dag/repodata/primary.xml.gz
# wget –cache=off http://apt.sw.be/redhat/el4/en/i386/dag/repodata/filelists.xml.gz
# wget –cache=off http://apt.sw.be/redhat/el4/en/i386/dag/repodata/other.xml.gz

3、校驗資料
執行:
引用
# sha1sum other.xml.gz filelists.xml.gz primary.xml.gz
74fcc9f9e218cfdbc1ac2b5ac17ff7d912267bdf  other.xml.gz
3f4b2e9a5efc67c0cdf329c69f041daa82a2346c  filelists.xml.gz
bd2033e1fd7a7d1f1b92ce7b880919bd685217f8  primary.xml.gz

對照repomd.xml中的訊息:
引用
# cat repomd.xml |grep -w 'checksum'|grep -v 'open-checksum'
   <checksum type="sha">74fcc9f9e218cfdbc1ac2b5ac17ff7d912267bdf</checksum>
   <checksum type="sha">3f4b2e9a5efc67c0cdf329c69f041daa82a2346c</checksum>
   <checksum type="sha">bd2033e1fd7a7d1f1b92ce7b880919bd685217f8</checksum>

若資料正確,則說明metadata和校驗資料是符合的。可以使用yum更新了,不會再重新下載metadata。
否則,可以再等待一下,或需要從其他的對映取得更新咯。

三、建議
因為我們不能控制對映更新的速度和時間,而我們的工作只是避免了yum可能發生誤判的情況,但並不能完全保證上面的工作是完成的。
從盡可能避免該問題的角度出發,有幾個建議:
1、選取好的對映
設定yum.repos.d中baseurl或mirrorlist從好的對映下載。若知道某個對映速度快,則乾脆用baseurl固定,而不要使用mirrorlist了。

2、排查網路問題
網上提供的方法大部分是轉載這裡的。其建議使用–cache=off參數(表示不使用伺服器中的高速快取中的資料)。
但實際上,我發現除非網路有問題,否則是否使用該參數拿回來的資料不應該有有區別的。
如:
引用
# sha1sum primary.xml.gz*
bd2033e1fd7a7d1f1b92ce7b880919bd685217f8  primary.xml.gz
bd2033e1fd7a7d1f1b92ce7b880919bd685217f8  primary.xml.gz.1

※primary.xml.gz是使用–cache=off參數的,而primary.xml.gz.1是沒有使用該參數的。
所以,如果網路出現問題,是會影響到yum下載資料的完整性的。而使用–cache=off既然沒壞,不妨使用咯。

About

發佈留言