安装Debian软件时Hash校验和或文件大小不符等问题
2015-08-02 20:35:23 阿炯

主要表现在;
# apt-get install p7zip-full p7zip
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
p7zip 已经是最新的版本。
建议安装的软件包:
  p7zip-rar
下列【新】软件包将被安装:
  p7zip-full
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 16 个软件包未被升级。
需要下载 914 kB 的软件包。
解压缩后会消耗掉 3,901 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://ftp.sjtu.edu.cn/debian/ jessie/main p7zip-full amd64 9.20.1~dfsg.1-4.1 [914 kB]
下载 903 kB,耗时 0秒 (2,163 kB/s)
E: 无法下载 http://ftp.sjtu.edu.cn/debian/pool/main/p/p7zip/p7zip-full_9.20.1~dfsg.1-4.1_amd64.deb  大小不符

E: 有几个软件包无法下载,您可以运行 apt-get update 或者加上 --fix-missing 的选项再试试?

真的是我所使用的安装源有问题,当然换成163的源时,能解决这个问题,但安装其它软件包时又会出现上述的问题。这是为什么呢?这个问题其实有两部分原因, 一是网络, 另外一个压缩格式的问题。解决方法也有两种:

一、压缩格式的问题

1、/var/lib/apt/lists, 把lists这个目录下的内容备份一下,清空该目录, 然后执行apt-get update

2、这种是压缩格式造成的问题, 在/etc/apt.conf.d/00aptitude文件中,(如果没有则自建)的最后一行添加如下内容(不要漏掉分号):
Acquire::CompressionTypes::Order "gz";

然后使用apt重新更新。

3、如果还是不行的话, 查看一下你的source.list文件中,是否包含有源代码的源,如果有的话先注释掉,也可以解决这个问题了。 这个问题在163、sohu、中科大这些国内源都发现了这个问题,如果把源代码的源带上就会出现以上问题。

二、网络问题

确切的话是你的isp的问题,他们使用了缓存技术。我还真不信我的大Debian源管理这么差。

现在我用的长城宽带,时不进就会碰到hash mismatch的问题,但是每次我都是多试几次就好了。要是还是不行,就等一段时间再试几次。

ISP在他们的cache里缓存了文件,当源中的该文件更新之后,ISP的缓存并没有更新,而由于文件名相同,下载时ISP以为还是请求的那个文件,就下载了旧的。好ISP没能及时检查原始位置的文件有没有变化,若有变化及时更新缓存。

好的我们有用技术手段来突破这种讨厌的提高体验而忽视功能的伪宽带。即使用代理来跳过这种http请求。

可以通过下面两种方法为apt-get设置http代理

方法一、设置终端环境下的代理
这是一种临时的手段,如果您仅仅是暂时需要通过http代理使用apt-get,可以使用这种方式。在使用apt-get之前,在终端中输入以下命令(根据实际情况替换myproxyaddress和proxyport)。
export http_proxy=http://myproxyaddress:proxyport

如果想长时间使用这种代理方法,可在主目录下的.bashrc文件中添加两行。如果希望apt-get和其他应用程序如wget等都使用http代理,可以使用这种方式。
vim ~/.bashrc

.bashrc文件末尾添加如下内容(根据你的实际情况替换myproxyaddress和proxyport)。
http_proxy=http://myproxyaddress:proxyport
export http_proxy

保存文件。重新开启另一个终端。使用apt-get update或者任何您想用的网络工具测试代理。如果为了纠正错误而再次修改了配置文件,记得关闭终端并重新打开,否自新的设置不会生效。

方法二、直接设置apt的代理

这种方法要用到/etc/apt/文件夹下的apt.conf文件。如果您希望apt-get(而不是其他应用程序)一直使用http代理,您可以使用这种方式。
注意:某些情况下,系统安装过程中没有建立apt配置文件。下面的操作将视情况修改现有的配置文件或者新建配置文件。
vim /etc/apt/apt.conf

在您的apt.conf文件中加入下面这行(根据实际情况替换myproxyaddress和proxyport)。
Acquire::http::Proxy "http://myproxyaddress:proxyport";

登录代理服务器
如果代理服务器需要登录,那么可以在指定代理服务器地址的时候,用如下格式(根据情况把username,password, myproxyaddress和proxyport替换为相应内容):
http_proxy=http://username:password@myproxyaddress:proxyport

另外,提供一个国内的代理来源:http://pachong.org/

下面的简单的处理过程:
root@freeoa:~# http_proxy=http://183.207.229.138:9000
root@freeoa:~# export http_proxy
root@freeoa:~# apt-get install p7zip-full p7zip
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
p7zip 已经是最新的版本。
建议安装的软件包:
  p7zip-rar
下列【新】软件包将被安装:
  p7zip-full
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 16 个软件包未被升级。
需要下载 914 kB 的软件包。
解压缩后会消耗掉 3,901 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://ftp.sjtu.edu.cn/debian/ jessie/main p7zip-full amd64 9.20.1~dfsg.1-4.1 [914 kB]
下载 914 kB,耗时 1秒 (463 kB/s)    
正在选中未选择的软件包 p7zip-full。
(正在读取数据库 ... 系统当前共安装有 38163 个文件和目录。)
正准备解包 .../p7zip-full_9.20.1~dfsg.1-4.1_amd64.deb  ...
正在解包 p7zip-full (9.20.1~dfsg.1-4.1) ...
正在处理用于 man-db (2.7.0.2-5) 的触发器 ...
正在设置 p7zip-full (9.20.1~dfsg.1-4.1) ...