更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#1

帖子 astolia » 2014-10-31 10:14

如果只是偶尔出现Hash校验和不符(Hash Sum Mismatch),则可能是所用的源正在和官方同步,如果一直出现,并且出问题的总是那固定的几个文件,就不是源的问题了

世界上有一种东西叫缓存服务器: http://baike.baidu.com/view/2396471.htm
有些网络服务商,特别是一些小区网络的服务商,为了减少流量费用和提高对常见网络资源的访问速度,很多都搞了这么个东西出来

但是他们的缓存策略有问题,只比对文件路径,不考虑域名/IP地址,也没怎么考虑过文件内容更新后的同步,即缓存服务器上的内容和实际文件的内容可能不一致。

即对于http://example.com/a/b/c.dat这么一个文件,如果被收入缓存,那么你访问其他任意域名下的/a/b/c.dat文件都会去读取被缓存的文件。如果http://example.com/a/b/c.dat有了改变,缓存服务器上的对应文件不一定能跟着更新。

而ubuntu大部分源的文件路径是一致的,所以如果163源中的 http://mirrors.163.com/ubuntu/dists/tru ... ources.bz2 被收入缓存,那么你访问官方源 http://archive.ubuntu.com/ubuntu/dists/ ... ources.bz2 时,由于路径都是/ubuntu/dists/trusty/main/source/Sources.bz2,还是获取的是缓存服务器上的缓存文件。这个可用wget验证。如果缓存服务器上文件过时了,就会出现Hash Sum Mismatch。

解决方法呢有这么几个
1、换用路径不同的源。
https://launchpad.net/ubuntu/+archivemirrors 中按地区列出了世界上所有在官方有注册的源,可以自己点进去看看。比如 https://launchpad.net/ubuntu/+mirror/mirror.anl.gov 中就可以看到它的路径不是一般的/ubuntu,而是/pub/ubuntu/,就有可能没被你当地的缓存服务器收入。这种源大多都是国外大学所有,国内访问最快的可能就是香港中文大学源了 http://ftp.cuhk.edu.hk/pub/Linux/ubuntu/

2、更换源路径。
大部分源都有一个指向自身的软链接,比如打开阿里云的源 http://mirrors.aliyun.com/ubuntu/ ,里面有个ubuntu目录,点进去内容是一样的。这样就给了我们一个绕开缓存服务器的方法。
把sources.list中的http://mirrors.aliyun.com/ubuntu/改成http://mirrors.aliyun.com/ubuntu/ubuntu/,或者后面还可以再深几层http://mirrors.aliyun.com/ubuntu/ubuntu/ubuntu/ubuntu/ubuntu/,一般就没有被缓存服务器收录了
注意不是所有的源都会有那个ubuntu软链接,比如网易源就没有http://mirrors.163.com/ubuntu/

3、通过代理服务器访问。
设置环境变量http_proxy就可以让apt-get或apt等命令行工具使用http代理了,新立得可以直接在选项中设置。

4、换协议。
缓存服务器一般都只针对http协议,而apt支持更多种网络协议,比如ftp和https(旧系统需要先安装 apt-transport-https 软件包)。所以我们可以将源地址由http换成ftp或https来避免缓存服务器的干扰。同样可以在 https://launchpad.net/ubuntu/+archivemirrors 中查看是否支持ftp或其他网络协议。国内的源很多只支持http协议,目前我看到支持ftp协议的国内源有:
上交大源 ftp://ftp.sjtu.edu.cn/ubuntu/
首都在线源 ftp://mirrors.yun-idc.com/ubuntu/
中科大源 ftp://mirrors.ustc.edu.cn/ubuntu/
支持https的国内源有:
上交大源 https://ftp.sjtu.edu.cn/ubuntu/
中科大源 https://mirrors.ustc.edu.cn/ubuntu/
清华大学源 https://mirror.tuna.tsinghua.edu.cn/ubuntu/

5、让apt使用hash路径。
如果看过man sources.list,就会发现完整的源描述是这样的:
deb [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]
注意看中间有个optionX可以设置参数。而从1.1~exp13版的apt开始(即从ubuntu 16.04开始),可以设置一个by-hash参数,这样一来,apt就不会再去使用一成不变的类似http://archive.ubuntu.com/ubuntu/dists/xenial/universe/binary-i386/Packages.xz 这样的地址,而是http://archive.ubuntu.com/ubuntu/dists/xenial/universe/binary-i386/by-hash/SHA256/39ce703208f057a0912d1678606080840f36bf7af6d7366d5b065a171f8c170a 这样带有hash码的地址了。由于每一次文件更新,hash码基本不可能保持不变,也就避免了校验不符的问题。具体的设置方法是将

代码: 全选

deb http://archive.ubuntu.com/ubuntu/ xenial main
改成

代码: 全选

