解决apt-get安装过程中出现的Size mismatchHash Sum mismatch问题。

事情起因

我从单位复制了一个Virtualbox虚拟机(ubuntu 15.04 Desktop)回来,准备装个git,在家里的MAC上搭建一个工作环境。结果,在第一步

  1. $ sudo aptget update

的时候,就出现了Hash Sum mismatch错误。没有管,接着

  1. $ 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代理:

  1. $ sudo apt-get install polipo
  2. $ sudo service polipo stop
  3. $ sudo polipo socksParentProxy=localhost:1080

之后,即可以通过以下命令,通过代理更新了:

  1. $ 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中,打开多个可能相关的配置项:

  1. Debug::Acquire::http true;
  2. Debug::pkgAcquire::Auth true;
  3. Debug::Hashs true;

$ sudo apt-get update的输出中,搜索:http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/Packages,找到了以下内容:

  1. Get:1 http://security.ubuntu.com vivid-security/main amd64 Packages [115 kB]
  2. 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
  3. RecivedHash: SHA256:0460b45fe9ace5ddb1e2080df5f75a6ee5d950fa451733991ec1b2b303bd16f6
  4. ExpectedHash: SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
  5. 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
  6. RecivedHash: SHA256:f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace
  7. ExpectedHash: SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
  8. http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/Packages: Computed Hash: SHA256:f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace Expected Hash: SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61
  9. 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
  10. Host: security.ubuntu.com
  11. Cache-Control: max-age=0
  12. Range: bytes=5195-
  13. If-Range: Mon, 28 Sep 2015 14:33:00 GMT
  14. User-Agent: Debian APT-HTTP/1.3 (1.0.9.7ubuntu4)

从上可以分析出,正确文件为

  1. SHA256:9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61

而收到的,一个是

  1. SHA256:0460b45fe9ace5ddb1e2080df5f75a6ee5d950fa451733991ec1b2b303bd16f6

一个是

  1. SHA256:f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace

用浏览器打开http://security.ubuntu.com/ubuntu/dists/vivid-security/main/binary-amd64/,分别下载Packages.bz2Packages.gz,并分别解压。

  1. $ sha256sum Packages*
  2. 0460b45fe9ace5ddb1e2080df5f75a6ee5d950fa451733991ec1b2b303bd16f6 Packages.bz2
  3. f10f6ef0486182bc9369e7912ddb9cf536c3049813ffd169b84f34dcda540ace Packages.from.bz2
  4. 9daf23b84605ff833d1d280f837bd87fcbc3c7e0ca9403590985f970ee561f61 Packages.from.gz
  5. b6b70b8f7838d742104904d461677652cf5120f9b8302841cb017c0c5c9dea40 Packages.gz

显然,Packages.gz包含了正确的文件,而Packages.bz2中是错误的文件,而默认下载了Packages.bz2。于是,在apt.conf设置Acquire::CompressionTypes::Order::,优先下载Packages.gz

  1. Acquire::CompressionTypes::Order:: "gz";
  2. Debug::Acquire::http true;
  3. Debug::pkgAcquire::Auth true;
  4. 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/

记一次apt-get无法安装git的问题的更多相关文章

  1. centos7安装git踩坑记

    之前自己是按照Git 服务器搭建这篇博客来安装git服务器的,一步步顺序下来,但git clone的时候,每次都要求输入密码.说好的SSH免密登录呢.前后搞了一天多才搞定,现在记录下踩过的坑. 坑1: ...

  2. linux(centos)下安装git并上传代码

    cat /etc/redhat-release   查看系统版本信息 >>CentOS Linux release 7.4.1708 (Core) 背景:我已经注册了github账号,之前 ...

  3. 在腾讯云的ubuntu服务器上面安装git服务器

    GitHub是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用.搭建Git服 ...

  4. Ubuntu 16.04安装Git及GUI客户端

    1.通过APT源安装Git命令行工具 这里不建议通过源码进行安装,增加复杂程度,且最新版本的Git在各个方面都会修复,不至于出现不能用的状态. sudo add-apt-repository ppa: ...

  5. 源码编译安装git

    debian上的git版本才2.1有点低了,为了安装最新版的2.11,我决定从源码编译安装一下. 预备工作: 1.安装编译工具.apt install -y  build-essential 2.安装 ...

  6. 在Ubuntu 18.04上安装Git

    步骤1.首先,通过运行以下命令确保您的系统和apt包列表完全更新: apt-get update -yapt-get upgrade -y 第2步.在Ubuntu 18.04上安装Git. 现在让我们 ...

  7. 【Git】2、Linux快速安装Git环境 & oh-my-zsh

    Linux快速安装Git环境 文章目录 Linux快速安装Git环境 1.Linux安装Git 2.安装zsh 3.安装oh-my-zsh 3.1.安装oh-my-zsh 3.2. 测试验证 4.小结 ...

  8. 如何在Ubuntu 18.04安装Git

    在Ubuntu 18.04安装Git 更新apt包列表 apt-get update -y apt-get upgrade -y 安装Git: apt install git 检查Git版本 git ...

  9. 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net

    1. 注册一个账号和创建项目 先在git.oschina.net上注册一个账号和新建一个project ,如project name 是"myTest". 2.安装git sudo ...

随机推荐

  1. HttpClient(4.3.5) - HTTP Protocol Interceptors

    The HTTP protocol interceptor is a routine that implements a specific aspect of the HTTP protocol. U ...

  2. AngularJS Tabular Data with Edit/Update/Delete

    效果 首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据 var app = angular.module('plunker', ['ui.bootstrap']); app.control ...

  3. 【网络收集】MySql中IS NOT NULL与!=NULL的区别

    在mysql中,筛选非空的时候经常会用到is not null和!=null,这两种方法单从字面上来看感觉是差不多的,其实如果去运行一下试试的话差别会很大!为什么会出现这种情况呢?null 表示什么也 ...

  4. win2003域控制器密码遗忘如何修改

    在公司遇到这么个事儿,员工搭建QC服务器,设置了域账户登陆系统.但忘记了登录密码,使用PE直接修改sam文件不好用.   1.使用PE进系统修改组登陆方式的账号administrator密码 需符合复 ...

  5. <转载>批处理之FOR语句祥解

    批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...

  6. oracle11g 创建用户并授权

    Oracle创建用户并给用户授权查询指定表或视图的权限用sys账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAUL ...

  7. 创建Mysql 序列

    create table sequence( name ) not null primary key, current_value , increment , max_value BIGINT, -- ...

  8. Objective-C 【单个对象内存管理(野指针&内存泄露)】

    ------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...

  9. UEditor上传图片等附件都出现红叉

    我的环境: vs2010+netframework3.5+ueditor1_3_5-utf8-net 问题:UEditor上传图片等附件都出现红叉 尝试了网络上各种方法都不对, 后来只能自己看下ima ...

  10. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...