世界上有一种东西叫缓存服务器: 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,就会发现完整的源描述是这样的:
注意看中间有个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 [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]
代码: 全选
deb http://archive.ubuntu.com/ubuntu/ xenial main
代码: 全选
deb [by-hash=yes] http://archive.ubuntu.com/ubuntu/ xenial main
阿里云源 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种方法只能自己手动编辑源配置文件。