deb [by-hash=yes] http://archive.ubuntu.com/ubuntu/ xenial main
这种样子,即中间加一个[by-hash=yes]。同样并非每一个镜像源都支持hash路径。目前看到的支持hash路径的常用的国内源有
阿里云源 http://mirrors.aliyun.com/ubuntu/
上交大源 http://ftp.sjtu.edu.cn/ubuntu/
中科大源 http://mirrors.ustc.edu.cn/ubuntu/
首都在线源 http://mirrors.yun-idc.com/ubuntu/
等等

值得一提的是,缓存服务器的收录标准一般还会看文件大小(太大太小都不会收录)以及文件访问的频繁度,所以如果你使用的是上面的1或2号方法,则不要太过频繁的更新。

综合而言,优先推荐上面第4种或第5种方案。

===========================================================

附注:有些新手不知道如何修改源配置文件,这里简单说一下。
主要源配置文件的路径是/etc/apt/sources.list,第三方源的配置文件一般放在/etc/apt/sources.list.d目录下,所有版本的ubuntu系统都是一样,用一般的文本编辑器以root权限打开编辑即可。比如对于gnome/unity桌面环境默认的gedit文本编辑器,可以在终端或者按Alt+F2,执行

代码: 全选

pkexec gedit /etc/apt/sources.list
输入你用户的密码就可以编辑了。文件中以#开头的行是注释,不用去管。建议修改前先对原文件进行备份,免得改错了。
如果是第三方软件的源,可以直接执行系统中默认安装的图形界面的源编辑器 software-properties-gtk,按上面第1、2、4种方法修改源路径。但它目前还不支持设置源参数,所以第5种方法只能自己手动编辑源配置文件。
上次由 astolia 在 2017-08-04 11:49,总共编辑 18 次。
头像
lhw828
帖子: 2797
注册时间: 2007-03-15 16:58
来自: 湖北武汉
联系:

Re: 更新源时总是出现Hash Sum Mismatch的原因以及解决方案

#2

帖子 lhw828 » 2014-11-01 22:18

方法很到位
niba
帖子: 9
注册时间: 2017-08-01 9:49
系统: ubuntu14.04

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#3

帖子 niba » 2017-08-03 11:37

第5中请问要怎么改?我是菜鸟,请详细指点。。。跪求
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#4

帖子 astolia » 2017-08-03 13:52

niba 写了:第5中请问要怎么改?我是菜鸟,请详细指点。。。跪求
写在最后的附注里了
niba
帖子: 9
注册时间: 2017-08-01 9:49
系统: ubuntu14.04

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#5

帖子 niba » 2017-08-03 14:56

我用的是Ubuntu14.04,可以吗?另外怎么备份啊
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#6

帖子 astolia » 2017-08-03 20:03

niba 写了:我用的是Ubuntu14.04,可以吗?另外怎么备份啊
我上面不是写了第五种办法只适用于16.04以及之后的系统吗?莫非阁下是星际玩家?对sources.list文件的修改所有系统版本都是一样的。
备份就是复制一下修改之前的文件到其他地方呗
niba
帖子: 9
注册时间: 2017-08-01 9:49
系统: ubuntu14.04

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#7

帖子 niba » 2017-08-04 8:10

astolia 写了:
niba 写了:我用的是Ubuntu14.04,可以吗?另外怎么备份啊
我上面不是写了第五种办法只适用于16.04以及之后的系统吗?莫非阁下是星际玩家?对sources.list文件的修改所有系统版本都是一样的。
备份就是复制一下修改之前的文件到其他地方呗
我是菜鸟,无奈要学习ROS,但是怎么也装不上,卡在sudo apt-get update这里,求教,我把错误和仓库配置贴在下面
附件
3.png
2.png
1.png
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#8

帖子 astolia » 2017-08-04 11:24

ros的官方源虽然支持https,但证书有问题还是没法用。不过幸好ros的镜像源很多,国内也有不少支持https的镜像源,比如中科大的
先安装apt-transport-https 软件包,

代码: 全选

sudo apt-get install apt-transport-https
然后导入ros源的公钥,目前的公钥是5523BAEEB01FA116,

代码: 全选

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5523BAEEB01FA116
最后在你上面第二个图里面,选择ros那行点编辑,把URI改成https://mirrors.ustc.edu.cn/ros/ubuntu/,然后重新update就行了
niba
帖子: 9
注册时间: 2017-08-01 9:49
系统: ubuntu14.04

Re: 更新源时总是出现Hash校验和不符(Hash Sum Mismatch)的原因以及解决方案

#9

帖子 niba » 2017-08-04 20:04

astolia 写了:ros的官方源虽然支持https,但证书有问题还是没法用。不过幸好ros的镜像源很多,国内也有不少支持https的镜像源,比如中科大的
先安装apt-transport-https 软件包,

代码: 全选

sudo apt-get install apt-transport-https
然后导入ros源的公钥,目前的公钥是5523BAEEB01FA116,

代码: 全选

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5523BAEEB01FA116
最后在你上面第二个图里面,选择ros那行点编辑,把URI改成https://mirrors.ustc.edu.cn/ros/ubuntu/,然后重新update就行了
i

结果还是一样,不知道是不是网络的问题。还是要特别感谢您的耐心指点。?
回复