記一次apt-get無法安裝git的問題


解決apt-get安裝過程中出現的Size mismatchHash 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的緩存的建議,仍也不起作用。

上述問題包括:

  1. 更新時的Hash Sum mismatch問題
  2. 安裝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安裝這個方法,不可取,如果文件多了就很麻煩,所以研究怎么才能不重定向。

  1. 首先想到的是,利用https,搜索結果發現所有的源都不支持https,失敗。
  2. 在man apt.conf中,看到Acquire::http::AllowRedirect選項,開啟之后,發現其他的文件也無法下載成功了,實際還是返回了重定向,而這個選項禁止重定向,導致所有文件都無法下載了,失敗。
  3. 研究使用代理。在折騰半天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.bz2Packages.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,成功!

參考

  1. http://askubuntu.com/questions/673647/how-can-i-troubleshoot-apt-get-update-giving-hash-sum-mismatch
  2. http://www.woonchao.com/2015/08/29/hash/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM