﻿# Ubuntu 18.04.1 LTS 執行 apt update 遇到 Hash Sum mismatch 的處理方式

今天在某一台 Ubuntu 18.04.1 LTS 主機上執行 `apt update` 更新套件來源資訊，不過卻一直發生 Hash Sum mismatch 的錯誤，一度懷疑 Ubuntu 的套件來源發生問題，浪費了十幾分鐘查問題，到最後竟然是換了 ISP 線路才正常。

### 錯誤訊息

```bash
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
```

你也可以透過以下命令，查出完整的下載內容或網址：

```bash
apt update -o Debug::Acquire::http=true
```

### 發生 Hash Sum mismatch 常見的處理方式

通常會有以下處理方式：

1.  清空 APT 快取
    
    ```bash
    sudo rm -rf /var/lib/apt/lists/*
    sudo apt clean
    sudo apt update
    ```
    
2.  更換 Mirror 網址
    
    也有可能是特定鏡像主機(Mirror Host)發生檔案異常，可以試試不同的[鏡像主機位址](https://web.archive.org/web/20220328105053/https://wiki.ubuntu-tw.org/index.php?title=%E5%A5%97%E4%BB%B6%E5%BA%AB%E4%BE%86%E6%BA%90)。
    
3.  切換不同的 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 的問題。

```bash
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` 進行解壓縮，下載與解壓縮的命令如下：

```bash
curl -L -o e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0.xz http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/binary-amd64/by-hash/SHA256/e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0
xz -d e084a46b59774b00b1513bc6760173cf8398756416523c1a38604a28ba7011d0.xz
```

比對兩個網路下載的檔案後發現，內容真的不太一樣，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/aa99713898773fd250cf-image_3182.png)

差異的部分相當詭異，只有 `Phased-Update-Percentage` 的部分有變化，這部分可以從 PhasedUpdates - Ubuntu Wiki 了解是什麼玩意。無法通過 SHA256 驗證的版本，其 `Phased-Update-Percentage` 數值較小，能通過 SHA256 驗證的版本，其數值較大。

不過這看起來不像 Proxy Server 會發生的問題，因為如果他快取到舊版內容，照理說檔名不會是這個名字，因為檔名必須等於 SHA256 雜湊後的值才對，怎麼會是這個值？如果是 ISP 造成的，為什麼我的 ISP 要修改這個檔案內容？我目前尚無法解釋這問題是怎樣造成的，如果有知道原因的人，麻煩留言給我，謝謝！

### 相關連結

-   [在Linux上执行apt-get update时出现 Hash Sum mismatch 错误的解决方法 – WEB骇客](http://www.webhek.com/post/linux-apt-get-update-hash-sum-mismatch-error.html)
-   [套件庫來源 - Ubuntu 正體中文 Wiki](https://web.archive.org/web/20220328105053/https://wiki.ubuntu-tw.org/index.php?title=%E5%A5%97%E4%BB%B6%E5%BA%AB%E4%BE%86%E6%BA%90)
-   PhasedUpdates - Ubuntu Wiki
