记一次apt-get无法安装git的问题
解决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
,成功!