解決apt-get安裝過程中出現的Size mismatch
和Hash Sum mismatch
問題。
事情起因
我從單位復制了一個Virtualbox虛擬機(ubuntu 15.04 Desktop)回來,准備裝個git,在家里的MAC上搭建一個工作環境。結果,在第一步
$ sudo apt-get update
的時候,就出現了Hash Sum mismatch
錯誤。沒有管,接着
$ sudo apt-get install git
結果下載git-man_2.1.4-2.1_all.deb
時,出現了Size mismatch
錯誤,下載文件的大小是1266150。一開始我以為是源出現了問題,連續換了幾個源都不起作用,接着在網上看到清空apt的緩存的建議,仍也不起作用。
上述問題包括:
- 更新時的
Hash Sum mismatch
問題 - 安裝git時的
Size mismatch
問題
首先研究問題2
沒辦法,開始研究apt的Debug方法,終於找到了一個選項Debug::Acquire::http
,開啟之后,發現無論是我將源設置為archive.ubuntu.com
還是us.archive.ubuntu.com
,在下載的時候都會返回一個302的重定向,重定向到一個類似以下格式的地址http://124.205.69.167/files/1056000001BCA2E4/mirrors.163.com/ubuntu/pool/main/g/git/git-man_2.1.4-2.1_all.deb
,猜測實際文件是從mirrors.163.com
下載的,於是打開http://mirrors.163.com/ubuntu/pool/main/g/git/
,顯示git-man_2.1.4-2.1_all.deb
的大小是684k,明顯與前面下載的不符,於是手工下載一個,發現mirrors.163.com
上的該文件實際大小就是1266150。
到此,可以推斷:應該下載的是一個684K大小的文件,而實際下載了一個1266150大小的文件,所以導致安裝不成功。
接下來找解決辦法。首先,打開http://archive.ubuntu.com/ubuntu/pool/main/g/git/
,同樣顯示git-man_2.1.4-2.1_all.deb
的大小是684k,手工下載,查看大小是700438,明顯這個應該是正確的文件。於是,下載這個文件,利用dpkg安裝,然后再執行sudo apt-get install git
,成功。猜測如果放到/var/cache/apt/archives
,再進行安裝,應該也能成功,不過沒有試。
首先,為什么我制定的國外源會重定向到mirrors.163.com
? 搜索發現可能的原因是我的網絡運營商為ubuntu源做了優化,將國外源重定向到了mirrors.163.com
,而該源的部分文件時與主源不一致。
如何才能不重定向? 感覺把源文件下載下來,用dpkg安裝這個方法,不可取,如果文件多了就很麻煩,所以研究怎么才能不重定向。
- 首先想到的是,利用https,搜索結果發現所有的源都不支持https,失敗。
- 在man apt.conf中,看到
Acquire::http::AllowRedirect
選項,開啟之后,發現其他的文件也無法下載成功了,實際還是返回了重定向,而這個選項禁止重定向,導致所有文件都無法下載了,失敗。 - 研究使用代理。在折騰半天SS之后,依然失敗,原因應該是SS是Socks代理,而apt-get需要的是http代理,失敗。猜測如果有http代理,這個辦法應該也能起作用。
更新:
將SS轉為HTTP代理:
$ sudo apt-get install polipo
$ sudo service polipo stop
$ sudo polipo socksParentProxy=localhost:1080
之后,即可以通過以下命令,通過代理更新了:
$ sudo http_proxy=http://localhost:8123 apt-get update
不過,問題1依然存在。 4. 最后,在絕望的時刻,想起了在man apt.conf
中出了http和https的選項,還有ftp,搜索發現archive.ubuntu.com
就支持ftp,於是,將源文件中的http都換成ftp,安裝,成功。
接着研究問題1
首先,試了前文的ftp協議,依然失敗。分析可能是與這個情況一致:http://askubuntu.com/questions/673647/how-can-i-troubleshoot-apt-get-update-giving-hash-sum-mismatch,后續繼續跟蹤該問題。
更新:
又仔細研究了一下,從第一個出現問題的鏈接開始:http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/Packages
。
首先,在apt.conf
中,打開多個可能相關的配置項:
Debug::Acquire::http true;
Debug::pkgAcquire::Auth true;
Debug::Hashs true;
在$ sudo apt-get update
的輸出中,搜索:http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/Packages
,找到了以下內容:
Get:1 http://security.ubuntu.com vivid-security/main amd64 Packages [115 kB]
100% [1 Packages 115 kB/115 kB 100%] [Waiting for headers] [Connecting to security.ubuntu.com (91.189.91.15)]201 URI Done: http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/Packages.bz2
RecivedHash: SHA256:0460b45fe9ace5ddb1e2080df5f75a6ee5d950fa451733991ec1b2b303bd16f6
ExpectedHash: SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
100% [1 Packages bzip2 0 B] [Waiting for headers] [Connecting to security.ubuntu.com (91.189.91.15)]201 URI Done: bzip2:/var/lib/apt/lists/partial/security.ubuntu.com_ubuntu_dists_vivid-security_main_binary-amd64_Packages.bz2
RecivedHash: SHA256:f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace
ExpectedHash: SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/Packages: Computed Hash: SHA256:f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace Expected Hash: SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
100% [Waiting for headers] [Connecting to security.ubuntu.com (91.189.91.15)]GET /ubuntu/dists/vivid-security/multiverse/binary-amd64/Packages.bz2 HTTP/1.1
Host: security.ubuntu.com
Cache-Control: max-age=0
Range: bytes=5195-
If-Range: Mon, 28 Sep 2015 14:33:00 GMT
User-Agent: Debian APT-HTTP/1.3 (1.0.9.7ubuntu4)
從上可以分析出,正確文件為
SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
而收到的,一個是
SHA256:0460b45fe9ace5ddb1e2080df5f75a6ee5d950fa451733991ec1b2b303bd16f6
一個是
SHA256:f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace
用瀏覽器打開http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/
,分別下載Packages.bz2
和Packages.gz
,並分別解壓。
$ sha256sum Packages*
0460b45fe9ace5ddb1e2080df5f75a6ee5d950fa451733991ec1b2b303bd16f6 Packages.bz2
f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace Packages.from.bz2
9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61 Packages.from.gz
b6b70b8f7838d742104904d461677652cf5120f9b8302841cb017c0c5c9dea40 Packages.gz
顯然,Packages.gz
包含了正確的文件,而Packages.bz2
中是錯誤的文件,而默認下載了Packages.bz2
。於是,在apt.conf
設置Acquire::CompressionTypes::Order::
,優先下載Packages.gz
。
Acquire::CompressionTypes::Order:: "gz";
Debug::Acquire::http true;
Debug::pkgAcquire::Auth true;
Debug::Hashs true;
再執行$ sudo apt-get update
,成功!