今天在某一台 Ubuntu 18.04.1 LTS 主機上執行 apt update
更新套件來源資訊,不過卻一直發生 Hash Sum mismatch 的錯誤,一度懷疑 Ubuntu 的套件來源發生問題,浪費了十幾分鐘查問題,到最後竟然是換了 ISP 線路才正常。
錯誤訊息
apt update
Get:21 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [526 kB]
Err:21 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
Hash Sum mismatch
Hashes of expected file:
- Filesize:525764 [weak]
- SHA256:e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
- SHA1:d589b82b10751d8c12cecedde103cce3b818c15c [weak]
- MD5Sum:e5bff5faf851cd2c241f048a42185eae [weak]
Hashes of received file:
- SHA256:7983fc1019239792f31690cfebe04116a15911c9c825055cfc884009b3f35028
- SHA1:72c2cf0fb90b19b66b2a2fb88102e4f9067ecdd6 [weak]
- MD5Sum:dd2a727af1900ed5293d7015f3130127 [weak]
- Filesize:525764 [weak]
Last modification reported: Tue, 19 Feb 2019 07:09:43 +0000
Release file created at: Tue, 19 Feb 2019 11:15:50 +0000
你也可以透過以下命令,查出完整的下載內容或網址:
apt update -o Debug::Acquire::http=true
發生 Hash Sum mismatch 常見的處理方式
通常會有以下處理方式:
-
清空 APT 快取
sudo rm -rf /var/lib/apt/lists/*
sudo apt clean
sudo apt update
-
更換 Mirror 網址
也有可能是特定鏡像主機(Mirror Host)發生檔案異常,可以試試不同的鏡像主機位址。
-
切換不同的 ISP 線路
有些 ADSL 網路提供者會架設透明的代理伺服器(Transparent Proxy),以節省頻寬使用,可是這樣很有可能會讓用戶端快取到舊版的內容,導致 SHA256 雜湊不匹配,就會引發這個問題。
我這次的問題,就是將筆電的網路切換到手機的 4G 線路才正常!
追查錯誤
我後來查出是以下檔案的內容不一樣了:
http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/binary-amd64/by-hash/SHA256/e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
首先,我先嘗試透過 SHA256 檢查檔案雜湊值,只要雜湊值不一樣,就會引發 Hash Sum mismatch 的問題。
wget -q http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/binary-amd64/by-hash/SHA256/e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
sha256sum e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
rm -f e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
這段命令的執行結果,必須完全等同於檔名,才是驗證正確的檔案內容。
e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0 e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
但我家中的 ADSL 網路,卻出現以下結果:
7983fc1019239792f31690cfebe04116a15911c9c825055cfc884009b3f35028 e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
確定下載的檔案不一樣,接著就要看檔案內容差異了。
我用不同網路下載相同檔案,並透過 xz
進行解壓縮,下載與解壓縮的命令如下:
curl -L -o e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0.xz http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/binary-amd64/by-hash/SHA256/e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
xz -d e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0.xz
比對兩個網路下載的檔案後發現,內容真的不太一樣,如下圖示:
差異的部分相當詭異,只有 Phased-Update-Percentage
的部分有變化,這部分可以從 PhasedUpdates - Ubuntu Wiki 了解是什麼玩意。無法通過 SHA256 驗證的版本,其 Phased-Update-Percentage
數值較小,能通過 SHA256 驗證的版本,其數值較大。
不過這看起來不像 Proxy Server 會發生的問題,因為如果他快取到舊版內容,照理說檔名不會是這個名字,因為檔名必須等於 SHA256 雜湊後的值才對,怎麼會是這個值?如果是 ISP 造成的,為什麼我的 ISP 要修改這個檔案內容?我目前尚無法解釋這問題是怎樣造成的,如果有知道原因的人,麻煩留言給我,謝謝!
相關連結